element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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 = legacy_1.RPTUtil.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 legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.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", "WCAG_2_1", "WCAG_2_0"],
+ "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 (!legacy_1.RPTUtil.isDataTable(ruleContext) || rows === null || rows.length === 0)
+ return null;
+ var passed = legacy_1.RPTUtil.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 legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/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 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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = legacy_1.RPTUtil.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 = legacy_1.RPTUtil.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 legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.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 and elements must be related via 'header' or 'scope' attributes"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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 = legacy_1.RPTUtil.getAncestor(ruleContext, "table");
+ // If this is a layout table or a simple table the rule does not apply.
+ if (parentTable == null || !legacy_1.RPTUtil.isComplexDataTable(parentTable))
+ return null;
+ // If this table hasn't been preprocessed, process it.
+ if ((0, CacheUtil_1.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];
+ (0, CacheUtil_1.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 (!legacy_1.RPTUtil.attributeNonEmpty(gridCell, "axis"))
+ lookup[(0, CacheUtil_1.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 (!legacy_1.RPTUtil.attributeNonEmpty(gridCell, "axis"))
+ lookup[(0, CacheUtil_1.getCache)(gridCell, "table_headers_related", null)] = true;
+ }
+ // Headers can refer to other headers
+ if (legacy_1.RPTUtil.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 && legacy_1.RPTUtil.getAncestor(headElem, "table") == parentTable) {
+ lookup[(0, CacheUtil_1.getCache)(headElem, "table_headers_related", null)] = true;
+ }
+ }
+ }
+ }
+ else if (gridNodeName == "td") {
+ if (rowScoped || scopedCols[j]) {
+ lookup[(0, CacheUtil_1.getCache)(gridCell, "table_headers_related", null)] = true;
+ }
+ else if (legacy_1.RPTUtil.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 && legacy_1.RPTUtil.getAncestor(headElem, "table") == parentTable) {
+ lookup[(0, CacheUtil_1.getCache)(gridCell, "table_headers_related", null)] = true;
+ lookup[(0, CacheUtil_1.getCache)(headElem, "table_headers_related", null)] = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ (0, CacheUtil_1.setCache)(parentTable, "table_headers_related", lookup);
+ }
+ var rcInfo = (0, CacheUtil_1.getCache)(ruleContext, "table_headers_related", null);
+ var tInfo = (0, CacheUtil_1.getCache)(parentTable, "table_headers_related", null);
+ var passed = rcInfo !== null && tInfo !== null && rcInfo in tInfo;
+ if (!passed && rcInfo === "0:0" &&
+ legacy_1.RPTUtil.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 ((0, CacheUtil_1.getCache)(parentTable, "table_headers_related_TrigOnce", false) === true) {
+ passed = true;
+ }
+ else {
+ (0, CacheUtil_1.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 legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = !legacy_1.RPTUtil.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 element",
+ "group": "Value for 'scope' attribute must be \"row\", \"col\", \"rowgroup\", or \"colgroup\""
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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 legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.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", "WCAG_2_1", "WCAG_2_0"],
+ "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 (legacy_1.RPTUtil.isDataTable(ruleContext))
+ return null;
+ if (legacy_1.RPTUtil.isNodeInGrid(ruleContext))
+ return null;
+ var errorNodes = [];
+ if (legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "summary"))
+ errorNodes.push(ruleContext);
+ var captionElems = ruleContext.getElementsByTagName("caption");
+ for (var i = 0; i < captionElems.length; ++i) {
+ if (legacy_1.RPTUtil.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 (legacy_1.RPTUtil.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 (legacy_1.RPTUtil.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 (legacy_1.RPTUtil.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")) &&
+ legacy_1.RPTUtil.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 (legacy_1.RPTUtil.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 legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.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", "WCAG_2_1", "WCAG_2_0"],
+ "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 += " " + legacy_1.RPTUtil.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 = legacy_1.RPTUtil.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/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 legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts");
+exports.text_block_heading = {
+ id: "text_block_heading",
+ context: "dom:p, dom:div, dom:br",
+ refactor: {
+ "RPT_Block_ShouldBeHeading": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "text_block_heading.html",
+ "Potential_1": "text_block_heading.html",
+ "group": "text_block_heading.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Check if this text should be marked up as a heading: {0}",
+ "group": "Heading text must use a heading element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var validateParams = {
+ numWords: {
+ value: 10,
+ type: "integer"
+ }
+ };
+ var ruleContext = context["dom"].node;
+ var numWords = validateParams.numWords.value;
+ var wordsSeen = 0;
+ var wordStr = [];
+ var emphasizedText = false;
+ var nw = new legacy_1.NodeWalker(ruleContext);
+ 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
+ {
+ var nwName = nw.node.nodeName.toLowerCase();
+ if ((nwName == "b" || nwName == "em" || nwName == "i" ||
+ nwName == "strong" || nwName == "u" || nwName == "font") && !legacy_1.RPTUtil.shouldNodeBeSkippedHidden(nw.node)) {
+ var nextStr = legacy_1.RPTUtil.getInnerText(nw.node);
+ var wc = legacy_1.RPTUtil.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 {
+ passed =
+ (nw.node.nodeType == 1 && legacy_1.RPTUtil.attributeNonEmpty(nw.node, "alt") &&
+ (nwName == "applet" || nwName == "embed" || nwName == "img" ||
+ (nwName === "input" && nw.elem().hasAttribute("type") && nw.elem().getAttribute("type") == "image")))
+ || (nwName === "#text" && nw.node.nodeValue.trim().length > 0)
+ // Give them the benefit of the doubt if there's a link
+ || (nwName === "a" && nw.elem().hasAttribute("href") && legacy_1.RPTUtil.attributeNonEmpty(nw.node, "href"));
+ }
+ }
+ if (wordsSeen == 0)
+ passed = true;
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RulePotential)("Potential_1", [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 legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+var ColorUtil_1 = __webpack_require__(/*! ../../v2/dom/ColorUtil */ "./src/v2/dom/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");
+//import { setCache } from "../util/CacheUtil";
+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_0",
+ "Fail_1": "Fail_1",
+ "Potential_1": "Potential_same_color"
+ },
+ "IBMA_Color_Contrast_WCAG2AA_PV": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_graphic_background"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "text_contrast_sufficient.html",
+ "Pass_0": "text_contrast_sufficient.html",
+ "Fail_1": "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 2.1 AA requirements",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "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 2.1 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 2.1 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 2.1 AA minimum requirements for text of size {1}px and weight of {2}"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ 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 (legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return null;
+ //skip elements
+ if (legacy_1.RPTUtil.getAncestor(ruleContext, ["svg", "script", "meta"]))
+ 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 = legacy_1.RPTUtil.getNodeText(ruleContext);
+ if (!legacy_1.RPTUtil.isShadowHostElement(ruleContext) || (legacy_1.RPTUtil.isShadowHostElement(ruleContext) && legacy_1.RPTUtil.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
+ */
+ var regex = /[^(a-zA-Z\d\s)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g;
+ var removed = childStr.trim().replace(regex, '');
+ if (removed.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 (legacy_1.RPTUtil.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= 24 || size >= 18.6 && weight >= 700;
+ var passed = ratio >= 4.5 || (ratio >= 3 && isLargeScale);
+ var hasBackground = colorCombo.hasBGImage || colorCombo.hasGradient;
+ var textShadow = colorCombo.textShadow;
+ var isDisabled = legacy_1.RPTUtil.isNodeDisabled(elem);
+ if (!isDisabled) {
+ var control = legacy_1.RPTUtil.getControlOfLabel(elem);
+ if (control) {
+ isDisabled = legacy_1.RPTUtil.isNodeDisabled(control);
+ }
+ }
+ if (!isDisabled && nodeName === 'label' && legacy_1.RPTUtil.isDisabledByFirstChildFormElement(elem)) {
+ isDisabled = true;
+ }
+ if (!isDisabled && ruleContext.hasAttribute("id") && legacy_1.RPTUtil.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]);
+ ;
+ }
+ 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]);
+ ;
+ }
+ 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_1", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]);
+ }
+ }
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0", [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 legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/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 or element: {0}",
+ "group": "Quotations should be marked with or elements"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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 (legacy_1.RPTUtil.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) &&
+ legacy_1.RPTUtil.getAncestor(walkNode, ignored) === null) {
+ if (dblQuotes != null) {
+ for (var i = 0; passed && i < dblQuotes.length; ++i)
+ passed = legacy_1.RPTUtil.wordCount(dblQuotes[i]) < minWords;
+ }
+ if (snglQuotes != null) {
+ for (var i = 0; passed && i < snglQuotes.length; ++i)
+ passed = legacy_1.RPTUtil.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 legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+exports.text_sensory_misuse = {
+ id: "text_sensory_misuse",
+ context: "dom:body, dom:body dom:*",
+ refactor: {
+ "RPT_Text_SensoryReference": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "text_sensory_misuse.html",
+ "Potential_1": "text_sensory_misuse.html",
+ "group": "text_sensory_misuse.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "If the word(s) '{0}' is part of instructions for using page content, check it is still understandable without this location or shape information",
+ "group": "Instructions must be meaningful without shape or location words"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.3"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var validateParams = {
+ sensoryText: {
+ value: ["top-left", "top-right", "bottom-right", "bottom-left",
+ "round", "square", "shape", "rectangle", "triangle",
+ "right", "left", "above", "below", "top", "bottom",
+ "upper", "lower", "corner", "beside"],
+ type: "[string]"
+ }
+ };
+ var ruleContext = context["dom"].node;
+ if (VisUtil_1.VisUtil.hiddenByDefaultElements.includes(ruleContext.nodeName.toLowerCase())) {
+ return null;
+ }
+ // Extract the nodeName of the context node
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ // In the case this is a style or link element, skip triggering rule as we do not want to scan
+ // CSS for sensory words, as there can be CSS keys which contain theses sensory text that is matching.
+ if (nodeName === "style" || nodeName === "link") {
+ return (0, IRule_1.RulePass)(1);
+ }
+ var violatedtextArray = null;
+ var violatedtext = null;
+ var sensoryRegex = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "text_sensory_misuse", null);
+ if (sensoryRegex == null) {
+ var sensoryText = validateParams.sensoryText.value;
+ var regexStr = "(" + sensoryText[0];
+ for (var j = 1; j < sensoryText.length; ++j)
+ regexStr += "|" + sensoryText[j];
+ regexStr += ")\\W";
+ sensoryRegex = new RegExp(regexStr, "gi");
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "text_sensory_misuse", sensoryRegex);
+ }
+ var passed = true;
+ var walkNode = ruleContext.firstChild;
+ var _loop_1 = function () {
+ // 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.trim();
+ if (txtVal.length > 0) {
+ violatedtextArray = txtVal.match(sensoryRegex);
+ if (violatedtextArray != null) {
+ var hash_1 = {}, result_1 = [];
+ var exemptWords_1 = ["right-click", "left-click", "right-clicking", "right-clicks", "left-clicking", "left-clicks"];
+ // Note: split(/[\n\r ]+/) will spread the string into group of words using space,
+ // carriage return or linefeed as separators.
+ var counts = txtVal.split(/[\n\r ]+/).reduce(function (map, word) {
+ var sensoryTextArr = validateParams.sensoryText.value;
+ 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 b = exemptWords_1.indexOf(lcWordWoPunc);
+ 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;
+ }
+ var isPuncfollowing = ((charFollowSensoryText == '\-') ||
+ (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)) && (b < 0)) {
+ passed = false;
+ if (!hash_1.hasOwnProperty(wordWoTrailingPunc)) {
+ hash_1[wordWoTrailingPunc] = true;
+ result_1.push(wordWoTrailingPunc);
+ }
+ counter = sensoryTextArr.length;
+ }
+ }
+ map[wordWoTrailingPunc] = (map[wordWoTrailingPunc] || 0) + 1;
+ return map;
+ }, Object.create(null));
+ violatedtext = result_1.join(", ");
+ }
+ }
+ }
+ walkNode = walkNode.nextSibling;
+ };
+ while (passed && walkNode) {
+ _loop_1();
+ }
+ if (!passed) {
+ // Don't trigger if we're not in the body or if we're in a script
+ var checkAncestor = legacy_1.RPTUtil.getAncestor(ruleContext, ["body", "script"]);
+ passed = (checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body");
+ }
+ return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1", [violatedtext]);
+ }
+};
+
+
+/***/ }),
+
+/***/ "./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 IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts");
+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", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.4.12"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: ['9e45ec', '24afc2', '78fd32'],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return null;
+ //skip the check if the element is off screen
+ var bounds = context["dom"].bounds;
+ //in case the bounds not available
+ if (!bounds)
+ return null;
+ if (bounds['top'] < 0 || bounds['left'] < 0)
+ return null;
+ //skip no-html element
+ if (legacy_1.RPTUtil.getAncestor(ruleContext, "svg"))
+ return null;
+ // 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) {
+ childStr += childNodes[i].nodeValue;
+ }
+ }
+ if (childStr.trim().length == 0)
+ return null;
+ //font size always resolved to 'px'
+ var font_size_style = (0, CSSUtil_1.getComputedStyle)(ruleContext).getPropertyValue('font-size');
+ var font_size = parseFloat(font_size_style);
+ var styles = (0, CSSUtil_1.getDefinedStyles)(ruleContext);
+ if (Object.keys(styles).length === 0)
+ return null;
+ //note that CSS unit is required for non-zero values, otherwise it's ignored
+ var ret = [];
+ // matched string: original style, the style value and unit
+ var regex = /(-?[\d.]+)([a-z%]*)/;
+ var word_style = styles['word-spacing'];
+ if (word_style) {
+ if (word_style.startsWith('inherit') || word_style.startsWith('unset')) {
+ //get closet ancestor's word-spacing
+ var ancestor = legacy_1.RPTUtil.getAncestorWithStyles(ruleContext.parentElement, { "word-spacing": ["*"] }, ['inherit', 'unset']);
+ if (ancestor !== null) {
+ word_style = (0, CSSUtil_1.getDefinedStyles)(ancestor)['word-spacing'];
+ }
+ else if (word_style.startsWith('unset')) {
+ word_style = "initial";
+ }
+ }
+ if (ruleContext.style.getPropertyPriority("word-spacing") === 'important') {
+ word_style = word_style.substring(0, word_style.length - "!important".length - 1);
+ // computed space is 0 for 'normal' or 'initial'.
+ if (word_style === 'initial' || word_style === 'normal')
+ ret.push((0, IRule_1.RuleFail)("fail_word_spacing_style"));
+ else {
+ var wordSpacing = parseFloat(word_style);
+ if (!isNaN(wordSpacing)) {
+ var parsed = word_style.trim().match(regex);
+ if (parsed[2] !== '' && parsed[1] !== 0) { //no zero value without unit which is considered as error, so implicable
+ var pixels = (0, CSSUtil_1.convertValue2Pixels)(parsed[2], parsed[1], ruleContext);
+ if (pixels !== null && pixels / font_size < 0.16)
+ ret.push((0, IRule_1.RuleFail)("fail_word_spacing_style"));
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ var letter_style = styles['letter-spacing'];
+ if (letter_style) {
+ if (letter_style.startsWith('inherit') || letter_style.startsWith('unset')) {
+ //get closet ancestor's word-spacing
+ var ancestor = legacy_1.RPTUtil.getAncestorWithStyles(ruleContext.parentElement, { "letter-spacing": ["*"] }, ['inherit', 'unset']);
+ if (ancestor !== null) {
+ letter_style = (0, CSSUtil_1.getDefinedStyles)(ancestor)['letter-spacing'];
+ }
+ else if (letter_style.startsWith('unset')) {
+ letter_style = "initial";
+ }
+ }
+ if (ruleContext.style.getPropertyPriority("letter-spacing") === 'important') {
+ letter_style = letter_style.substring(0, letter_style.length - "!important".length - 1);
+ // computed space is 0 for 'normal' or 'initial'.
+ if (letter_style === 'initial' || letter_style === 'normal')
+ ret.push((0, IRule_1.RuleFail)("fail_letter_spacing_style"));
+ else {
+ var letterSpacing = parseFloat(letter_style);
+ if (!isNaN(letterSpacing)) {
+ var parsed = letter_style.trim().match(regex);
+ if (parsed[2] !== '' && parsed[1] !== 0) { //no zero value without unit which is considered as error, so implicable
+ var pixels = (0, CSSUtil_1.convertValue2Pixels)(parsed[2], parsed[1], ruleContext);
+ if (pixels !== null && pixels / font_size < 0.12)
+ ret.push((0, IRule_1.RuleFail)("fail_letter_spacing_style"));
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ var line_style = styles['line-height'];
+ var overflow = { "overflow": ['auto', 'scroll'], "overflow-x": ['auto', 'scroll'], "overflow-y": ['auto', 'scroll'] };
+ if (line_style && legacy_1.RPTUtil.getAncestorWithStyles(ruleContext, overflow) === null) {
+ if (line_style.startsWith('inherit') || line_style.startsWith('unset')) {
+ //get closet ancestor's word-spacing
+ var ancestor = legacy_1.RPTUtil.getAncestorWithStyles(ruleContext.parentElement, { "line-height": ["*"] }, ['inherit', 'unset']);
+ if (ancestor !== null) {
+ line_style = (0, CSSUtil_1.getDefinedStyles)(ancestor)['line-height'];
+ }
+ else if (line_style.startsWith('unset')) {
+ line_style = "initial";
+ }
+ }
+ if (ruleContext.style.getPropertyPriority("line-height") === 'important') {
+ line_style = line_style.substring(0, line_style.length - "!important".length - 1);
+ // computed space is 0 for 'normal' or 'initial'.
+ if (line_style === 'initial' || line_style === 'normal')
+ ret.push((0, IRule_1.RuleFail)("fail_line_height_style"));
+ else {
+ var lineHeight = parseFloat(line_style);
+ if (!isNaN(lineHeight)) {
+ var parsed = line_style.trim().match(regex);
+ if (parsed[2] === '') { //line-height are allowed unitless when the valie is multiple (or fraction) of the font size
+ if (parsed[1] < 1.5)
+ ret.push((0, IRule_1.RuleFail)("fail_line_height_style"));
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ else {
+ var pixels = (0, CSSUtil_1.convertValue2Pixels)(parsed[2], parsed[1], ruleContext);
+ if (pixels !== null && pixels / font_size < 1.5)
+ ret.push((0, IRule_1.RuleFail)("fail_line_height_style"));
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ if (ret.length > 0)
+ return ret;
+ return null; //implicable or ignore
+ }
+};
+
+
+/***/ }),
+
+/***/ "./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 legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = legacy_1.RPTUtil.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 legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/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: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", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["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) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element should be a presentational child of an element
+ if (legacy_1.RPTUtil.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;
+ var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext);
+ var count = 0;
+ if (legacy_1.RPTUtil.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 && !legacy_1.RPTUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) {
+ var nw = new legacy_1.NodeWalker(ruleContext);
+ while (count < 1 && nw.nextNode() && nw.node != ruleContext) {
+ if (nw.node.nodeType == 1 && !nw.bEndTag && legacy_1.RPTUtil.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 legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.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__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/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",
+ "fail_multiple_tabbable": "fail_multiple_tabbable"
+ }
+ },
+ help: {
+ "en-US": {
+ "pass": "widget_tabbable_single.html",
+ "fail_multiple_tabbable": "widget_tabbable_single.html",
+ "group": "widget_tabbable_single.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "fail_multiple_tabbable": "Component with \"{0}\" role has more than one tabbable element",
+ "group": "Certain components must have no more than one tabbable element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["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) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element should be a presentational child of an element
+ if (legacy_1.RPTUtil.shouldBePresentationalChild(ruleContext))
+ return;
+ var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext);
+ var count = 0;
+ if (legacy_1.RPTUtil.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 < 2 && !legacy_1.RPTUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) {
+ var nw = new legacy_1.NodeWalker(ruleContext);
+ while (count < 2 && nw.nextNode() && nw.node != ruleContext) {
+ if (nw.node.nodeType == 1 && !nw.bEndTag && legacy_1.RPTUtil.isTabbable(nw.node)) {
+ ++count;
+ }
+ }
+ }
+ var passed = count < 2;
+ if (!passed)
+ (0, CacheUtil_1.setCache)(ruleContext, "widget_tabbable_single", "fail_multiple_tabbable");
+ return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("fail_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.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.a11yRulesets = void 0;
+var IEngine_1 = __webpack_require__(/*! ../v2/api/IEngine */ "./src/v2/api/IEngine.ts");
+// This file comes from https://raw.githubusercontent.com/act-rules/act-tools/main/src/data/sc-urls.json
+var SCURLs = __webpack_require__(/*! ./sc-urls.json */ "./src/v4/sc-urls.json");
+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.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.",
+ "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.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.",
+ "4.1.1": "In content implemented using markup languages, elements have complete start and end tags, elements are nested according to their specifications, elements do not contain duplicate attributes, and any IDs are unique, except where the specifications allow these features.",
+ "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.",
+};
+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: IEngine_1.eRuleCategory.ACCESSIBILITY,
+ description: "Rules for enabling the browser extensions",
+ type: IEngine_1.eRulesetType.EXTENSION,
+ checkpoints: [{
+ num: "1",
+ name: "Extension CP 1",
+ wcagLevel: "A",
+ summary: "Rules for Extension"
+ }]
+ },
+ {
+ id: "IBM_Accessibility",
+ name: "IBM Accessibility",
+ category: IEngine_1.eRuleCategory.ACCESSIBILITY,
+ description: "Rules for WCAG 2.1 AA plus additional IBM checklist 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.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_1",
+ name: "WCAG 2.1 (A, AA)",
+ category: IEngine_1.eRuleCategory.ACCESSIBILITY,
+ description: "Rules for WCAG 2.1 AA. This is the current W3C recommendation. 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: IEngine_1.eRuleCategory.ACCESSIBILITY,
+ description: "Rules for WCAG 2.0 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/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.getCSSStyle = exports.getFontInPixels = exports.getWeightNumber = exports.isMaterialIconFont = exports.convertValue2Pixels = exports.getPixelsFromStyle = exports.getRotationDegree = exports.getMediaOrientationTransform = exports.getDefinedStyles = exports.getComputedStyle = exports.selectorMatchesElem = void 0;
+var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts");
+function selectorMatchesElem(element, selector) {
+ try {
+ if (selector.trim() === "")
+ return false;
+ if (typeof element.matches === 'function') {
+ return element.matches(selector);
+ }
+ if (typeof element.matchesSelector === 'function') {
+ return element.matchesSelector(selector);
+ }
+ // Native functions not there, fallback
+ var matches = (element.document || element.ownerDocument).querySelectorAll(selector);
+ var i = 0;
+ while (i < matches.length && matches[i] !== element) {
+ ++i;
+ }
+ return i < matches.length;
+ }
+ catch (err) {
+ // Bad selector? Doesn't match then...
+ return false;
+ }
+}
+exports.selectorMatchesElem = selectorMatchesElem;
+/**
+ * Returns the style computed for this element
+ * @param elem
+ */
+function getComputedStyle(elem, pseudoElt) {
+ var doc = elem.ownerDocument;
+ var win = doc.defaultView;
+ return win.getComputedStyle(elem, pseudoElt);
+}
+exports.getComputedStyle = getComputedStyle;
+/**
+ * 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)'
+ *
+ * @param {HTMLElement} elem
+ * @param {string} [pseudoClass] If specified, will return values that are different
+ * than when the pseudoClass does not match.
+ */
+function getDefinedStyles(elem, pseudoClass) {
+ // console.log("Function: getDefinedStyles");
+ var definedStyles = {};
+ var definedStylePseudo = {};
+ function fillStyle(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"))
+ //override !important only if it is also !important
+ map[key] = style[key] + " !important";
+ else
+ //don't override !important if it is not !important
+ continue;
+ }
+ else
+ //create/overide anyway
+ map[key] = style[key] + (priority === 'important' ? " !important" : "");
+ }
+ }
+ }
+ }
+ var storedStyles = (0, CacheUtil_1.getCache)(elem, "RPTUtil_DefinedStyles", null);
+ if (!pseudoClass && storedStyles !== null) {
+ definedStyles = storedStyles["definedStyles"];
+ definedStylePseudo = storedStyles["definedStylePseudo"];
+ }
+ else {
+ // Iterate through all of the stylesheets and rules
+ for (var ssIndex = 0; ssIndex < elem.ownerDocument.styleSheets.length; ++ssIndex) {
+ var sheet = elem.ownerDocument.styleSheets[ssIndex];
+ try {
+ if (sheet && sheet.cssRules) {
+ // console.log("Got sheet");
+ for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) {
+ // console.log("Got rule: ", sheet.cssRules[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] : "";
+ var samePseudoClass = selPseudo === pseudoClass;
+ if (pseudoClass && pseudoClass === ":focus") {
+ // If this element has focus, remove focus-within from parents
+ selMain = selMain.replace(/([ >][^+~ >]+):focus-within/g, "$1");
+ }
+ // Get styles of non-pseudo selectors
+ if (!hasPseudoClass && selectorMatchesElem(elem, selMain)) {
+ fillStyle([definedStyles, definedStylePseudo], rule.style);
+ }
+ if (samePseudoClass && selectorMatchesElem(elem, selMain)) {
+ fillStyle([definedStylePseudo], rule.style);
+ }
+ }
+ }
+ }
+ }
+ catch (err) {
+ if (!err.toString().includes("Cannot access rules") && !err.toString().includes("SecurityError:")) {
+ throw err;
+ }
+ }
+ }
+ //
+ // Handled the stylesheets, now handle the element defined styles
+ fillStyle([definedStyles, definedStylePseudo], elem.style);
+ (0, CacheUtil_1.setCache)(elem, "RPTUtil_DefinedStyles", { definedStyles: definedStyles, definedStylePseudo: definedStylePseudo });
+ }
+ /**
+ * 'initial' sets the style back to default
+ for (const key in definedStyles) {
+ if (definedStyles[key] === "initial") {
+ delete definedStyles[key];
+ }
+ }
+ for (const key in definedStylePseudo) {
+ if (definedStylePseudo[key] === "initial") {
+ delete definedStylePseudo[key];
+ }
+ }
+ */
+ if (!pseudoClass) {
+ // console.log("[DEBUG: CSSUtil::getDefinedStyles]", elem.nodeName, pseudoClass, JSON.stringify(definedStyles, null, 2));
+ return definedStyles;
+ }
+ else {
+ for (var key in definedStylePseudo) {
+ if (definedStylePseudo[key] === definedStyles[key]) {
+ delete definedStylePseudo[key];
+ }
+ }
+ // console.log("[DEBUG: CSSUtil::getDefinedStyles]", elem.nodeName, pseudoClass, JSON.stringify(definedStylePseudo, null, 2));
+ return definedStylePseudo;
+ }
+}
+exports.getDefinedStyles = getDefinedStyles;
+/**
+ * Returns the media query defined for the document
+ *
+ *
+ * @param {Document} doc
+ */
+function getMediaOrientationTransform(doc) {
+ 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++) {
+ var elem_transforms = orientationTransforms[mediaList.item(i).toLocaleLowerCase()];
+ if (!elem_transforms)
+ elem_transforms = {};
+ var styleRules = rule.cssRules;
+ for (var i_1 = 0; i_1 < styleRules.length; ++i_1) {
+ if (1 /* CSSRule.STYLE_RULE */ === styleRules[i_1].STYLE_RULE) {
+ var styleRule = styleRules[i_1];
+ var selector = styleRule.selectorText;
+ if (selector) {
+ var transforms = {};
+ var styles = styleRule.style;
+ for (var s = 0; s < styles.length; ++s) {
+ var key = styles[s];
+ if (key.toLocaleLowerCase() === "transform") {
+ if (key === "all" && styles[key]) {
+ delete transforms[key];
+ break;
+ }
+ else {
+ transforms[key] = styles[key];
+ }
+ }
+ }
+ elem_transforms[selector] = transforms;
+ }
+ }
+ }
+ orientationTransforms[mediaList.item(i).toLocaleLowerCase()] = elem_transforms;
+ }
+ }
+ }
+ }
+ }
+ }
+ catch (err) {
+ if (!err.toString().includes("Cannot access rules") && !err.toString().includes("SecurityError:")) {
+ throw err;
+ }
+ }
+ }
+ return orientationTransforms;
+}
+exports.getMediaOrientationTransform = getMediaOrientationTransform;
+/**
+ * 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
+ */
+function getRotationDegree(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;
+}
+exports.getRotationDegree = getRotationDegree;
+/**
+ * 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
+ */
+function getPixelsFromStyle(value, elem) {
+ if (!value)
+ return 0;
+ var regex = /(-?[\d.]+)([a-z%]*)/;
+ var parsed = value.trim().match(regex);
+ if (parsed[2] === '' || parsed[1] === 0)
+ //no zero value without unit which is considered as error, so implicable
+ return 0;
+ var pixels = convertValue2Pixels(parsed[2], parsed[1], elem);
+ return pixels === null ? pixels : parseFloat(pixels);
+}
+exports.getPixelsFromStyle = getPixelsFromStyle;
+/**
+ * Convert absolute CSS numerical values to pixels.
+ *
+ * @param unitValue in string
+ * @param target element.
+ * @return value in pixels
+ */
+function convertValue2Pixels(unit, unitValue, elem) {
+ if (unitValue == 0)
+ return 0;
+ 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;
+}
+exports.convertValue2Pixels = convertValue2Pixels;
+/*
+* Returns if the font for visible text of the element is defined by material icons
+*
+* @param {HTMLElement} elem
+*/
+function isMaterialIconFont(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 = getDefinedStyles(elem);
+ 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;
+}
+exports.isMaterialIconFont = isMaterialIconFont;
+function getWeightNumber(styleVal) {
+ var map = {
+ "light": 100,
+ "bold": 700
+ };
+ var retVal = parseInt(styleVal);
+ if (retVal)
+ return retVal;
+ if (styleVal in map)
+ return map[styleVal];
+ return 400;
+}
+exports.getWeightNumber = getWeightNumber;
+function getFontInPixels(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 convertValue2Pixels(units, value, elem);
+}
+exports.getFontInPixels = getFontInPixels;
+function getCSSStyle(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;
+ }
+}
+exports.getCSSStyle = getCSSStyle;
+
+
+/***/ }),
+
+/***/ "./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.clearCaches = exports.setCache = exports.getCache = void 0;
+var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts");
+/* Return a pointer to the given global variable
+ * with its initial value as given */
+function getCache(cacheSpot, keyName, initValue) {
+ 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];
+}
+exports.getCache = getCache;
+function setCache(cacheSpot, globalName, value) {
+ 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;
+}
+exports.setCache = setCache;
+function clearCaches(cacheRoot) {
+ delete cacheRoot.ownerDocument.aceCache;
+ var nw = new DOMWalker_1.DOMWalker(cacheRoot);
+ do {
+ delete nw.node.aceCache;
+ nw.node.ownerDocument && delete nw.node.ownerDocument.aceCache;
+ } while (nw.nextNode());
+}
+exports.clearCaches = clearCaches;
+
+
+/***/ }),
+
+/***/ "./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.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.getDeprecatedAriaAttributes = exports.getDeprecatedAriaRoles = exports.isTableDescendant = exports.getConflictAriaAndHtmlAttributes = exports.getInvalidAriaAttributes = exports.getRolesUndefinedByAria = exports.getInvalidRoles = exports.areRolesDefined = void 0;
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts");
+/*
+ * 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
+*/
+function areRolesDefined(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;
+}
+exports.areRolesDefined = areRolesDefined;
+/*
+ * 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
+*/
+function getInvalidRoles(ruleContext) {
+ var domRoles = legacy_1.RPTUtil.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 = legacy_1.RPTUtil.getElementAriaProperty(ruleContext);
+ var allowedRoles = legacy_1.RPTUtil.getAllowedAriaRoles(ruleContext, tagProperty);
+ if (!allowedRoles && allowedRoles.length === 0)
+ return domRoles;
+ var invalidRoles = [];
+ if (allowedRoles && 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;
+}
+exports.getInvalidRoles = getInvalidRoles;
+/*
+ * check if any explicit role specified for the element is not defined in ARIA
+ * return: list of specified roles not defined in ARIA
+*/
+function getRolesUndefinedByAria(element) {
+ if (!element)
+ return null;
+ var roles = legacy_1.RPTUtil.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;
+}
+exports.getRolesUndefinedByAria = getRolesUndefinedByAria;
+/*
+ * 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
+ */
+function getInvalidAriaAttributes(ruleContext) {
+ var roles = legacy_1.RPTUtil.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 = areRolesDefined(roles);
+ if (defined !== null && !defined)
+ return null;
+ var attrs = [];
+ if (!roles || roles.length == 0)
+ roles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ var aria_attrs = legacy_1.RPTUtil.getUserDefinedAriaAttributes(ruleContext);
+ var tagProperty = legacy_1.RPTUtil.getElementAriaProperty(ruleContext);
+ // Attributes allowed on this node
+ var allowedAttributes = legacy_1.RPTUtil.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;
+}
+exports.getInvalidAriaAttributes = getInvalidAriaAttributes;
+/*
+ * get conflict Aria and Html attributes
+ * return: a list of Aria and Html attribute pairs that are conflict
+*/
+function getConflictAriaAndHtmlAttributes(elem) {
+ var ariaAttrs = legacy_1.RPTUtil.getUserDefinedAriaAttributeNameValuePairs(elem);
+ var htmlAttrs = legacy_1.RPTUtil.getUserDefinedHtmlAttributeNameValuePairs(elem);
+ var ret = [];
+ if (ariaAttrs && ariaAttrs.length > 0 && htmlAttrs && htmlAttrs.length > 0) {
+ var _loop_1 = function (i) {
+ var examinedHtmlAtrNames = legacy_1.RPTUtil.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;
+}
+exports.getConflictAriaAndHtmlAttributes = getConflictAriaAndHtmlAttributes;
+/*
+ * get conflict Aria and Html attributes
+ * return: a list of Aria and Html attribute pairs that are conflict
+*/
+function isTableDescendant(contextHierarchies) {
+ if (!contextHierarchies)
+ return null;
+ return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); });
+}
+exports.isTableDescendant = isTableDescendant;
+/*
+ * get deprecated Aria roles
+ * return: a list of deprecated Aria roles
+*/
+function getDeprecatedAriaRoles(element) {
+ if (!element)
+ return null;
+ var roles = legacy_1.RPTUtil.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;
+}
+exports.getDeprecatedAriaRoles = getDeprecatedAriaRoles;
+/*
+ * get deprecated Aria role-attributes
+ * return: a list of deprecated Aria role-attributes paris
+ * for global the role is marked as 'any'
+*/
+function getDeprecatedAriaAttributes(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 = legacy_1.RPTUtil.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;
+}
+exports.getDeprecatedAriaAttributes = getDeprecatedAriaAttributes;
+
+
+/***/ }),
+
+/***/ "./src/v4/sc-urls.json":
+/*!*****************************!*\
+ !*** ./src/v4/sc-urls.json ***!
+ \*****************************/
+/***/ ((module) => {
+
+module.exports = JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG21/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG21/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG21/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG21/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG21/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG21/#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/WCAG21/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG21/#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/WCAG21/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG21/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:WCAG2:pointer-gestures","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG21/#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/WCAG21/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG21/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG21/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG21/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#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/WCAG21/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG21/#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/WCAG21/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG21/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG21/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG21/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/WCAG21/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"}}');
+
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/ // The module cache
+/******/ var __webpack_module_cache__ = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/ // Check if module is in cache
+/******/ var cachedModule = __webpack_module_cache__[moduleId];
+/******/ if (cachedModule !== undefined) {
+/******/ return cachedModule.exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var 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;
+/******/ }
+/******/
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
+(() => {
+var 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.DOMWalker = exports.Config = exports.checkDemo = exports.ARIAMapper = exports.Context = exports.Checker = 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; } }));
+String.prototype.startsWith = String.prototype.startsWith || function (str) {
+ return this.indexOf(str) === 0;
+};
+String.prototype.includes = String.prototype.includes || function (str) {
+ return this.indexOf(str) !== -1;
+};
+Array.prototype.includes = Array.prototype.includes || function (str) {
+ return this.indexOf(str) !== -1;
+};
+/*
+function simDemo(timeout?: number) {
+ if (!timeout) timeout = 0;
+ setTimeout(function() {
+ let sim = new Simulator();
+ let s = sim.renderItem(document.documentElement);
+ console.group("--- Item View ---");
+ console.log(s);
+ console.groupEnd();
+ console.group("--- Link View ---");
+ s = sim.renderLink(document.documentElement);
+ console.log(s);
+ console.groupEnd();
+ }, timeout);
+}
+*/
+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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QUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1lBQ2xELGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsV0FBVyxFQUFFO1lBQ1QsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDeEIsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1lBQ2xELGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsWUFBWSxFQUFFO1lBQ1YsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDeEIsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1lBQ2xELGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsYUFBYSxFQUFFO1lBQ1gsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDeEIsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1lBQ2xELGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIs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QUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzdtRyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFILENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM3aUUsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM1ekQsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDenhCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDM2pCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeGtFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ25xQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2xsQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzNUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDempFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN2MUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzK0YsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9pQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9uRSxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDblcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzOUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDN3BHLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4cUcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4eUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbmpCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2gzQyxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbjVELENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzE4QyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0NBQzdtQyxDQUFDO0FBR0Y7SUFBQTtJQXFDQSxDQUFDO0lBbkNHLHdEQUF3RDtJQUMxQyxnQkFBTyxHQUFyQixVQUFz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QUFXLEVBQUUsU0FBUztRQUN0QixXQUFXLEVBQUUsU0FBUztRQUN0QixVQUFVLEVBQUUsU0FBUztRQUNyQixhQUFhLEVBQUUsU0FBUztRQUN4QixNQUFNLEVBQUUsU0FBUztRQUNqQixTQUFTLEVBQUUsU0FBUztRQUNwQixPQUFPLEVBQUUsU0FBUztRQUNsQixXQUFXLEVBQUUsU0FBUztRQUN0QixRQUFRLEVBQUUsU0FBUztRQUNuQixXQUFXLEVBQUUsU0FBUztRQUN0QixRQUFRLEVBQUUsU0FBUztRQUNuQixlQUFlLEVBQUUsU0FBUztRQUMxQixXQUFXLEVBQUUsU0FBUztRQUN0QixlQUFlLEVBQUUsU0FBUztRQUMxQixlQUFlLEVBQUUsU0FBUztRQUMxQixZQUFZLEVBQUUsU0FBUztRQUN2QixXQUFXLEVBQUUsU0FBUztRQUN0QixNQUFNLEVBQUUsU0FBUztRQUNqQixNQUFNLEVBQUUsU0FBUztRQUNqQixNQUFNLEVBQUUsU0FBUztRQUNqQixZQUFZLEVBQUUsU0FBUztRQUN2QixRQUFRLEVBQUUsU0FBUztRQUNuQixLQUFLLEVBQUUsU0FBUztRQUNoQixXQUFXLEVBQUUsU0FBUztRQUN0QixXQUFXLEVBQUUsU0FBUztRQUN0QixhQUFhLEVBQUUsU0FBUztRQUN4QixRQUFRLEVBQUUsU0FBUztRQUNuQixZQUFZLEVBQUUsU0FBUztRQUN2QixVQUFVLEVBQUUsU0FBUztRQUNyQixVQUFVLEVBQUUsU0FBUztRQUNyQixRQUFRLEVBQUUsU0FBUztRQUNuQixRQUFRLEVBQUUsU0FBUztRQUNuQixTQUFTLEVBQUUsU0FBUztRQUNwQixXQUFXLEVBQUUsU0FBUztRQUN0QixXQUFXLEVBQUUsU0FBUztRQUN0QixNQUFNLEVBQUUsU0FBUztRQUNqQixhQUFhLEVBQUUsU0FBUztRQUN4QixXQUFXLEVBQUUsU0FBUztRQUN0QixLQUFLLEVBQUUsU0FBUztRQUNoQixNQUFNLEVBQUUsU0FBUztRQUNqQixTQUFTLEVBQUUsU0FBUztRQUNwQixRQUFRLEVBQUUsU0FBUztRQUNuQixXQUFXLEVBQUUsU0FBUztRQUN0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bkIsU0FBUyxFQUFFO2dCQUNQLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtvQkFDN0UsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7b0JBQ3pGLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJO29CQUN0RixLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSztvQkFDMUYsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSTtvQkFDN0YsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSztvQkFDL0YsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFL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QUM7QUFFc0MsOEJBQVMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvYXBpL0lFbmdpbmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2FyaWEvQVJJQURlZmluaXRpb25zLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9hcmlhL0FSSUFNYXBwZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2FyaWEvQVJJQVdhbGtlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3IudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sYW5nLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3kudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NvbW1vbi9Db21tb25NYXBwZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NvbW1vbi9Db250ZXh0LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jb21tb24vRW5naW5lLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jb25maWcvQ29uZmlnLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9kb20vQ29sb3JVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9kb20vRE9NTWFwcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9kb20vRE9NVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvZG9tL0RPTVdhbGtlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvZG9tL1Zpc1V0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL3N0eWxlL1N0eWxlTWFwcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9hcGkvSVJ1bGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L2NoZWNrZXIvQ2hlY2tlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYV90YXJnZXRfd2FybmluZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYV90ZXh0X3B1cnBvc2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FwcGxldF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyZWFfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3QudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9iYW5uZXJfc2luZ2xlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NoaWxkX3RhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NoaWxkX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmsudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRpbmZvX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50aW5mb19zaW5nbGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZGVzY2VuZGFudF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZm9ybV9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZ3JhcGhpY19sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9oaWRkZW5fbm9udGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfaWRfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2ltZ19sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9tYWluX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9tYWluX2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcGFyZW50X3JlcXVpcmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcmVnaW9uX2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JvbGVfYWxsb3dlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yb2xlX3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3NlbWFudGljcy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV93aWRnZXRfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FzY2lpYXJ0X2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2JsaW5rX2Nzc19yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2JsaW5rX2VsZW1fZGVwcmVjYXRlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYmxvY2txdW90ZV9jaXRlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jYXB0aW9uX3RyYWNrX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfZGVzaWduX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9wb3B1cF9yZWZlcmVuY2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2RlYnVnX3BhdGhzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9kZXRlY3Rvcl90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZGlyX2F0dHJpYnV0ZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2lkX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9sYW5nX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X3RhYmJhYmxlX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VtYmVkX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VtYmVkX25vZW1iZWRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbW90aWNvbnNfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZXJyb3JfbWVzc2FnZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZpZWxkc2V0X2xhYmVsX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9maWVsZHNldF9sZWdlbmRfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZpZ3VyZV9sYWJlbF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1fZm9udF9jb2xvci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX3N1Ym1pdF9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZyYW1lX3NyY192YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZnJhbWVfdGl0bGVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9oZWFkaW5nX2NvbnRlbnRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9oZWFkaW5nX21hcmt1cF9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2h0bWxfbGFuZ19leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2h0bWxfc2tpcG5hdl9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1hZ2VidXR0b25fYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1hZ2VtYXBfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9iYWNrZ3JvdW5kLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X2RlY29yYXRpdmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X251bGwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfcmVkdW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfaXNtYXBfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfbG9uZ2Rlc2NfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbmRleC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9jaGVja2JveGVzX2dyb3VwZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2ZpZWxkc19ncm91cGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9oYXNwb3B1cF9jb25mbGljdC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfbGFiZWxfYWZ0ZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2xhYmVsX2JlZm9yZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfbGFiZWxfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9sYWJlbF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9vbmNoYW5nZV9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xhYmVsX2NvbnRlbnRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9sYWJlbF9uYW1lX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xhYmVsX3JlZl92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGlzdF9jaGlsZHJlbl92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGlzdF9tYXJrdXBfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9saXN0X3N0cnVjdHVyZV9wcm9wZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21hcnF1ZWVfZWxlbV9hdm9pZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfYWx0X2JyaWVmLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9hdWRpb190cmFuc2NyaWJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9saXZlX2NhcHRpb25lZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfdHJhY2tfYXZhaWxhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZXRhX3JlZGlyZWN0X29wdGlvbmFsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZXRhX3JlZnJlc2hfZGVsYXkudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21ldGFfdmlld3BvcnRfem9vbWFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL25vZW1iZWRfY29udGVudF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL29iamVjdF90ZXh0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvcGFnZV90aXRsZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3BhZ2VfdGl0bGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NjcmlwdF9mb2N1c19ibHVyX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2NyaXB0X29uY2xpY2tfYXZvaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NjcmlwdF9vbmNsaWNrX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2NyaXB0X3NlbGVjdF9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NlbGVjdF9vcHRpb25zX2dyb3VwZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NraXBfbWFpbl9kZXNjcmliZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NraXBfbWFpbl9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfY29sb3JfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9mb2N1c192aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfaG92ZXJfcGVyc2lzdGVudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9hcmlhX2Rlc2NlbmRhbnRzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9jYXB0aW9uX2VtcHR5LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9jYXB0aW9uX25lc3RlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfaGVhZGVyc19leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9oZWFkZXJzX3JlbGF0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2xheW91dF9saW5lYXJpemVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9zY29wZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfc3RydWN0dXJlX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfc3VtbWFyeV9yZWR1bmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfYmxvY2tfaGVhZGluZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF9jb250cmFzdF9zdWZmaWNpZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X3F1b3RlZF9jb3JyZWN0bHkudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfc2Vuc29yeV9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfc3BhY2luZ192YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF93aGl0ZXNwYWNlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy93aWRnZXRfdGFiYmFibGVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy93aWRnZXRfdGFiYmFibGVfc2luZ2xlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlc2V0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9DU1NVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NhY2hlVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9Db21tb25VdGlsLnRzIiwid2VicGFjazovL2FjZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBJTWFwUmVzdWx0IH0gZnJvbSBcIi4vSU1hcHBlclwiO1xuXG5leHBvcnQgZW51bSBlUnVsZUNvbmZpZGVuY2Uge1xuICAgIFBBU1MgPSBcIlBBU1NcIixcbiAgICBGQUlMID0gXCJGQUlMXCIsXG4gICAgUE9URU5USUFMID0gXCJQT1RFTlRJQUxcIixcbiAgICBNQU5VQUwgPSBcIk1BTlVBTFwiXG59XG5cbmV4cG9ydCBlbnVtIGVSdWxlUG9saWN5IHtcbiAgICBWSU9MQVRJT04gPSBcIlZJT0xBVElPTlwiLFxuICAgIFJFQ09NTUVOREFUSU9OID0gXCJSRUNPTU1FTkRBVElPTlwiLFxuICAgIElORk9STUFUSU9OID0gXCJJTkZPUk1BVElPTlwiXG59XG5cbmV4cG9ydCBlbnVtIGVUb29sa2l0TGV2ZWwge1xuICAgIExFVkVMX09ORSA9IFwiMVwiLFxuICAgIExFVkVMX1RXTyA9IFwiMlwiLFxuICAgIExFVkVMX1RIUkVFID0gXCIzXCIsXG4gICAgTEVWRUxfRk9VUiA9IFwiNFwiXG59XG5cbmV4cG9ydCBlbnVtIGVSdWxlQ2F0ZWdvcnkge1xuICAgIEFDQ0VTU0lCSUxJVFkgPSBcIkFjY2Vzc2liaWxpdHlcIixcbiAgICBERVNJR04gPSBcIkRlc2lnblwiLFxuICAgIE9USEVSID0gXCJPdGhlclwiXG59XG5cbmV4cG9ydCBlbnVtIGVSdWxlc2V0VHlwZSB7XG4gICAgREVGQVVMVCA9IFwiZGVmYXVsdFwiLFxuICAgIEVYVEVOU0lPTiA9IFwiZXh0ZW5zaW9uXCJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVQYXNzKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLlBBU1NdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVSZW5kZXIocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuUEFTU10sXG4gICAgICAgIHJlYXNvbklkOiAwLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gUnVsZUZhaWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuRkFJTF0sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZVBvdGVudGlhbChyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5QT1RFTlRJQUxdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVNYW51YWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuTUFOVUFMXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFJ1bGVSZXN1bHQgPSB7XG4gICAgdmFsdWU6IFtlUnVsZVBvbGljeSwgZVJ1bGVDb25maWRlbmNlXSxcbiAgICByZWFzb25JZD86IG51bWJlciB8IHN0cmluZyxcbiAgICBtZXNzYWdlQXJncz86IHN0cmluZ1tdLFxuICAgIGFwaUFyZ3M/OiBhbnlbXVxufVxuXG5leHBvcnQgdHlwZSBSdWxlRGV0YWlscyA9IFJ1bGVSZXN1bHQgJiB7XG4gICAgcnVsZUlkOiBzdHJpbmcsXG5cbiAgICBub2RlOiBOb2RlLFxuICAgIC8vIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGNhdGVnb3J5PzogZVJ1bGVDYXRlZ29yeSxcbiAgICBwYXRoOiB7IFtuczogc3RyaW5nXSA6IHN0cmluZyB9LFxuXG4gICAgcnVsZVRpbWU6IG51bWJlcixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgYm91bmRzPzoge1xuICAgICAgICB0b3A6IG51bWJlcixcbiAgICAgICAgbGVmdDogbnVtYmVyLFxuICAgICAgICB3aWR0aDogbnVtYmVyLFxuICAgICAgICBoZWlnaHQ6IG51bWJlclxuICAgIH0sXG4gICAgc25pcHBldDogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFJ1bGVDb250ZXh0SGllcmFyY2h5ID0geyBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcFJlc3VsdFtdIH07XG5cbmV4cG9ydCB0eXBlIFJ1bGVDb250ZXh0ID0ge1xuICAgIFtuYW1lc3BhY2U6IHN0cmluZ10gOiBJTWFwUmVzdWx0XG59XG5cbmV4cG9ydCB0eXBlIFJ1bGUgPSB7XG4gICAgLy8gVW5pcXVlIHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGlzIHJ1bGUgKHNob3VsZCBiZSBodW1hbiB1bmRlcnN0YW5kYWJsZSlcbiAgICAvLyBOTFMgY29kZXMgYW5kIGhlbHAgc291cmNlcyB3aWxsIGJlIGJhc2VkIG9mZiBvZiB0aGlzIGlkXG4gICAgaWQ6IHN0cmluZztcblxuICAgIC8vIFNlZSBzcmMvdjIvY29tbW9uL0NvbnRleHQudHMgZm9yIHZhbGlkIGNvbnRleHRzXG4gICAgY29udGV4dDogc3RyaW5nO1xuXG4gICAgLy8gQXJyYXkgb2YgcnVsZXMgdGhhdCBtdXN0IHBhc3MgdG8gYWxsb3cgdGhpcyB2YWxpZGF0ZSB0byBydW4gLSB0aGV5IG11c3QgaGF2ZSB0aGUgc2FtZSBjb250ZXh0IHByb3BlcnR5XG4gICAgZGVwZW5kZW5jaWVzPzogc3RyaW5nW11cbiAgICBwcmVyZXFzPzogc3RyaW5nW11cblxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA9PiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdXG5cbiAgICBlbmFibGVkPzogYm9vbGVhblxufVxuXG5cbmV4cG9ydCB0eXBlIFJlcG9ydCA9IHtcbiAgICByZXN1bHRzOiBSdWxlRGV0YWlsc1tdLFxuICAgIG51bUV4ZWN1dGVkOiBudW1iZXIsXG4gICAgcnVsZVRpbWU6IG51bWJlcixcbiAgICAvLyBUaGlzIG1heSBiZSB1bmRlZmluZWQgZm9yIGEgZmlsdGVyZWQgcmVwb3J0XG4gICAgdG90YWxUaW1lPzogbnVtYmVyLFxuICAgIG5scz86IHtcbiAgICAgICAgW3J1bGVJZDogc3RyaW5nXToge1xuICAgICAgICAgICAgW3JlYXNvbklkOiBzdHJpbmddOiBzdHJpbmdcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgTmxzTWFwID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZ1tdXG59XG5cbmV4cG9ydCB0eXBlIEhlbHBNYXAgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW5naW5lIHtcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIGEgc2NhbiBvbiBhIGRvY3VtZW50IG9yIHN1YnRyZWVcbiAgICAgKiBAcGFyYW0gcnVsZXNldElkcyBBcnJheSBvZiBydWxlc2V0IGlkcyBvZiBydWxlc2V0cyB0byB1c2UgZm9yIHRoaXMgc2NhblxuICAgICAqIEBwYXJhbSByb290IERvY3VtZW50IG9yIHN1YnRyZWUgdG8gc2NhblxuICAgICAqL1xuICAgIHJ1bihyb290OiBEb2N1bWVudCB8IE5vZGUsIG9wdGlvbnM/OiB7fSkgOiBQcm9taXNlPFJlcG9ydD47XG5cbiAgICBlbmFibGVSdWxlcyhydWxlSWRzOiBzdHJpbmdbXSk7XG5cbiAgICBnZXRSdWxlKHJ1bGVJZDogc3RyaW5nKTogUnVsZTtcblxuICAgIGdldFJ1bGVzSWRzKCkgOiBzdHJpbmdbXTtcblxuICAgIGdldE1lc3NhZ2UocnVsZUlkOiBzdHJpbmcsIHJ1bGVJZHg6IG51bWJlciB8IHN0cmluZywgbXNnQXJncz86IHN0cmluZ1tdKTogc3RyaW5nO1xuXG4gICAgZ2V0SGVscChydWxlSWQ6IHN0cmluZywgcnVsZUlkeDogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nO1xuXG4gICAgYWRkUnVsZXMocnVsZTogUnVsZVtdKTtcblxuICAgIGFkZFJ1bGUocnVsZTogUnVsZSk7XG5cbiAgICBhZGRObHNNYXAobWFwOiBObHNNYXApO1xuXG4gICAgYWRkSGVscE1hcChtYXA6IE5sc01hcCk7XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKmdsb2JhbCBPcGVuQWpheCovXG4vLyBhbGwgcmVmZXJlbmNlcyB0byBXQUktQVJJQSBzcGVjaWZpY2F0aW9uIGlzIHRoZSBXQUktQVJJQSAxLjJcbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjIvXG5cbmV4cG9ydCBpbnRlcmZhY2UgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCB7XG4gICAgaW1wbGljaXRSb2xlOiBzdHJpbmdbXSxcbiAgICB2YWxpZFJvbGVzOiBzdHJpbmdbXSxcbiAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBib29sZWFuLFxuICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzPzogc3RyaW5nW10sIFxuICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzPzogc3RyaW5nW10sXG4gICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM/OiBzdHJpbmdbXSwgLy9yb2xlcywgb3RoZXIgdGhhbiBpbXBsaWNpdCBhbmQgdmFsaWQgcm9sZXMsIHdob3NlIGF0dHJpYnV0ZXMgYXJlIGFsc28gYWxsb3dlZFxuICAgIC8vIGEgZmV3IGVsZW1lbnRzIChzdWNoIGFzIGRhdGFsaXN0LCBodG1sLCBjYXB0aW9uKSB0aGF0IGhhdmUgYW4gaW1wbGljaXQgcm9sZSBidXQgZGlzYWxsb3cgc29tZSBvciBhbGwgYXR0cmlidXRlcyBhbGxvd2VkIGZvciB0aGUgcm9sZS5cbiAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlPzogYm9vbGVhbixcbiAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU/OiBzdHJpbmdbXSAgLy9zb21lIGVsZW1lbnRzICh2YXIsYWJiciBldGMuKSBoYXZlIG5vIGltcGxpY2l0IHJvbGUgYnV0IG5hbWluZyBwcm9oaWJpdGVkICAgXG59XG5cbmV4cG9ydCBjbGFzcyBBUklBRGVmaW5pdGlvbnMge1xuICAgIHN0YXRpYyBuYW1lRnJvbUNvbnRlbnQocm9sZTogc3RyaW5nKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zKSBcbiAgICAgICAgICAgICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbSBcbiAgICAgICAgICAgICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogYXJyYXkgb2YgV0FJLUFSSUEgZ2xvYmFsIHN0YXRlcyBhbmQgcHJvcGVydGllc1xuICAgICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMi8jZ2xvYmFsX3N0YXRlc1xuICAgICAqL1xuICAgIHN0YXRpYyBnbG9iYWxQcm9wZXJ0aWVzIDogc3RyaW5nW10gPSBbXCJhcmlhLWF0b21pY1wiLCBcImFyaWEtYnVzeVwiLCBcImFyaWEtY29udHJvbHNcIiwgXCJhcmlhLWN1cnJlbnRcIiwgXCJhcmlhLWRlc2NyaWJlZGJ5XCIsIFxuICAgICAgICBcImFyaWEtZGV0YWlsc1wiLCBcImFyaWEtZmxvd3RvXCIsIFwiYXJpYS1oaWRkZW5cIiwgXCJhcmlhLWtleXNob3J0Y3V0c1wiLFxuICAgICAgICBcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIiwgXCJhcmlhLWxpdmVcIiwgXCJhcmlhLW93bnNcIiwgXCJhcmlhLXJlbGV2YW50XCIsIFwiYXJpYS1yb2xlZGVzY3JpcHRpb25cIlxuICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGFyZSBkZXByZWNhdGVkIGluIEFSSUEgMS4yLCB3aWxsIGluZGljYXRlIGRlcHJlY2F0aW9uIGluIGluZGl2aWR1YWwgcm9sZVxuICAgICAgICAsICdhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ1xuICAgIF07XG5cbiAgICAvL3Byb3BlcnRpZXMgY29udGFpbnMgaWQocykgdGhhdCByZWZlciB0byBvdGhlciBlbGVtZW50KHMpXG4gICAgc3RhdGljIHJlZmVyZW5jZVByb3BlcnRpZXMgOiBzdHJpbmdbXSA9IFtcImFyaWEtb3duc1wiLCBcImFyaWEtY29udHJvbHNcIiwgXCJhcmlhLWRlc2NyaWJlZGJ5XCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCIsIFwiYXJpYS1mbG93dG9cIiwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIl07XG5cbiAgICAvLyBkZXByZWNhdGVkIHJvbGVzXG4gICAgc3RhdGljIGdsb2JhbERlcHJlY2F0ZWRSb2xlcyA6IHN0cmluZ1tdID0gW1xuICAgICAgICAnZGlyZWN0b3J5JywgJ2RvYy1iaWJsaW9lbnRyeScsICdkb2MtZW5kbm90ZSdcbiAgICBdO1xuXG4gICAgLy8gdGhlIGZvbGxvd2luZyBhcmUgZGVwcmVjYXRlZCBpbiBBUklBIDEuMSBmb3IgYWxsIHRoZSByb2xlc1xuICAgIHN0YXRpYyBnbG9iYWxEZXByZWNhdGVkUHJvcGVydGllcyA6IHN0cmluZ1tdID0gW1xuICAgICAgICAnYXJpYS1ncmFiYmVkJywgJ2FyaWEtZHJvcGVmZmVjdCdcbiAgICBdO1xuICAgIFxuICAgIC8qXG4gICAgICogWFNEIGRhdGEgdHlwZXMgZm9yIGFsbCBXQUktQVJJQSBwcm9wZXJ0aWVzXG4gICAgICogYWxvbmcgd2l0aCB2YWxpZCB2YWx1ZXMgd2hlbiB0aGUgZGF0YSB0eXBlIGlzIE5NVE9LRU5cbiAgICAgKiBXQUktQVJJQSBwcm9wZXJ0aWVzIGRhdGEgdHlwZXMgZXhwbGFuZWQ6XG4gICAgICogIHR5cGU6IFVzZWQgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgdmFsdWVzIGFsbG93ZWQgZm9yIHRoZSBXQUktQVJJQSBwcm9wZXJ0eVxuICAgICAqICB2YWx1ZXM6IFVzZWQgdG8gaWRlbnRpZnkgc3BlY2lmaWMgdmFsdWVzIG9mIGFuIFdBSS1BUklBIHByb3BlcnR5IHdoZW4gdHlwZSBpcyBubXRva2VuXG4gICAgICogIGhpZGRlbklEUmVmU3VwcG9ydGVkOiBVc2VkIHRvIGlkZW50aWZ5IGlmIHRoZSBXQUktQVJJQSBwcm9wZXJ0eSBzdXBwb3J0cyByZWZlcmVuY2luZyBoaWRkZW4gSURcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZTogcmVmZXJzIHRvIFdBSS1BUklBIHByb3BlcnR5IHN1cHBvcnRzIGhpZGRlbiBJRCByZWZlcmVuY2VzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlOiByZWZlcnMgdG8gV0FJLUFSSUEgcHJvcGVydHkgZG9lcyBub3Qgc3VwcG9ydCBoaWRkZW4gSUQgcmVmZXJlbmNlc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHNldCB0byBmYWxzZSwgaWYgbm90IHNwZWNpZmllZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgcHJvcGVydHlEYXRhVHlwZXMgOiB7IFxuICAgICAgICBbcHJvcDogc3RyaW5nXSA6IHsgXG4gICAgICAgICAgICB0eXBlOiBzdHJpbmcsIFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ/OiBib29sZWFuLFxuICAgICAgICAgICAgdmFsdWVzPzogc3RyaW5nW10gXG4gICAgICAgIH1cbiAgICB9ID0ge1xuICAgICAgICBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtYXRvbWljXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImlubGluZVwiLCBcImxpc3RcIiwgXCJib3RoXCIsIFwibm9uZVwiLCBcInVuZGVmaW5lZFwiXSAvL2FkZCB1bmRlZmluZWQgdG8gaGFuZGxlIHZhbHVlIGVtcHR5XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1idXN5XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJtaXhlZFwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY29sY291bnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY29saW5kZXhcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY29sc3BhblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jb250cm9sc1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWN1cnJlbnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInBhZ2VcIiwgXCJzdGVwXCIsIFwibG9jYXRpb25cIiwgXCJkYXRlXCIsIFwidGltZVwiLCBcInRydWVcIiwgXCJmYWxzZVwiLCBcInVuZGVmaW5lZFwiXSAvL2FkZCB1bmRlZmluZWQgZm9yIGVtcHR5IHZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kZXNjcmliZWRieVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRldGFpbHNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRyb3BlZmZlY3RcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2Vuc1wiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJjb3B5XCIsIFwibW92ZVwiLCBcImxpbmtcIiwgXCJleGVjdXRlXCIsIFwicG9wdXBcIiwgXCJub25lXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1lcnJvcm1lc3NhZ2VcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZlwiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWZsb3d0b1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1ncmFiYmVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJtZW51XCIsIFwibGlzdGJveFwiLCBcInRyZWVcIiwgXCJncmlkXCIsIFwiZGlhbG9nXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1oaWRkZW5cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtaW52YWxpZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwic3BlbGxpbmdcIiwgXCJncmFtbWFyXCIsIFwidW5kZWZpbmVkXCJdIC8vYWRkIHVuZGVmaW5lZCBmb3IgZW1wdHkgdmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWtleXNob3J0Y3V0c1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGV2ZWxcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wib2ZmXCIsIFwicG9saXRlXCIsIFwiYXNzZXJ0aXZlXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tb2RhbFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbXVsdGlsaW5lXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJob3Jpem9udGFsXCIsIFwidmVydGljYWxcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW93bnNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1wbGFjZWhvbGRlclwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1wb3NpbnNldFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1wcmVzc2VkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJtaXhlZFwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVhZG9ubHlcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlbGV2YW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlbnNcIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiYWRkaXRpb25zXCIsIFwicmVtb3ZhbHNcIiwgXCJ0ZXh0XCIsIFwiYWxsXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZXF1aXJlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvd2NvdW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvd2luZGV4XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvd3NwYW5cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtc2V0c2l6ZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1zb3J0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJhc2NlbmRpbmdcIiwgXCJkZXNjZW5kaW5nXCIsIFwib3RoZXJcIiwgXCJub25lXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWxcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXZhbHVlbm93XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS12YWx1ZXRleHRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBkZXNpZ24gcGF0dGVybnMgZm9yIGNvbmNyZXRlIFdBSS1BUklBIHJvbGVzXG4gICAgICogbGVnaXRpbWF0ZSBrZXlzIGZvciBlYWNoIHJvbGUgaW5jbHVkZTpcbiAgICAgKlxuICAgICAqIC0gY29udGFpbmVyOiBhcHByb3ByaWF0ZSBjb250YWluZXIocykgZm9yIHRoYXQgcm9sZVxuICAgICAqIC0gcHJvcHM6IHN0YXRlcyBhbmQgcHJvcGVydGllcyB0aGF0IG1heSBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb2xlIChpbiBhZGRpdGlvbiB0byB0aGUgZ2xvYmFsIHN0YXRlcyBhbmQgcHJvcGVydGllcyBsaXN0ZWQgYWJvdmUpXG4gICAgICogLSByZXFQcm9wczogcmVxdWlyZWQgc3RhdGVzIG9yIHByb3BlcnRpZXMgZm9yIHRoaXMgcm9sZVxuICAgICAqIC0gcmVxQ2hpbGRyZW46IHJlcXVpcmVkIGNoaWxkcmVuIGZvciB0aGlzIHJvbGVcbiAgICAgKiAtIGh0bWxFcXVpdjogSFRNTCBlcXVpdmFsZW50IGZvciB0aGlzIHJvbGVcbiAgICAgKiAtIHJvbGVUeXBlOiBvbmUgb2Ygd2lkZ2V0LCBzdHJ1Y3R1cmUsIGxhbmRtYXJrLCBsaXZlUmVnaW9uLCB3aW5kb3cgKGFzIHNlZW4gaW4gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMi8jcm9sZXNfY2F0ZWdvcml6YXRpb24pXG4gICAgICogLSBuYW1lUmVxdWlyZWQ6IGRldGVybWluZXMgd2hldGhlciBhbiBhY2Nlc3NpYmxlIG5hbWUgaXMgcmVxdWlyZWQgZm9yIGEgd2lkZ2V0IChzZWUgQVJJQSBzcGVjLilcbiAgICAgKiAtIG5hbWVGcm9tOiBkZXRlcm1pbmVzIGhvdyBhbiBhY2Nlc3NpYmxlIG5hbWUgaXMgc3VwcGxpZWQgKGF1dGhvciBvciBjb250ZW50IC0gc2VlIEFSSUEgc3BlYy4pXG4gICAgICogLSBkZXByZWNhdGVkOiBpZiBwcmVzZW50LCBpbmRpY2F0ZXMgdGhhdCB0aGUgcm9sZSBpcyBkZXByZWNhdGVkLCBhbmQgcHJvdmlkZXMgYSBsaXN0IG9mIGFsdGVybmF0aXZlIHJvbGUocylcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzaWduUGF0dGVybnMgOiB7XG4gICAgICAgIFtyb2xlOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IHN0cmluZ1tdLFxuICAgICAgICAgICAgcHJvcHM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IHN0cmluZ1tdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBzdHJpbmcsXG4gICAgICAgICAgICByb2xlVHlwZT86IHN0cmluZyxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZD86IGJvb2xlYW4sXG4gICAgICAgICAgICBuYW1lRnJvbT86IHN0cmluZ1tdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbj86IGJvb2xlYW4sXG4gICAgICAgICAgICBkZXByZWNhdGVkPzogYm9vbGVhbixcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wcz86IHN0cmluZ1tdXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM/OiBzdHJpbmdbXVxuICAgICAgICB9XG4gICAgfSA9IHtcbiAgICAgICAgXCJhbGVydFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJhbGVydGRpYWxvZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1tb2RhbFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aW5kb3dcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYXBwbGljYXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtZXhwYW5kZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsIC8vIG9yIGNhbiBiZSBcIndpZGdldFwiXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYXJ0aWNsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYmFubmVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImJsb2NrcXVvdGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImJ1dHRvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcHJlc3NlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYnV0dG9uIHwgaW5wdXRbQHR5cGU9J2J1dHRvbiddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZmlndXJlXCIsIFwiZ3JpZFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNlbGxcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXJvd3NwYW5cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjaGVja2JveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSdjaGVja2JveCddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29kZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbHVtbmhlYWRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInJvd1wiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGluZGV4XCIsIFwiYXJpYS1jb2xzcGFuXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiLCBcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLXNvcnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRoW0BzY29wZT0nY29sJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29tYm9ib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29udHJvbHNcIiwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIl0sIC8vIGFyaWEtY29udHJvbHMgaXNuJ3QgYWN0dWFsbHkgcmVxdWlyZWQgd2hlbiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29tcGxlbWVudGFyeVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb21tZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb250ZW50aW5mb1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkZWZpbml0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZGVsZXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkaWFsb2dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbW9kYWxcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2luZG93XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICAgICAgXCJkaXJlY3RvcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJkb2MtYWJzdHJhY3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWFja25vd2xlZGdtZW50c1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYWZ0ZXJ3b3JkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1hcHBlbmRpeFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYmFja2xpbmtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYSB8IGxpbmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJpYmxpb2VudHJ5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibGlcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iaWJsaW9ncmFwaHlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJpYmxpb3JlZlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY2hhcHRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY29sb3Bob25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY29uY2x1c2lvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY292ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImltZ1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY3JlZGl0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1jcmVkaXRzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1kZWRpY2F0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lbmRub3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibGlcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZW5kbm90ZXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZXBpZ3JhcGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWVwaWxvZ3VlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lcnJhdGFcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWV4YW1wbGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWZvb3Rub3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1mb3Jld29yZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZ2xvc3NhcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWdsb3NzcmVmXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1pbmRleFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtaW50cm9kdWN0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1ub3RlcmVmXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1ub3RpY2VcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlYnJlYWtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIl0sIC8vIGFyaWEtZGlzYWJsZWQsIGFyaWEtdmFsdWVtYXgsIGFyaWEtdmFsdWVtaW4sIGFyaWEtdmFsdWV0ZXh0IGFyZSB2YWxpZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLCAvLyBhcmlhLXZhbHVlbm93IGlzIHJlcXVpcmVkIGlmIGZvY3VzYWJsZS4gVGhpcyBpcyBoYW5kbGVkIGluIHRoZSBjb2RlLlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIiwgLy8gb3Igd2lkZ2V0IGlmIGZvY3VzYWJsZVxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlbGlzdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFnZWZvb3RlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXBhZ2VoZWFkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYXJ0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wcmVmYWNlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wcm9sb2d1ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHVsbHF1b3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcW5hXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1zdWJ0aXRsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtdGlwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtdG9jXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvY3VtZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZW1waGFzaXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmZWVkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImZvcm1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImZvcm1cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImdlbmVyaWNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImRpdiB8IHNwYW5cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIiwgXCJhcmlhLXJvbGVkZXNjcmlwdGlvblwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJncmFwaGljcy1kb2N1bWVudFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImdyYXBoaWNzLW9iamVjdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgXCJncmFwaGljcy1zeW1ib2xcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwiZ3JpZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1jb2xjb3VudFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcm93Y291bnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyb3dcIiwgXCJyb3dncm91cFwiXSwgLy8gcm93Z3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRhYmxlXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImdyaWRjZWxsXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1lcnJvcm1lc3NhZ2VcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiLCBcImFyaWEtaW52YWxpZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiLCBcImFyaWEtc2VsZWN0ZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ3JvdXBcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImhlYWRpbmdcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1sZXZlbFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImgxIHwgaDIgfCBoMyB8IGg0IHwgaDUgfCBoNlwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiaW1nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbWdcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiaW5zZXJ0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibGlua1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYSB8IGxpbmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibGlzdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImxpc3RpdGVtXCJdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcIm9sIHwgdWxcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsaXN0Ym94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJncm91cFwiLCBcIm9wdGlvblwiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpc3RpdGVtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibGlcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsb2dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtYWluXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1hcmtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcIm1hcmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWFycXVlZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1hdGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogZmFsc2UsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudWJhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLCBcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1lbnVpdGVtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JvdXBcIiwgXCJtZW51XCIsIFwibWVudWJhclwiXSwgLy8gZ3JvdXAgb25seSBjb3VudHMgYXMgYSB2YWxpZCBjb250YWluZXIgaWYgaXQgaXMgY29udGFpbmVkIGluIGEgbWVudSBvciBtZW51YmFyXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcIm1lbnVpdGVtY2hlY2tib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBtZW51IG9yIG1lbnViYXJcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1lbnVpdGVtcmFkaW9cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBtZW51IG9yIG1lbnViYXJcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1ldGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtdmFsdWVub3dcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibmF2aWdhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJub25lXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm5vdGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiXSwgLy8gZ3JvdXAgb25seSBjb3VudHMgYXMgYSB2YWxpZCBjb250YWluZXIgaWYgaXQgaXMgY29udGFpbmVkIGluIGEgbGlzdGJveFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLWNoZWNrZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsIC8vIFwiYXJpYS1zZWxlY3RlZFwiIGhhcyBhIGRlZmF1bHRcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcIm9wdGlvblwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwYXJhZ3JhcGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwcmVzZW50YXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicHJvZ3Jlc3NiYXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicmFkaW9cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jaGVja2VkXCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW5wdXRbQHR5cGU9J3JhZGlvJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicmFkaW9ncm91cFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicmFkaW9cIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicmVnaW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJvd1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyaWRcIiwgXCJyb3dncm91cFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiY2VsbFwiLCBcImNvbHVtbmhlYWRlclwiLCBcImdyaWRjZWxsXCIsIFwicm93aGVhZGVyXCJdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRyXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicm93Z3JvdXBcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncmlkXCIsIFwidGFibGVcIiwgXCJ0cmVlZ3JpZFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0Ym9keSB8IHRmb290IHwgdGhlYWRcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyb3doZWFkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXJvd3NwYW5cIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zb3J0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0aFtAc2NvcGU9J3JvdyddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2Nyb2xsYmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNvbnRyb2xzXCIsIFwiYXJpYS12YWx1ZW5vd1wiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzZWFyY2hib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtYXV0b2NvbXBsZXRlXCIsIFwiYXJpYS1tdWx0aWxpbmVcIiwgXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSdzZWFyY2gnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzZXBhcmF0b3JcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIl0sIC8vIGFyaWEtZGlzYWJsZWQsIGFyaWEtdmFsdWVtYXgsIGFyaWEtdmFsdWVtaW4sIGFyaWEtdmFsdWV0ZXh0IGFyZSB2YWxpZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLCAvLyBhcmlhLXZhbHVlbm93IGlzIHJlcXVpcmVkIGlmIGZvY3VzYWJsZS4gVGhpcyBpcyBoYW5kbGVkIGluIHRoZSBjb2RlLlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIiwgLy8gb3Igd2lkZ2V0IGlmIGZvY3VzYWJsZVxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInNsaWRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtdmFsdWVub3dcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcblxuICAgICAgICBcInNwaW5idXR0b25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVlbm93XCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN0YXR1c1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN0cm9uZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN1YnNjcmlwdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN1Z2dlc3Rpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdXBlcnNjcmlwdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN3aXRjaFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInRhYmxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYmxlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGNvdW50XCIsIFwiYXJpYS1yb3djb3VudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiLCBcInJvd2dyb3VwXCIsIFwiY2FwdGlvblwiXSwgLy8gcm93Z3JvdXAgYW5kIGNhcHRpb24gYXJlIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0YWJsZVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYmxpc3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1vcmllbnRhdGlvblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInRhYlwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSwgXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0YWJwYW5lbFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGVybVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiZGZuXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRleHRib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtYXV0b2NvbXBsZXRlXCIsIFwiYXJpYS1tdWx0aWxpbmVcIiwgXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSd0ZXh0J11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGltZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRpbWVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidG9vbGJhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRvb2x0aXBcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLCAvLyBBUklBIDEuMiBoYXMgdGhpcyBhcyBuYW1lUmVxdWlyZWQ6IHRydWUsIGJ1dCBBUklBIDEuMyByZW1vdmVkIGl0IGJlY2F1c2UgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gcmVxdWlyZSBhIG5hbWUgb24gYSB0b29sdGlwLlxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRyZWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJncm91cFwiLCBcInRyZWVpdGVtXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidHJlZWdyaWRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtY29sY291bnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcm93Y291bnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyb3dcIiwgXCJyb3dncm91cFwiXSwgLy8gcm93Z3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRyZWVpdGVtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JvdXBcIiwgXCJ0cmVlXCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG4gICAgfSAvLyBlbmQgZGVzaWduUGF0dGVybnNcblxuICAgIC8vIGNvcGllZCBmcm9tIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NlbWFudGljcy1vdGhlci5odG1sI2Rpc2FibGVkLWVsZW1lbnRzXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5wdXQuaHRtbCNpbnB1dC10eXBlLWF0dHItc3VtbWFyeVxuICAgIHN0YXRpYyBlbGVtZW50c0FsbG93ZWREaXNhYmxlZCA9IFtcImJ1dHRvblwiLCBcImlucHV0XCIsIFwic2VsZWN0XCIsIFwidGV4dGFyZWFcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImZpZWxkc2V0XCJdOyAvLyBhbHNvIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudFxuICAgIHN0YXRpYyBlbGVtZW50c0FsbG93ZWRSZXF1aXJlZCA9IFtcInNlbGVjdFwiLCBcInRleHRhcmVhXCJdOyAvLyByZW1vdmUgJ2lucHV0JyBhbmQgYWRkIHRvIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnQsIGJlY3Vhc2UgcmVxdWlyZWQgaXMgbm90IHN1cHBvcnRlZCBvbiBpbnB1dEB0eXBlPVwicmFuZ2VcIiwgXCJjb2xvclwiLCBcImhpZGRlblwiIG9yIGFueSBidXR0b24gdHlwZXNcbiAgICBzdGF0aWMgZWxlbWVudHNBbGxvd2VkUmVhZE9ubHkgPSBbXCJ0ZXh0YXJlYVwiXTsgLy8gcmVtb3ZlICdpbnB1dCcgYW5kIGFkZCB0byB0aGUgaW5kaXZpZHVhbCBlbGVtZW50LCBiZWNhdXNlIHJlYWRvbmx5IGlzIG5vdCBzdXBwb3J0ZWQgb24gaW5wdXRAdHlwZT1cImNoZWNrYm94XCIsIFwicmFkaW9cIiwgXCJyYW5nZVwiLCBcImNvbG9yXCIsIFwiZmlsZVwiLCBoaWRkZW5cIiBvciBhbnkgYnV0dG9uIHR5cGVzXG5cblxuICAgIC8qIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFyaWEvI2RvY2NvbmZvcm1hbmNlXG4gICAgICAgICogZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50IGNvbnRhaW5zIHByb3BlcnRpZXMgb2YgdGhlIHRhZ3MgcmVsYXRlZCB0byByb2xlIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgYXR0cmlidXRlIHZhbHVlXG4gICAgICAgICogZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3MgY29udGFpbnMgdGhvc2UgdGFncyB0aGF0IHJlcXVpcmUgc3BlY2lhbCBjb25zaWRlcmF0aW9uc1xuICAgICAgICAqL1xuICAgIHN0YXRpYyBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQ6IHtcbiAgICAgICAgW3JvbGU6IHN0cmluZ106IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcbiAgICB9ID0ge1xuICAgICAgICBcImFiYnJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFkZHJlc3NcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcnRpY2xlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJmZWVkXCIsIFwibWFpblwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXNpZGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21wbGVtZW50YXJ5XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWRlZGljYXRpb25cIiwgXCJkb2MtZXhhbXBsZVwiLCBcImRvYy1mb290bm90ZVwiLCBcImRvYy1wdWxscXVvdGVcIiwgXCJkb2MtdGlwXCIsIFwiZmVlZFwiLCBcIm5vbmVcIiwgXCJub3RlXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmVnaW9uXCIsIFwic2VhcmNoXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImF1ZGlvXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJhc2VcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmRpXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJiZG9cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJsb2NrcXVvdGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJibG9ja3F1b3RlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJvZHlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbJ2FyaWEtaGlkZGVuJ10sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYnJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImNhbnZhc1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2FwdGlvblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnY2FwdGlvbiddLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImNpdGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImNvZGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb2RlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImNvbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb2xncm91cFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkYXRhbGlzdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpc3Rib3hcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImRkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGVsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZGVsZXRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGV0YWlsc1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZm5cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXJtXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRpYWxvZ1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImRpYWxvZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFsZXJ0ZGlhbG9nXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgIFwiZGxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJsaXN0XCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRlcm1cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJsaXN0aXRlbVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJlbVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZW1iZWRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIiwgXCJkb2N1bWVudFwiLCBcImltZ1wiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZmllbGRzZXRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyYWRpb2dyb3VwXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImZpZ2NhcHRpb25cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImZvcm1cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJmb3JtXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInNlYXJjaFwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoZWFkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImhncm91cFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoMlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImgzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoNVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImg2XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaHJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzZXBhcmF0b3JcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtcGFnZWJyZWFrXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJodG1sXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZG9jdW1lbnRcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImlmcmFtZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiLCBcImRvY3VtZW50XCIsIFwiaW1nXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJpbnNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJpbnNlcnRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwia2JkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJsYWJlbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImxlZ2VuZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImxpbmtcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWFpblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm1haW5cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm1hcFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXJrXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXRoXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibWF0aFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWVudVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyYWRpb2dyb3VwXCIsIFwidGFibGlzdFwiLCBcInRvb2xiYXJcIiwgXCJ0cmVlXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm1ldGFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWV0ZXJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJtZXRlclwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFsnYXJpYS12YWx1ZW1heCcsICdhcmlhLXZhbHVlbWluJ10sXG4gICAgICAgICAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm5hdlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm5hdmlnYXRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtaW5kZXhcIiwgXCJkb2MtcGFnZWxpc3RcIiwgXCJkb2MtdG9jXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJ0YWJsaXN0XCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJub3NjcmlwdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJvYmplY3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIiwgXCJkb2N1bWVudFwiLCBcImltZ1wiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJvbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyYWRpb2dyb3VwXCIsIFwidGFibGlzdFwiLCBcInRvb2xiYXJcIiwgXCJ0cmVlXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm9wdGdyb3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm9wdGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtc2VsZWN0ZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJvdXRwdXRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdGF0dXNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInBhcmFncmFwaFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJwYXJhbVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJwaWN0dXJlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhpZGRlblwiXSBcbiAgICAgICAgfSxcbiAgICAgICAgXCJwcmVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInByb2dyZXNzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicHJvZ3Jlc3NiYXJcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXZhbHVlbWF4XCJdIFxuICAgICAgICB9LFxuICAgICAgICBcInFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInJwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJydFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwicnVieVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwic2FtcFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2NyaXB0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnc2VhcmNoJ10sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbJ3NlYXJjaCcsICdmb3JtJywgJ2dyb3VwJywgJ25vbmUnLCAncHJlc2VudGF0aW9uJywgJ3JlZ2lvbiddLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNsb3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic21hbGxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNvdXJjZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzcGFuXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdHJvbmdcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdHJvbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3R5bGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3ViXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3Vic2NyaXB0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN1cFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN1cGVyc2NyaXB0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN2Z1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyYXBoaWNzLWRvY3VtZW50XCJdLCAvLyBhcyBkZWZpbmVkIGJ5IFNWRyBBQU1cbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0YWJsZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRhYmxlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRlbXBsYXRlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInRleHRhcmVhXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGZvb3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0aGVhZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRpbWVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0aW1lXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRpdGxlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInRyYWNrXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInVsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidmFyXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ2aWRlb1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3YnJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuXCJdXG4gICAgICAgIH1cbiAgICB9IC8vIGVuZCBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcblxuICAgIHN0YXRpYyBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnczoge1xuICAgICAgICBbcm9sZTogc3RyaW5nXToge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXSA6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcbiAgICAgICAgfSB8IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcbiAgICB9ID0ge1xuICAgICAgICBcImFcIjoge1xuICAgICAgICAgICAgXCJ3aXRoLWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlua1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gbm9uLWVtcHR5IGhyZWYgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImRvYy1iYWNrbGlua1wiLCBcImRvYy1iaWJsaW9yZWZcIiwgXCJkb2MtZ2xvc3NyZWZcIiwgXCJkb2Mtbm90ZXJlZlwiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtZGlzYWJsZWQ9dHJ1ZVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwid2l0aG91dC1ocmVmXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIGhyZWYgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmVhXCI6IHtcbiAgICAgICAgICAgIFwid2l0aC1ocmVmXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpbmtcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vbi1lbXB0eSBocmVmIGF0dHJpYnV0ZSBpcyBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aXRob3V0LWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gaHJlZiBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJidXR0b25cIiwgXCJsaW5rXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbi8vIFRPRE9cbi8vICAgICAgICBcImF1dG9ub21vdXMgY3VzdG9tIGVsZW1lbnRcIjoge1xuLy8gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIlJvbGUgZXhwb3NlZCBmcm9tIGF1dGhvciBkZWZpbmVkIEVsZW1lbnRJbnRlcm5hbHMuIE90aGVyd2lzZSBubyBjb3JyZXNwb25kaW5nIHJvbGUuXCJdLFxuLy8gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJJZiByb2xlIGRlZmluZWQgYnkgRWxlbWVudEludGVybmFsc1wiLCBcImFueSByb2xlXCIsIFwibm8gcm9sZSBPdGhlcndpc2VcIl0sXG4vLyAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbi8vICAgICAgICB9LFxuICAgICAgICBcImRpdlwiOiB7XG4gICAgICAgICAgICBcImNoaWxkLWRsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wicHJlc2VudGF0aW9uXCIsIFwibm9uZVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuby1jaGlsZC1kbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlndXJlXCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtZmlnY2FwdGlvblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJmaWd1cmVcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogWydkb2MtZXhhbXBsZSddLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLWZpZ2NhcHRpb25cIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZmlndXJlXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZm9vdGVyXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXNlY3Rpb24tYXJ0aWNsZS1hc2lkZS1tYWluLW5hdlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWZvb3Rub3RlXCIsIFwiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbnRlbnRpbmZvXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBub3QgYSBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWZvb3Rub3RlXCIsIFwiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbi8vIFRPRE9cbi8vICAgICAgICBcImZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudFwiOiB7XG4vLyAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiUm9sZSBleHBvc2VkIGZyb20gYXV0aG9yIGRlZmluZWQgRWxlbWVudEludGVybmFscy4gT3RoZXJ3aXNlICdnZW5lcmljJy5cIl0sXG4vLyAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIklmIHJvbGUgZGVmaW5lZCBieSBFbGVtZW50SW50ZXJuYWxzXCIsIFwiZm9ybS1yZWxhdGVkIHJvbGVzOiBidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JvdXBcIiwgXCJsaXN0Ym94XCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJyYWRpb1wiLCBcInJhZGlvZ3JvdXBcIiwgXCJzZWFyY2hib3hcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCIsIFwic3dpdGNoXCIsIFwidGV4dGJveFwiLCBcIm5vIHJvbGUgT3RoZXJ3aXNlXCJdLFxuLy8gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4vLyAgICAgICAgfSxcblxuICAgICAgICBcImhlYWRlclwiOiB7XG4gICAgICAgICAgICBcImRlcy1zZWN0aW9uLWFydGljbGUtYXNpZGUtbWFpbi1uYXZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gZGVzY2VuZGFudCBvZiBhbiBhcnRpY2xlLCBhc2lkZSwgbWFpbiwgbmF2IG9yIHNlY3Rpb24gZWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJiYW5uZXJcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vdCBhIGRlc2NlbmRhbnQgb2YgYW4gYXJ0aWNsZSwgYXNpZGUsIG1haW4sIG5hdiBvciBzZWN0aW9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG4gICAgICAgIFwiaW1nXCI6IHtcbiAgICAgICAgICAgIFwiaW1nLXdpdGgtYWx0LXRleHRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaW1nXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBhbHQgYXR0cmlidXRlIGhhcyB0ZXh0IChpcyBub3QgZW1wdHkpXCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYnV0dG9uXCIsIFwiY2hlY2tib3hcIiwgXCJkb2MtY292ZXJcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInByb2dyZXNzYmFyXCIsIFwicmFkaW9cIiwgXCJzY3JvbGxiYXJcIiwgXCJzZXBhcmF0b3JcIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbWctd2l0aC1lbXB0eS1hbHRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBhbHQgYXR0cmlidXRlIGlzIGVtcHR5XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSwgXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuPXRydWVcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImltZy13aXRob3V0LWFsdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJpbWdcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIGFsdCBhdHRyaWJ1dGUsIGFyaWEtbGFiZWwsIG9yIGFyaWEtbGFiZWxsZWRieSBhcmUgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLCBcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW49dHJ1ZVwiXVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImlucHV0XCI6IHtcbiAgICAgICAgICAgIFwiYnV0dG9uXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JpZGNlbGxcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2hlY2tib3gtd2l0aC1hcmlhLXByZXNzZWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY2hlY2tib3hcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIHR5cGU9Y2hlY2tib3ggYW5kIGFyaWEtcHJlc3NlZCBhdHRyaWJ1dGUgaXMgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNoZWNrYm94LXdpdGhvdXQtYXJpYS1wcmVzc2VkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNoZWNrYm94XCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCB0eXBlPWNoZWNrYm94IGFuZCBhcmlhLXByZXNzZWQgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibWVudWl0ZW1jaGVja2JveFwiLCBcIm9wdGlvblwiLCBcInN3aXRjaFwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNvbG9yXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkYXRlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGF0ZXRpbWUtbG9jYWxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbWFpbC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIHR5cGU9ZW1haWwgYW5kIG5vIGxpc3QgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW1haWwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImhpZGRlblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImltYWdlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1vbnRoXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJudW1iZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3BpbmJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInBhc3N3b3JkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInJhZGlvXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJhZGlvXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm1lbnVpdGVtcmFkaW9cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1jaGVja2VkXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJyYW5nZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzbGlkZXJcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVzZXRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWFyY2gtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzZWFyY2hib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlYXJjaC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzdWJtaXRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZWwtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZWwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY29tYm9ib3hcIiwgXCJzZWFyY2hib3hcIiwgXCJzcGluYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGFzcG9wdXBcIl0gIC8vIGNvdmVyZWQgaW4gYSBkaWZmZXJlbnQgcnVsZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGltZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidXJsLW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidXJsLXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndlZWtcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlZmF1bHQtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICAvLyBpbnB1dCB3aXRoIGEgbWlzc2luZyBvciBpbnZhbGlkIHR5cGUsIHdpdGggYSBsaXN0IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZWZhdWx0LW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHdpdGggYSBtaXNzaW5nIG9yIGludmFsaWQgdHlwZSwgd2l0aCBhIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImxpXCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtb2YtbGlzdC1yb2xlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnbGlzdGl0ZW0nXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLW9mLWxpc3Qtcm9sZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbJ2dlbmVyaWMnXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY3Rpb25cIjoge1xuICAgICAgICAgICAgXCJ3aXRoLW5hbWVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicmVnaW9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFsZXJ0XCIsIFwiYWxlcnRkaWFsb2dcIiwgXCJhcHBsaWNhdGlvblwiLCBcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImRpYWxvZ1wiLCBcImRvYy1hYnN0cmFjdFwiLCBcImRvYy1hY2tub3dsZWRnbWVudHNcIiwgXCJkb2MtYWZ0ZXJ3b3JkXCIsIFwiZG9jLWFwcGVuZGl4XCIsIFwiZG9jLWJpYmxpb2dyYXBoeVwiLCBcImRvYy1jaGFwdGVyXCIsIFwiZG9jLWNvbG9waG9uXCIsIFwiZG9jLWNvbmNsdXNpb25cIiwgXCJkb2MtY3JlZGl0XCIsIFwiZG9jLWNyZWRpdHNcIiwgXCJkb2MtZGVkaWNhdGlvblwiLCBcImRvYy1lbmRub3Rlc1wiLCBcImRvYy1lcGlncmFwaFwiLCBcImRvYy1lcGlsb2d1ZVwiLCBcImRvYy1lcnJhdGFcIiwgXCJkb2MtZXhhbXBsZVwiLCBcImRvYy1mb3Jld29yZFwiLCBcImRvYy1nbG9zc2FyeVwiLCBcImRvYy1pbmRleFwiLCBcImRvYy1pbnRyb2R1Y3Rpb25cIiwgXCJkb2Mtbm90aWNlXCIsIFwiZG9jLXBhZ2VsaXN0XCIsIFwiZG9jLXBhcnRcIiwgXCJkb2MtcHJlZmFjZVwiLCBcImRvYy1wcm9sb2d1ZVwiLCBcImRvYy1wdWxscXVvdGVcIiwgXCJkb2MtcW5hXCIsIFwiZG9jLXRvY1wiLCBcImRvY3VtZW50XCIsIFwiZmVlZFwiLCBcImdyb3VwXCIsIFwibG9nXCIsIFwibWFpblwiLCBcIm1hcnF1ZWVcIiwgXCJuYXZpZ2F0aW9uXCIsIFwibm9uZVwiLCBcIm5vdGVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJzZWFyY2hcIiwgXCJzdGF0dXNcIiwgXCJ0YWJwYW5lbFwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aXRob3V0LW5hbWVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbGVydFwiLCBcImFsZXJ0ZGlhbG9nXCIsIFwiYXBwbGljYXRpb25cIiwgXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIiwgXCJkaWFsb2dcIiwgXCJkb2MtYWJzdHJhY3RcIiwgXCJkb2MtYWNrbm93bGVkZ21lbnRzXCIsIFwiZG9jLWFmdGVyd29yZFwiLCBcImRvYy1hcHBlbmRpeFwiLCBcImRvYy1iaWJsaW9ncmFwaHlcIiwgXCJkb2MtY2hhcHRlclwiLCBcImRvYy1jb2xvcGhvblwiLCBcImRvYy1jb25jbHVzaW9uXCIsIFwiZG9jLWNyZWRpdFwiLCBcImRvYy1jcmVkaXRzXCIsIFwiZG9jLWRlZGljYXRpb25cIiwgXCJkb2MtZW5kbm90ZXNcIiwgXCJkb2MtZXBpZ3JhcGhcIiwgXCJkb2MtZXBpbG9ndWVcIiwgXCJkb2MtZXJyYXRhXCIsIFwiZG9jLWV4YW1wbGVcIiwgXCJkb2MtZm9yZXdvcmRcIiwgXCJkb2MtZ2xvc3NhcnlcIiwgXCJkb2MtaW5kZXhcIiwgXCJkb2MtaW50cm9kdWN0aW9uXCIsIFwiZG9jLW5vdGljZVwiLCBcImRvYy1wYWdlbGlzdFwiLCBcImRvYy1wYXJ0XCIsIFwiZG9jLXByZWZhY2VcIiwgXCJkb2MtcHJvbG9ndWVcIiwgXCJkb2MtcHVsbHF1b3RlXCIsIFwiZG9jLXFuYVwiLCBcImRvYy10b2NcIiwgXCJkb2N1bWVudFwiLCBcImZlZWRcIiwgXCJncm91cFwiLCBcImxvZ1wiLCBcIm1haW5cIiwgXCJtYXJxdWVlXCIsIFwibmF2aWdhdGlvblwiLCBcIm5vbmVcIiwgXCJub3RlXCIsIFwicHJlc2VudGF0aW9uXCIsIFwic2VhcmNoXCIsIFwic3RhdHVzXCIsIFwidGFicGFuZWxcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlbGVjdFwiOiB7XG4gICAgICAgICAgICBcIm5vLW11bHRpcGxlLWF0dHItc2l6ZS1ndDFcIjoge1xuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCBhIG11bHRpcGxlIGF0dHJpYnV0ZSBvciBhIHNpemUgYXR0cmlidXRlIGhhdmluZyB2YWx1ZSBncmVhdGVyIHRoYW4gMVwiXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJtZW51XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJtdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCI6IHtcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdpdGggbm8gbXVsdGlwbGUgYXR0cmlidXRlIGFuZCBubyBzaXplIGF0dHJpYnV0ZSBoYXZpbmcgdmFsdWUgZ3JlYXRlciB0aGFuIDFcIlxuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCJdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3VtbWFyeVwiOiB7XG4gICAgICAgICAgICBcImZpcnN0LXN1bW1hcnktb2YtZGV0YWlsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibm8tZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRib2R5XCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dncm91cFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLXRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtb3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRkXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidGhcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGUtZ3JpZC10cmVlZ3JpZC1yb3ctc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93aGVhZGVyXCIsIFwiY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10YWJsZS1ncmlkLXRyZWVncmlkLWNvbHVtbi1zY29wZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb2x1bW5oZWFkZXJcIiwgXCJjZWxsXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLW90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ0clwiOiB7XG4gICAgICAgICAgICBcImRlcy10YWJsZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtdHJlZWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLW90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwiZGVmYXVsdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiXCIsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH1cbiAgICB9IC8vIGVuZCBvZiBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1xuXG4gICAgLy8gbWFwIGFyaWEgYXR0cmlidXRlIHRvIHRoZSBjb3JyZXNwb25kaW5nIG5hdGl2ZSBhdHRyaWJ1dGUsIGFwcGx5IHRvIGFueSBlbGVtZW50IGFwcGxpY2FibGVcbiAgICAvLyBub3RlIHRoaXMgbWFwcGluZyBpcyBmb3IgdGhlIHJlbGF0ZWQgYXR0cmlidXRlcyBpbiB0aGUgc2FtZSBlbGVtZW50IHdpdGhvdXQgY2hlY2tpbmcgdGhlIHBhcmVudCB0cmVlLlxuICAgIC8vIHJlZmVyIHRvIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9odG1sLWFyaWEvXG4gICAgc3RhdGljIHJlbGF0ZWRBcmlhSHRtbEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgW2FyaWFBdHRyOiBzdHJpbmddIDoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IHtcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IHN0cmluZyB8IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBzdHJpbmdbXSB8IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVybGFwcGluZz86IHsgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogc3RyaW5nW10gfCBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gXG4gICAgfSA9ICB7XG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjaGVja2VkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiY2hlY2tlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICAgIFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IHtcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImRpc2FibGVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiZGlzYWJsZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJoaWRkZW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiB7ICAgIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJoaWRkZW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicGxhY2Vob2xkZXJcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wibWF4XCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vb3ZlcmxhcCBjYXNlIGNvdmVyZWQgaW4gdGhlIHJvbGUgZGVmaW5pdGlvbjogQXV0aG9ycyBTSE9VTEQgTk9UIHVzZSBhcmlhLXZhbHVlbWF4IG9uIGFueSBlbGVtZW50IHdoaWNoIGFsbG93cyB0aGUgbWF4IGF0dHJpYnV0ZS4gVXNlIHRoZSBtYXggYXR0cmlidXRlIGluc3RlYWQuIFxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wibWluXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vLy9vdmVybGFwIGNhc2UgY292ZXJlZCBpbiB0aGUgcm9sZSBkZWZpbml0aW9uOkF1dGhvcnMgU0hPVUxEIE5PVCB1c2UgYXJpYS12YWx1ZW1pbiBvbiBhbnkgZWxlbWVudCB3aGljaCBhbGxvd3MgdGhlIG1pbiBhdHRyaWJ1dGUuIFVzZSB0aGUgbWluIGF0dHJpYnV0ZSBpbnN0ZWFkLlxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJyZWFkb25seVwiLCBcImNvbnRlbnRlZGl0YWJsZVwiLCBcImlzY29udGVudGVkaXRhYmxlXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtudWxsLCBcImZhbHNlXCIsIFwiZmFsc2VcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicmVhZG9ubHlcIiwgXCJjb250ZW50ZWRpdGFibGVcIiwgXCJpc2NvbnRlbnRlZGl0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbbnVsbCwgXCJ0cnVlXCIsIFwidHJ1ZVwiXVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IHtcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicmVxdWlyZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIFwiYXJpYS1jb2xzcGFuXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgLy8gY29uZmxpY3Qgb2NjdXJzIGlmIGJvdGggdmFsdWVzIGFyZSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiVkFMVUVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImNvbHNwYW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW1wiVkFMVUVcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogeyAgICBcbiAgICAgICAgICAgICAgICAvLyBvdmVybGFwIG9jY3VycyBpZiBib3RoIGV4aXN0c1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImNvbHNwYW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm93c3BhblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0IG9jY3VycyBpZiBib3RoIHZhbHVlcyBhcmUgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcIlZBTFVFXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJyb3dzcGFuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcIlZBTFVFXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IHsgICBcbiAgICAgICAgICAgICAgICAvLyBvdmVybGFwIG9jY3VycyBpZiBib3RoIGV4aXN0cyBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJyb3dzcGFuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWF1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0IG9jY3VycyBpZiBib3RoIHZhbHVlcyBhcmUgY29uZmxpY3RcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiYXV0b2NvbXBsZXRlXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcIm9uXCJdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gIFxuICAgIH1cblxuICAgIHN0YXRpYyBjb250YWluZXJzID0gW11cbn07XG5cbmxldCBjb250YWluZXJBcnJheSA9IFtdO1xuXG5mb3IgKGNvbnN0IHJvbGVEZXNpZ24gaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zKSB7XG4gICAgY29uc3QgY29udGFpbmVycyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlRGVzaWduXS5jb250YWluZXI7XG4gICAgaWYgKGNvbnRhaW5lcnMgIT09IG51bGwpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgY29udGFpbmVycykge1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lckFycmF5LmluZGV4T2YoY29udGFpbmVyKSA9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lckFycmF5LnB1c2goY29udGFpbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbkFSSUFEZWZpbml0aW9ucy5jb250YWluZXJzID0gY29udGFpbmVyQXJyYXk7XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQ29tbW9uTWFwcGVyIH0gZnJvbSBcIi4uL2NvbW1vbi9Db21tb25NYXBwZXJcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vZG9tL0RPTVV0aWxcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCJcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgSU1hcFJlc3VsdCB9IGZyb20gXCIuLi8uLi92NC9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgQVJJQVdhbGtlciB9IGZyb20gXCIuL0FSSUFXYWxrZXJcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi8uLi92NC91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcbnR5cGUgRWxlbUNhbGMgPSAoZWxlbTogRWxlbWVudCkgPT4gc3RyaW5nO1xudHlwZSBOb2RlQ2FsYyA9IChub2RlOiBOb2RlKSA9PiBzdHJpbmc7XG5cbmV4cG9ydCBjbGFzcyBBUklBTWFwcGVyIGV4dGVuZHMgQ29tbW9uTWFwcGVyIHtcbiAgICBjaGlsZHJlbkNhbkhhdmVSb2xlKG5vZGU6IE5vZGUsIHJvbGU6IHN0cmluZykgOiBib29sZWFuIHtcbiAgICAgICAgLy8gaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuICEocm9sZSBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLnByZXNlbnRhdGlvbmFsQ2hpbGRyZW4pO1xuICAgIH1cbiAgICBnZXRSb2xlKG5vZGU6IE5vZGUpIDogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShub2RlKTtcbiAgICAgICAgcmV0dXJuIHJvbGU7XG4gICAgfVxuICAgIGdldE5hbWVzcGFjZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJhcmlhXCJcbiAgICB9XG4gICAgZ2V0QXR0cmlidXRlcyhub2RlOiBOb2RlKSA6IHsgW2tleTpzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgICAgIGxldCByZXRWYWwgPSB7fTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGVsZW0uYXR0cmlidXRlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0ckluZm8gPSBlbGVtLmF0dHJpYnV0ZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gYXR0ckluZm8ubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJhcmlhLVwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWxbbmFtZS5zdWJzdHJpbmcoNSldID0gYXR0ckluZm8ubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGFwcGx5QXR0clJvbGU9IGZ1bmN0aW9uKG5vZGVOYW1lOnN0cmluZykge1xuICAgICAgICAgICAgICAgIGlmICghKG5vZGVOYW1lIGluIEFSSUFNYXBwZXIuZWxlbUF0dHJWYWx1ZUNhbGN1bGF0b3JzKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXR0ciBpbiBBUklBTWFwcGVyLmVsZW1BdHRyVmFsdWVDYWxjdWxhdG9yc1tub2RlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoYXR0ciBpbiByZXRWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBBUklBTWFwcGVyLmVsZW1BdHRyVmFsdWVDYWxjdWxhdG9yc1tub2RlTmFtZV1bYXR0cl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9IFwidW5kZWZpbmVkXCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSB0eXBlb2YgXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBOb2RlQ2FsYykoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbFthdHRyXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcGx5QXR0clJvbGUoXCJnbG9iYWxcIik7XG4gICAgICAgICAgICBhcHBseUF0dHJSb2xlKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyIGluIEFSSUFNYXBwZXIudGV4dEF0dHJWYWx1ZUNhbGN1bGF0b3JzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IEFSSUFNYXBwZXIudGV4dEF0dHJWYWx1ZUNhbGN1bGF0b3JzW2F0dHJdKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsICE9IFwidW5kZWZpbmVkXCIgJiYgdmFsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbFthdHRyXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0QXJpYU93bmVkQnkoZWxlbTogSFRNTEVsZW1lbnQpIDogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgZG9jID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQoZWxlbSk7XG4gICAgICAgIGlmICghZ2V0Q2FjaGUoZG9jLCBcIkFSSUFNYXBwZXI6OnByZWNhbGNPd25lZFwiLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG93bmVycyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFwiW2FyaWEtb3duc11cIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpT3duZXIgPSAwOyBpT3duZXIgPCBvd25lcnMubGVuZ3RoOyArK2lPd25lcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG93bmVyID0gb3duZXJzW2lPd25lcl07XG4gICAgICAgICAgICAgICAgY29uc3Qgb3duSWRzID0gb3duZXIuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpSWQ9MDsgaUlkIDwgb3duSWRzLmxlbmd0aDsgKytpSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZWQgPSBkb2MuZ2V0RWxlbWVudEJ5SWQob3duSWRzW2lJZF0pO1xuICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZSBpZiB0aGUgYXJpYS1vd25zIHBvaW50IHRvIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgICAgICAgICAgICAgICAgICBpZiAob3duZWQgJiYgIURPTVV0aWwuc2FtZU5vZGUob3duZXIsIG93bmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FjaGUob3duZWQsIFwiYXJpYS1vd25lZFwiLCBvd25lcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRDYWNoZShkb2MsIFwiQVJJQU1hcHBlcjo6cHJlY2FsY093bmVkXCIsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRDYWNoZShlbGVtLCBcImFyaWEtb3duZWRcIiwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROb2RlSGllcmFyY2h5KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlKSByZXR1cm4gW107XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50SGllcmFyY2h5ID0gdGhpcy5nZXROb2RlSGllcmFyY2h5KERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpKTtcbiAgICAgICAgICAgIGxldCBwYXJlbnRJbmZvID0gcGFyZW50SGllcmFyY2h5Lmxlbmd0aCA+IDAgPyBwYXJlbnRIaWVyYXJjaHlbcGFyZW50SGllcmFyY2h5Lmxlbmd0aC0xXSA6IHtcbiAgICAgICAgICAgICAgICByb2xlOiBcIlwiLFxuICAgICAgICAgICAgICAgIHJvbGVQYXRoOiBcIlwiLFxuICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBub2RlSGllcmFyY2h5ID0gW107XG4gICAgICAgICAgICAvLyBTZXQgaGllcmFyY2h5XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50SGllcmFyY2h5KSB7XG4gICAgICAgICAgICAgICAgbm9kZUhpZXJhcmNoeS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZUhpZXJhcmNoeS5wdXNoKHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgICAgICAgICAgICBib3VuZHM6IHRoaXMuZ2V0Qm91bmRzKG5vZGUpLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogdGhpcy5nZXROYW1lc3BhY2UoKSxcbiAgICAgICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgICAgIHJvbGU6IHRoaXMuZ2V0Um9sZShub2RlKSB8fCBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogcGFyZW50SW5mby5yb2xlUGF0aCtcIi9cIisodGhpcy5nZXRSb2xlKG5vZGUpIHx8IFwibm9uZVwiKSxcbiAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHt9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHBhcmVudEluZm8uY2hpbGRyZW5DYW5IYXZlUm9sZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZUhpZXJhcmNoeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGxldCBub2RlSGllcmFyY2h5IDogQXJyYXk8e1xuICAgICAgICAgICAgICAgIHJvbGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge1xuICAgICAgICAgICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogbnVtYmVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IGJvb2xlYW5cbiAgICAgICAgICAgIH0+ID0gZ2V0Q2FjaGUoZWxlbSwgXCJBUklBTWFwcGVyOjpnZXROb2RlSGllcmFyY2h5XCIsIG51bGwpO1xuICAgICAgICAgICAgaWYgKCFub2RlSGllcmFyY2h5KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBlbGVtZW50IGhhc24ndCBiZWVuIHByb2Nlc3NlZCB5ZXQgLSBidXQgOjpyZXNldCBwcm9jZXNzZXMgdGhlbSBhbGwgaW4gdGhlIHJpZ2h0IG9yZGVyXG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgZGV0YWlscyBhYm91dCB0aGUgY29ycmVjdCBwYXJlbnQgZmlyc3RcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gQVJJQU1hcHBlci5nZXRBcmlhT3duZWRCeShlbGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRIaWVyYXJjaHkgPSBwYXJlbnQgPyB0aGlzLmdldE5vZGVIaWVyYXJjaHkocGFyZW50KSA6IFtdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRJbmZvID0gcGFyZW50SGllcmFyY2h5Lmxlbmd0aCA+IDAgPyBwYXJlbnRIaWVyYXJjaHlbcGFyZW50SGllcmFyY2h5Lmxlbmd0aC0xXSA6IHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZTogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHRydWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnRJbmZvLnJvbGUgPT09IFwibm9uZVwiIHx8IHBhcmVudEluZm8ucm9sZSA9PT0gXCIvbm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkocGFyZW50KSB8fCBET01XYWxrZXIucGFyZW50RWxlbWVudChwYXJlbnQpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRIaWVyYXJjaHkgPSBwYXJlbnQgPyB0aGlzLmdldE5vZGVIaWVyYXJjaHkocGFyZW50KSA6IFtdO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRJbmZvID0gcGFyZW50SGllcmFyY2h5W3BhcmVudEhpZXJhcmNoeS5sZW5ndGgtMV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgbm9kZSBpbmZvXG4gICAgICAgICAgICAgICAgbGV0IG5vZGVJbmZvIDoge1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYm91bmRzOiBhbnksXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBub2RlOiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgcm9sZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICByb2xlUGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb2xlOiBzdHJpbmddOiBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbkNhbkhhdmVSb2xlOiBib29sZWFuXG4gICAgICAgICAgICAgICAgfSA9IHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogZWxlbS5ub2RlVHlwZSA9PT0gMSA/IHRoaXMuZ2V0QXR0cmlidXRlcyhlbGVtKToge30sICAgXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kczogdGhpcy5nZXRCb3VuZHMoZWxlbSksXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogdGhpcy5nZXROYW1lc3BhY2UoKSxcbiAgICAgICAgICAgICAgICAgICAgbm9kZTogZWxlbSxcbiAgICAgICAgICAgICAgICAgICAgcm9sZTogdGhpcy5nZXRSb2xlKGVsZW0pIHx8IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkanVzdCByb2xlIGlmIHdlJ3JlIHdpdGhpbiBhIHByZXNlbnRhdGlvbmFsIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50YXRpb25hbENvbnRhaW5lciA9ICFwYXJlbnRJbmZvLmNoaWxkcmVuQ2FuSGF2ZVJvbGU7XG4gICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbmFsQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLnJvbGUgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlID0gcGFyZW50SW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlIFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5jaGlsZHJlbkNhbkhhdmVSb2xlKGVsZW0sIG5vZGVJbmZvLnJvbGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcGF0aHNcbiAgICAgICAgICAgICAgICBpZiAobm9kZUluZm8ucm9sZSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SW5mby5yb2xlQ291bnRbbm9kZUluZm8ucm9sZV0gPSAocGFyZW50SW5mby5yb2xlQ291bnRbbm9kZUluZm8ucm9sZV0gfHwgMCkgKyAxOyBcbiAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8ucm9sZVBhdGggPSBwYXJlbnRJbmZvLnJvbGVQYXRoK1wiL1wiK25vZGVJbmZvLnJvbGUrXCJbXCIrcGFyZW50SW5mby5yb2xlQ291bnRbbm9kZUluZm8ucm9sZV0rXCJdXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8ucm9sZVBhdGggPSBwYXJlbnRJbmZvLnJvbGVQYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IGhpZXJhcmNoeVxuICAgICAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkgPSBbXVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRIaWVyYXJjaHkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZUhpZXJhcmNoeS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlSGllcmFyY2h5LnB1c2gobm9kZUluZm8pO1xuICAgICAgICAgICAgICAgIHNldENhY2hlKGVsZW0sIFwiQVJJQU1hcHBlcjo6Z2V0Tm9kZUhpZXJhcmNoeVwiLCBub2RlSGllcmFyY2h5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlSGllcmFyY2h5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXQobm9kZTogTm9kZSkge1xuICAgICAgICBBUklBTWFwcGVyLm5hbWVDb21wdXRhdGlvbklkID0gMDtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IFtdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVBhdGggPSBbe1xuICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICByb2xlQ291bnQ6IHt9XG4gICAgICAgIH1dO1xuICAgICAgICAvLyBHZXQgdG8gdGhlIHRvcG1vc3Qgbm9kZVxuICAgICAgICBsZXQgZ29vZE5vZGUgPSBub2RlO1xuICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgd2hpbGUgKG5leHQgPSBET01XYWxrZXIucGFyZW50Tm9kZShnb29kTm9kZSkpIHtcbiAgICAgICAgICAgIGdvb2ROb2RlID0gbmV4dDtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gV2FsayB0aGUgdHJlZSBhbmQgc2V0IHRoZSBoaWVyYXJjaGllcyBpbiB0aGUgcmlnaHQgb3JkZXJcbiAgICAgICAgbGV0IGFyaWFXYWxrZXIgPSBuZXcgQVJJQVdhbGtlcihnb29kTm9kZSwgZmFsc2UsIGdvb2ROb2RlKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGFyaWFXYWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShhcmlhV2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChhcmlhV2Fsa2VyLm5leHROb2RlKCkpO1xuICAgIH1cblxuICAgIG9wZW5TY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5Um9sZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnB1c2hIaWVyYXJjaHkobm9kZSlcbiAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDx0aGlzLmhpZXJhcmNoeVJlc3VsdHMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGVbMF0gPT09IFwiL1wiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzW2lkeF0ucm9sZSA9IHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmhpZXJhcmNoeVJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVzaEhpZXJhcmNoeShub2RlOiBOb2RlKSB7XG4gICAgICAgIC8vIElmIHdlJ3JlIG5vdCBhbiBlbGVtZW50LCBubyBzcGVjaWFsIGhhbmRsaW5nXG4gICAgICAgIGxldCBub2RlSGllcmFyY2h5ID0gW11cbiAgICAgICAgLy8gRGV0ZXJtaW5lIG91ciBub2RlIGluZm9cbiAgICAgICAgbm9kZUhpZXJhcmNoeSA9IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShub2RlKTtcbiAgICAgICAgbGV0IG5vZGVJbmZvID0gbm9kZUhpZXJhcmNoeVtub2RlSGllcmFyY2h5Lmxlbmd0aC0xXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlLnB1c2gobm9kZUluZm8ucm9sZSk7XG4gICAgICAgIGlmIChub2RlSW5mby5yb2xlICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlQYXRoLnB1c2gobm9kZUluZm8pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzID0gbm9kZUhpZXJhcmNoeTtcbiAgICB9XG5cbiAgICBjbG9zZVNjb3BlKG5vZGU6IE5vZGUpOiBJTWFwUmVzdWx0W10ge1xuICAgICAgICBsZXQgcmV0VmFsIDogSU1hcFJlc3VsdFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHRoaXMuaGllcmFyY2h5UmVzdWx0cykge1xuICAgICAgICAgICAgLy8gY29uc3QgdGVtcCA9IHJlcy5ub2RlO1xuICAgICAgICAgICAgLy8gcmVzLm5vZGUgPSBudWxsO1xuICAgICAgICAgICAgLy8gbGV0IGNsb25lZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzKSk7XG4gICAgICAgICAgICAvLyBjbG9uZWQubm9kZSA9IHJlcy5ub2RlID0gdGVtcDsgXG4gICAgICAgICAgICAvLyByZXRWYWwucHVzaChjbG9uZWQpO1xuICAgICAgICAgICAgcmV0VmFsLnB1c2gocmVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldFZhbFtyZXRWYWwubGVuZ3RoLTFdLnJvbGUgPSBcIi9cIityZXRWYWxbcmV0VmFsLmxlbmd0aC0xXS5yb2xlXG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSk7XG4gICAgICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMgPSBwYXJlbnQgPyBnZXRDYWNoZShwYXJlbnQgYXMgSFRNTEVsZW1lbnQsIFwiQVJJQU1hcHBlcjo6Z2V0Tm9kZUluZm9cIiwgW10pIDogW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uc1xuICAgIC8vLy9cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFhbS0xLjAvI21hcHBpbmctaHRtbC10by1hY2Nlc3NpYmlsaXR5LWFwaXNcbiAgICBwdWJsaWMgc3RhdGljIGVsZW1BdHRyVmFsdWVDYWxjdWxhdG9yczogeyBbbm9kZU5hbWU6c3RyaW5nXTogeyBbYXR0cjpzdHJpbmddOiBzdHJpbmcgfCBFbGVtQ2FsYyB9fSA9IHtcbiAgICAgICAgXCJnbG9iYWxcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVcbiAgICAgICAgfVxuICAgICAgICAsIFwiZGF0YWxpc3RcIjoge1xuICAgICAgICAgICAgLy8gc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBkYXRhbGlzdCdzIHNlbGVjdGlvbiBtb2RlbCBhbGxvd3MgbXVsdGlwbGUgb3B0aW9uIGVsZW1lbnRzIHRvIGJlXG4gICAgICAgICAgICAvLyBzZWxlY3RlZCBhdCBhIHRpbWUsIGFuZCBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICBcIm11bHRpc2VsZWN0YWJsZVwiOiBlbGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgICAgICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0ID0gZWxlbS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFtsaXN0PSdcIitpZCtcIiddXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIisoZWxlbS5nZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpPT1cIlwiKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcImgxXCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCIxXCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDJcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjJcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoM1wiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiM1wiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImg0XCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCI0XCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDVcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjVcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoNlwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiNlwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImlucHV0XCI6IHtcbiAgICAgICAgICAgIC8vIC0gdHlwZT1cImNoZWNrYm94XCIgc3RhdGUgc2V0IHRvIFwibWl4ZWRcIiBpZiB0aGUgZWxlbWVudCdzIGluZGV0ZXJtaW5hdGUgSURMIGF0dHJpYnV0ZSBcbiAgICAgICAgICAgIC8vIGlzIHRydWUsIG9yIFwidHJ1ZVwiIGlmIHRoZSBlbGVtZW50J3MgY2hlY2tlZG5lc3MgaXMgdHJ1ZSwgb3IgXCJmYWxzZVwiIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gLSB0eXBlPVwicmFkaW9cIiBzdGF0ZSBzZXQgdG8gXCJ0cnVlXCIgaWYgdGhlIGVsZW1lbnQncyBjaGVja2VkbmVzcyBpcyB0cnVlLCBvciBcImZhbHNlXCIgXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UuIFxuICAgICAgICAgICAgXCJjaGVja2VkXCI6IGVsZW0gPT4geyBcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImNoZWNrYm94XCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIrKGVsZW0gYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIGFuZCBub3QgaW4gbWVudSByZWZsZWN0aW5nIG51bWJlciBvZiB0eXBlPXJhZGlvIGlucHV0IGVsZW1lbnRzIFxuICAgICAgICAgICAgLy8gd2l0aGluIHRoZSByYWRpbyBidXR0b24gZ3JvdXBcbiAgICAgICAgICAgICwgXCJzZXRzaXplXCI6IGVsZW0gPT4geyByZXR1cm4gbnVsbDsgdGhyb3cgbmV3IEVycm9yKFwiTk9UIElNUExFTUVOVEVEXCIpOyB9XG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIGFuZCBub3QgaW4gbWVudSB2YWx1ZSByZWZsZWN0aW5nIHRoZSBlbGVtZW50cyBwb3NpdGlvbiBcbiAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgcmFkaW8gYnV0dG9uIGdyb3VwLlwiXG4gICAgICAgICAgICAsIFwicG9zaW5zZXRcIjogZWxlbSA9PiB7IHJldHVybiBudWxsOyB0aHJvdyBuZXcgRXJyb3IoXCJOT1QgSU1QTEVNRU5URURcIik7IH1cbiAgICAgICAgICAgIC8vIGlucHV0ICh0eXBlIGF0dHJpYnV0ZSBpbiB0aGUgVGV4dCwgU2VhcmNoLCBUZWxlcGhvbmUsIFVSTCwgb3IgRS1tYWlsIHN0YXRlcyB3aXRoIGEgXG4gICAgICAgICAgICAvLyBzdWdnZXN0aW9ucyBzb3VyY2UgZWxlbWVudCkgY29tYm9ib3ggcm9sZSwgd2l0aCB0aGUgYXJpYS1vd25zIHByb3BlcnR5IHNldCB0byB0aGUgc2FtZVxuICAgICAgICAgICAgLy8gdmFsdWUgYXMgdGhlIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAsIFwib3duc1wiOiBlbGVtID0+IHsgcmV0dXJuIG51bGw7IHRocm93IG5ldyBFcnJvcihcIk5PVCBJTVBMRU1FTlRFRFwiKTsgfVxuICAgICAgICB9XG4gICAgICAgICwgXCJrZXlnZW5cIjoge1xuICAgICAgICAgICAgXCJtdWx0aXNlbGVjdGFibGVcIjogXCJmYWxzZVwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImxpXCI6IHtcbiAgICAgICAgICAgIC8vIE51bWJlciBvZiBsaSBlbGVtZW50cyB3aXRoaW4gdGhlIG9sLCB1bCwgbWVudVxuICAgICAgICAgICAgXCJzZXRzaXplXCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01VdGlsLmdldEFuY2VzdG9yKGVsZW0sIFtcIm9sXCIsIFwidWxcIiwgXCJtZW51XCJdKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGxpcyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFwibGlcIik7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVybGlzID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJvbCBsaSwgdWwgbGksIG1lbnUgbGlcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIrKGxpcy5sZW5ndGgtb3RoZXJsaXMubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFBvc2l0aW9uIG9mIGxpIGVsZW1lbnQgd2l0aGluIHRoZSBvbCwgdWwsIG1lbnVcbiAgICAgICAgICAgICwgXCJwb3NpbnNldFwiOiBlbGVtID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJvbFwiLCBcInVsXCIsIFwibWVudVwiXSlcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGxpcyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFwibGlcIik7XG4gICAgICAgICAgICAgICAgbGV0IG51bSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxsaXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaSA9IGxpc1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoRE9NVXRpbC5zYW1lTm9kZShwYXJlbnQsIERPTVV0aWwuZ2V0QW5jZXN0b3IobGksIFtcIm9sXCIsIFwidWxcIiwgXCJtZW51XCJdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiK251bTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICArK251bTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcIm1lbnVpdGVtXCI6IHtcbiAgICAgICAgICAgIC8vIHR5cGUgPSBjaGVja2JveCBvciByYWRpbywgc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSBcbiAgICAgICAgICAgIC8vIGlzIHByZXNlbnQsIGFuZCBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICBcImNoZWNrZWRcIjogZWxlbSA9PiBcIlwiKyEhKGVsZW0uZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKSBcbiAgICAgICAgICAgICAgICAmJiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIik9PVwiXCIpKVxuICAgICAgICB9XG4gICAgICAgICwgXCJvcHRpb25cIjoge1xuICAgICAgICAgICAgLy8gc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBlbGVtZW50J3Mgc2VsZWN0ZWRuZXNzIGlzIHRydWUsIG9yIFwiZmFsc2VcIiBvdGhlcndpc2UuXG4gICAgICAgICAgICBcInNlbGVjdGVkXCI6IGVsZW0gPT4gXCJcIishIShlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpIFxuICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpPT1cIlwiKSlcbiAgICAgICAgfVxuICAgICAgICAsIFwicHJvZ3Jlc3NcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZW1heFwiOiBlbGVtID0+IGVsZW0uZ2V0QXR0cmlidXRlKFwibWF4XCIpIHx8IFwiMVwiXG4gICAgICAgICAgICAsIFwidmFsdWVtaW5cIjogZWxlbSA9PiBcIjBcIlxuICAgICAgICAgICAgLCBcInZhbHVlbm93XCI6IGVsZW0gPT4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHRleHRBdHRyVmFsdWVDYWxjdWxhdG9yczogeyBbYXR0cjpzdHJpbmddOiBOb2RlQ2FsYyB9ID0ge1xuICAgICAgICBcIm5hbWVcIjogbm9kZSA9PiBub2RlLm5vZGVWYWx1ZVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG5hbWVDb21wdXRhdGlvbklkID0gMDtcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVOYW1lKGN1cjogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICArK0FSSUFNYXBwZXIubmFtZUNvbXB1dGF0aW9uSWQ7XG4gICAgICAgIHJldHVybiBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscChBUklBTWFwcGVyLm5hbWVDb21wdXRhdGlvbklkLCBjdXIsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlTmFtZUhlbHAod2Fsa0lkOiBudW1iZXIsIGN1cjogTm9kZSwgbGFiZWxsZWRieVRyYXZlcnNlOiBib29sZWFuLCB3YWxrVHJhdmVyc2U6IGJvb2xlYW4pIDogc3RyaW5nIHtcbiAgICAgICAgLy8gMmcuIE5vbmUgb2YgdGhlIG90aGVyIGNvbnRlbnQgYXBwbGllcyB0byB0ZXh0IG5vZGVzLCBzbyBqdXN0IGRvIHRoaXMgZmlyc3RcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSA9PT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLykgcmV0dXJuIGN1ci5ub2RlVmFsdWU7XG4gICAgICAgIGlmIChjdXIubm9kZVR5cGUgPT09IDExKSByZXR1cm4gXCJcIjtcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgaWYgKHdhbGtUcmF2ZXJzZSB8fCBsYWJlbGxlZGJ5VHJhdmVyc2UpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yIChcIkNhbiBvbmx5IGNvbXB1dGUgbmFtZSBvbiBFbGVtZW50IGFuZCBUZXh0IFwiICsgY3VyLm5vZGVUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsZW0gPSBjdXIgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gV2UndmUgYmVlbiBoZXJlIGJlZm9yZSAtIHByZXZlbnQgcmVjdXJzaW9uXG4gICAgICAgIGlmIChnZXRDYWNoZShlbGVtLCBcImRhdGEtbmFtZXdhbGtcIiwgbnVsbCkgPT09IFwiXCIrd2Fsa0lkKSByZXR1cm4gXCJcIjtcbiAgICAgICAgc2V0Q2FjaGUoZWxlbSwgXCJkYXRhLW5hbWV3YWxrXCIsIFwiXCIrd2Fsa0lkKTtcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFhbS0xLjAvI2lucHV0LXR5cGUtdGV4dC1pbnB1dC10eXBlLXBhc3N3b3JkLWlucHV0LXR5cGUtc2VhcmNoLWlucHV0LXR5cGUtdGVsLWlucHV0LXR5cGUtdXJsLWFuZC10ZXh0YXJlYS1lbGVtZW50XG5cbiAgICAgICAgLy8gMmEuIE9ubHkgc2hvdyBoaWRkZW4gY29udGVudCBpZiBpdCdzIHJlZmVyZW5jZWQgYnkgYSBsYWJlbGxlZGJ5XG4gICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmICFET01XYWxrZXIuaXNOb2RlVmlzaWJsZShjdXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJiLiBjb2xsZWN0IHZhbGlkIGlkIHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKCFsYWJlbGxlZGJ5VHJhdmVyc2UgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgIGxldCBsYWJlbGxlZGJ5ID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgbGV0IHZhbGlkRWxlbXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVmIG9mIGxhYmVsbGVkYnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoY3VyLCByZWYpO1xuICAgICAgICAgICAgICAgIGlmIChyZWZFbGVtICYmICFET01VdGlsLnNhbWVOb2RlKGVsZW0sIHJlZkVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkRWxlbXMucHVzaChyZWZFbGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsaWRFbGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFjY3VtdWxhdGVkID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW0gb2YgdmFsaWRFbGVtcykge1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBcIiBcIiArIHRoaXMuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgZWxlbSwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZWQudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2luY2Ugbm9kZVRvUm9sZSBjYWxscyBiYWNrIGhlcmUgZm9yIGZvcm0gYW5kIHNlY3Rpb24sIHdlIG5lZWQgc3BlY2lhbCBjYXNpbmcgaGVyZSB0byBoYW5kbGUgdGhvc2UgdHdvIGNhc2VzXG4gICAgICAgIGlmIChbXCJzZWN0aW9uXCIsIFwiZm9ybVwiXS5pbmNsdWRlcyhjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgSSdtIG5vdCBhbiBlbWJlZGRlZCBjb250cm9sIG9yIEknbSBub3QgcmVjdXJzaW5nLCByZXR1cm4gdGhlIGFyaWEtbGFiZWxcbiAgICAgICAgICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiAhd2Fsa1RyYXZlcnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJjLiBJZiBsYWJlbCBvciB3YWxrLCBhbmQgdGhpcyBpcyBhIGNvbnRyb2wsIHNraXAgdG8gdGhlIHZhbHVlLCBvdGhlcndpc2UgcHJvdmlkZSB0aGUgbGFiZWxcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShjdXIpO1xuICAgICAgICBsZXQgaXNFbWJlZGRlZENvbnRyb2wgPSBbXG4gICAgICAgICAgICBcInRleHRib3hcIiwgXCJidXR0b25cIiwgXCJjb21ib2JveFwiLCBcImxpc3Rib3hcIiwgXG4gICAgICAgICAgICBcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiXG4gICAgICAgIF0uaW5jbHVkZXMocm9sZSk7XG4gICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBJZiBJJ20gbm90IGFuIGVtYmVkZGVkIGNvbnRyb2wgb3IgSSdtIG5vdCByZWN1cnNpbmcsIHJldHVybiB0aGUgYXJpYS1sYWJlbFxuICAgICAgICAgICAgaWYgKCFsYWJlbGxlZGJ5VHJhdmVyc2UgJiYgIXdhbGtUcmF2ZXJzZSB8fCAhaXNFbWJlZGRlZENvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJkLiBcbiAgICAgICAgaWYgKHJvbGUgIT09IFwicHJlc2VudGF0aW9uXCIgJiYgcm9sZSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgIGlmICgoY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW1nXCIgfHwgY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYXJlYVwiKSAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBET01VdGlsLmNsZWFuV2hpdGVzcGFjZShlbGVtLmdldEF0dHJpYnV0ZShcImFsdFwiKSkudHJpbSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGVsZW0ub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibGFiZWxbZm9yPSdcIitlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpK1wiJ11cIik7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpIHx8IChsYWJlbC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikgJiYgIVJQVFV0aWwuaXNJZFJlZmVyVG9TZWxmKGN1ciwgbGFiZWwuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIGxhYmVsLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImZpZWxkc2V0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiggKDxFbGVtZW50PmN1cikucXVlcnlTZWxlY3RvcihcImxlZ2VuZFwiKSl7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsZWdlbmQgPSAoPEVsZW1lbnQ+Y3VyKS5xdWVyeVNlbGVjdG9yKFwibGVnZW5kXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVnZW5kLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgY3VyLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmUuXG4gICAgICAgIGlmICgod2Fsa1RyYXZlcnNlIHx8IGxhYmVsbGVkYnlUcmF2ZXJzZSkgJiYgaXNFbWJlZGRlZENvbnRyb2wpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBlbWJlZGRlZCBjb250cm9sIGhhcyByb2xlIHRleHRib3gsIHJldHVybiBpdHMgdmFsdWUuXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJ0ZXh0Ym94XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidmFsdWVcIikpIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtUcmF2ZXJzZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlIGVtYmVkZGVkIGNvbnRyb2wgaGFzIHJvbGUgYnV0dG9uLCByZXR1cm4gdGhlIHRleHQgYWx0ZXJuYXRpdmUgb2YgdGhlIGJ1dHRvbi5cbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcImJ1dHRvblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChbXCJidXR0b25cIiwgXCJzdWJtaXRcIiwgXCJyZXNldFwiXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidmFsdWVcIikpIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwic3VibWl0XCIpIHJldHVybiBcIlN1Ym1pdFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwicmVzZXRcIikgcmV0dXJuIFwiUmVzZXRcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtUcmF2ZXJzZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVE9ETzogSWYgdGhlIGVtYmVkZGVkIGNvbnRyb2wgaGFzIHJvbGUgY29tYm9ib3ggb3IgbGlzdGJveCwgcmV0dXJuIHRoZSB0ZXh0IGFsdGVybmF0aXZlIG9mIHRoZSBjaG9zZW4gb3B0aW9uLlxuICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwiY29tYm9ib3hcIikge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtLCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkICYmICFET01VdGlsLnNhbWVOb2RlKGVsZW0sIHNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgc2VsZWN0ZWQsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBlbWJlZGRlZCBjb250cm9sIGhhcyByb2xlIHJhbmdlIChlLmcuLCBhIHNwaW5idXR0b24gb3Igc2xpZGVyKTpcbiAgICAgICAgICAgIGlmIChbXCJwcm9ncmVzc2JhclwiLCBcInNjcm9sbGJhclwiLCBcInNsaWRlclwiLCBcInNwaW5idXR0b25cIl0uaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYXJpYS12YWx1ZXRleHQgcHJvcGVydHkgaXMgcHJlc2VudCwgcmV0dXJuIGl0cyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiKSkgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIik7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiB0aGUgYXJpYS12YWx1ZW5vdyBwcm9wZXJ0eSBpcyBwcmVzZW50LCByZXR1cm4gaXRzIHZhbHVlLFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtdmFsdWVub3dcIikpIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtdmFsdWVub3dcIik7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogT3RoZXJ3aXNlLCB1c2UgdGhlIHZhbHVlIGFzIHNwZWNpZmllZCBieSBhIGhvc3QgbGFuZ3VhZ2UgYXR0cmlidXRlLlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmYuIDJoLlxuICAgICAgICBpZiAod2Fsa1RyYXZlcnNlIHx8IEFSSUFEZWZpbml0aW9ucy5uYW1lRnJvbUNvbnRlbnQocm9sZSkgfHwgbGFiZWxsZWRieVRyYXZlcnNlKSB7XG4gICAgICAgICAgICAvLyAyZmkuIFNldCB0aGUgYWNjdW11bGF0ZWQgdGV4dCB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICAgICAgICAgICAgbGV0IGFjY3VtdWxhdGVkID0gXCJcIjtcbiAgICAgICAgICAgIC8vIDJmaWkuIENoZWNrIGZvciBDU1MgZ2VuZXJhdGVkIHRleHR1YWwgY29udGVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgbm9kZSBhbmQgXG4gICAgICAgICAgICAvLyBpbmNsdWRlIGl0IGluIHRoZSBhY2N1bXVsYXRlZCB0ZXh0LiBUaGUgQ1NTIDpiZWZvcmUgYW5kIDphZnRlciBwc2V1ZG8gZWxlbWVudHMgW0NTUzJdIFxuICAgICAgICAgICAgLy8gY2FuIHByb3ZpZGUgdGV4dHVhbCBjb250ZW50IGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBjb250ZW50IG1vZGVsLlxuICAgICAgICAgICAgLy8gICBGb3IgOmJlZm9yZSBwc2V1ZG8gZWxlbWVudHMsIFVzZXIgYWdlbnRzIE1VU1QgcHJlcGVuZCBDU1MgdGV4dHVhbCBjb250ZW50LCB3aXRob3V0IFxuICAgICAgICAgICAgLy8gICAgIGEgc3BhY2UsIHRvIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAgICAgICAgICAgIC8vICAgRm9yIDphZnRlciBwc2V1ZG8gZWxlbWVudHMsIFVzZXIgYWdlbnRzIE1VU1QgYXBwZW5kIENTUyB0ZXh0dWFsIGNvbnRlbnQsIHdpdGhvdXQgYSBcbiAgICAgICAgICAgIC8vICAgICBzcGFjZSwgdG8gdGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAgICAgICAgbGV0IGJlZm9yZSA9IG51bGw7XG4gICAgICAgICAgICBiZWZvcmUgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLFwiYmVmb3JlXCIpLmNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmIChiZWZvcmUgJiYgYmVmb3JlICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGJlZm9yZSA9IGJlZm9yZS5yZXBsYWNlKC9eXCIvLFwiXCIpLnJlcGxhY2UoL1wiJC8sXCJcIik7XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gYmVmb3JlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMmZpaWkuIEZvciBlYWNoIGNoaWxkIG5vZGUgb2YgdGhlIGN1cnJlbnQgbm9kZTpcbiAgICAgICAgICAgIC8vICAgU2V0IHRoZSBjdXJyZW50IG5vZGUgdG8gdGhlIGNoaWxkIG5vZGUuXG4gICAgICAgICAgICAvLyAgIENvbXB1dGUgdGhlIHRleHQgYWx0ZXJuYXRpdmUgb2YgdGhlIGN1cnJlbnQgbm9kZSBiZWdpbm5pbmcgd2l0aCBzdGVwIDIuIFNldCB0aGUgcmVzdWx0IFxuICAgICAgICAgICAgLy8gICAgIHRvIHRoYXQgdGV4dCBhbHRlcm5hdGl2ZS5cbiAgICAgICAgICAgIC8vICAgQXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlIGFjY3VtdWxhdGVkIHRleHQuXG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNMT1RcIikge1xuICAgICAgICAgICAgICAgIC8vaWYgbm8gYXNzaWduZWROb2RlLCBjaGVjayBpdHMgb3duIHRleHQgXG4gICAgICAgICAgICAgICAgaWYgKCEoZWxlbSBhcyBIVE1MU2xvdEVsZW1lbnQpLmFzc2lnbmVkTm9kZXMoKSB8fCAoZWxlbSBhcyBIVE1MU2xvdEVsZW1lbnQpLmFzc2lnbmVkTm9kZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlubmVyVGV4dCA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJUZXh0ICYmIGlubmVyVGV4dCAhPT0gbnVsbCAmJiBpbm5lclRleHQudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSAgXCIgXCIgKyBpbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRleHQgZnJvbSBhbGwgYXNzaWduZWQgbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzbG90Q2hpbGQgb2YgKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXh0Q2hpbGRDb250ZW50ID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBzbG90Q2hpbGQsIGxhYmVsbGVkYnlUcmF2ZXJzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBcIiBcIiArIG5leHRDaGlsZENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB3YWxrQ2hpbGQgPSBlbGVtLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHdhbGtDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dENoaWxkQ29udGVudCA9IEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgd2Fsa0NoaWxkLCBsYWJlbGxlZGJ5VHJhdmVyc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBcIiBcIiArIG5leHRDaGlsZENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZCA9IHdhbGtDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBhZnRlciA9IG51bGw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGFmdGVyID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSxcImFmdGVyXCIpLmNvbnRlbnQ7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAgICAgICBpZiAoYWZ0ZXIgJiYgYWZ0ZXIgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBhZnRlci5yZXBsYWNlKC9eXCIvLFwiXCIpLnJlcGxhY2UoL1wiJC8sXCJcIik7XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gYWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAyZml2LiBSZXR1cm4gdGhlIGFjY3VtdWxhdGVkIHRleHQuXG4gICAgICAgICAgICBhY2N1bXVsYXRlZCA9IGFjY3VtdWxhdGVkLnJlcGxhY2UoL1xccysvZyxcIiBcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKGFjY3VtdWxhdGVkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmkuIE90aGVyd2lzZSwgaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgYSBUb29sdGlwIGF0dHJpYnV0ZSwgcmV0dXJuIGl0cyB2YWx1ZS5cbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIikge1xuICAgICAgICAgICAgbGV0IHRpdGxlID0gZWxlbS5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIik7XG4gICAgICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGl0bGUudGV4dENvbnRlbnQgfHwgdGl0bGUuaW5uZXJUZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4vKiAgICAgICAgaWYgKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zXG4gICAgICAgICAgICAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZUZyb20gXG4gICAgICAgICAgICAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZUZyb20uaW5jbHVkZXMoXCJjb250ZW50c1wiKSkgXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUgPSBlbGVtLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG5hbWUgPSBlbGVtLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImxhYmVsW2Zvcj0nXCIrZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKS50cmltKCkrXCInXVwiKS50ZXh0Q29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKSB7XG4gICAgICAgICAgICBuYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgbmFtZSA9IFwiXCI7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgICAgICAgIG5hbWUgKz0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlbSwgaWQpLnRleHRDb250ZW50ICsgXCIgXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuYW1lID0gbmFtZS50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfSovXG5cbiAgICBwdWJsaWMgc3RhdGljIG5vZGVUb1JvbGUobm9kZSA6IE5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgLyogTm9kZS5URVhUX05PREUgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBcInRleHRcIjtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCByb2xlU3RyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGxldCByb2xlcyA9IHJvbGVTdHIuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwicHJlc2VudGF0aW9uXCIgfHwgcm9sZSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZWxlbWVudCBpcyBmb2N1c2FibGUsIHRoZW4gcHJlc2VudGF0aW9uIHJvbGVzIGFyZSB0byBiZSBpZ25vcmVkXG4gICAgICAgICAgICAgICAgICAgIGlmICghUlBUVXRpbC5pc0ZvY3VzYWJsZShlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByb2xlO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gdGhpcy5lbGVtVG9JbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgIGNvbnN0IHJvbGVzID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgIHJldHVybiAhcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PTAgPyBudWxsIDogcm9sZXNbMF07XG4gICAgfVxuICAgIC8qKlxuICAgIHB1YmxpYyBzdGF0aWMgZWxlbVRvSW1wbGljaXRSb2xlKGVsZW0gOiBFbGVtZW50KSB7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoIShub2RlTmFtZSBpbiBBUklBTWFwcGVyLmVsZW1Ub1JvbGVNYXApKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIuZWxlbVRvUm9sZU1hcFtub2RlTmFtZV07XG4gICAgICAgIGlmICh0eXBlb2Ygcm9sZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHJvbGU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJvbGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHJvbGUoZWxlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgc3RhdGljIGhhc1BhcmVudFJvbGUoZWxlbWVudCwgcm9sZSkgOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICAvLyBJZiBsaW5rIGlzIGluIGEgbWVudSwgaXQncyBhIG1lbnVpdGVtXG4gICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChBUklBTWFwcGVyLm5vZGVUb1JvbGUocGFyZW50KSA9PT0gcm9sZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICBwcml2YXRlIHN0YXRpYyBpbnB1dFRvUm9sZU1hcCA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgbGV0IGhhc0xpc3QgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJsaXN0XCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJsaXN0XCIpO1xuICAgICAgICAgICAgICAgIGxldCBpZFJlZiA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnQsIGlkKTtcbiAgICAgICAgICAgICAgICBpZiAoaWRSZWYgJiYgaWRSZWYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJkYXRhbGlzdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHRleHRTdWdnZXN0aW9ucyA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNMaXN0KGVsZW1lbnQpID8gXCJjb21ib2JveFwiIDogXCJ0ZXh0Ym94XCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFwiYnV0dG9uXCI6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcImltYWdlXCI6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcImNoZWNrYm94XCI6IFwiY2hlY2tib3hcIixcbiAgICAgICAgICAgIFwicmFkaW9cIjogXCJyYWRpb1wiLFxuICAgICAgICAgICAgXCJlbWFpbFwiOiB0ZXh0U3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICBcInNlYXJjaFwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhc0xpc3QoZWxlbWVudCkgPyBcImNvbWJvYm94XCIgOiBcInNlYXJjaGJveFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGVsXCI6IHRleHRTdWdnZXN0aW9ucyxcbiAgICAgICAgICAgIFwidGV4dFwiOiB0ZXh0U3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICBcInVybFwiOiB0ZXh0U3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICBcIm51bWJlclwiOiBcInNwaW5idXR0b25cIixcbiAgICAgICAgICAgIFwicmFuZ2VcIjogXCJzbGlkZXJcIixcbiAgICAgICAgICAgIFwicmVzZXRcIjogXCJidXR0b25cIixcbiAgICAgICAgICAgIFwic3VibWl0XCI6IFwiYnV0dG9uXCJcbiAgICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnB1dFRvUm9sZShlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZVR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZVR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIShlVHlwZSBpbiBBUklBTWFwcGVyLmlucHV0VG9Sb2xlTWFwKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLmlucHV0VG9Sb2xlTWFwW2VUeXBlXTtcbiAgICAgICAgaWYgKHR5cGVvZiByb2xlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gcm9sZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygcm9sZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gcm9sZShlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgXG4gICAgcHJpdmF0ZSBzdGF0aWMgZWxlbVRvUm9sZU1hcCA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgbGV0IHNlY3Rpb25pbmdSb290cyA9IHtcbiAgICAgICAgICAgIFwiYmxvY2txdW90ZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJib2R5XCI6IHRydWUsXG4gICAgICAgICAgICBcImRldGFpbHNcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiZGlhbG9nXCI6IHRydWUsXG4gICAgICAgICAgICBcImZpZWxkc2V0XCI6IHRydWUsXG4gICAgICAgICAgICBcImZpZ3VyZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJ0ZFwiOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIGxldCBzZWN0aW9uaW5nQ29udGVudCA9IHtcbiAgICAgICAgICAgIFwiYXJ0aWNsZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJhc2lkZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJuYXZcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwic2VjdGlvblwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtYWluXCI6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHNlY3Rpb25pbmdSb2xlID0ge1xuICAgICAgICAgICAgXCJhcnRpY2xlXCI6IHRydWUsXG4gICAgICAgICAgICBcImNvbXBsZW1lbnRhcnlcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibmF2aWdhdGlvblwiOiB0cnVlLFxuICAgICAgICAgICAgXCJyZWdpb25cIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWFpblwiOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIGxldCBpbnB1dFRvUm9sZSA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBBUklBTWFwcGVyLmlucHV0VG9Sb2xlKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBcImFcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIElmIGl0IGRvZXNuJ3QgcmVwcmVzZW50IGEgaHlwZXJsaW5rLCAnZ2VuZXJpYycgcm9sZVxuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJsaW5rXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJhcmVhXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBpdCBkb2Vzbid0IHJlcHJlc2VudCBhIGh5cGVybGluaywgbm8gY29ycmVzcG9uZGluZyByb2xlXG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBcImxpbmtcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImFydGljbGVcIjogXCJhcnRpY2xlXCIsXG4gICAgICAgICAgICBcImFzaWRlXCI6IFwiY29tcGxlbWVudGFyeVwiLFxuICAgICAgICAgICAgXCJidXR0b25cIjogXCJidXR0b25cIixcbiAgICAgICAgICAgIFwiZGF0YWxpc3RcIjogXCJsaXN0Ym94XCIsXG4gICAgICAgICAgICBcImRkXCI6IFwiZGVmaW5pdGlvblwiLFxuICAgICAgICAgICAgXCJkZXRhaWxzXCI6IFwiZ3JvdXBcIixcbiAgICAgICAgICAgIFwiZGZuXCI6IFwidGVybVwiLFxuICAgICAgICAgICAgXCJkaWFsb2dcIjogXCJkaWFsb2dcIixcbiAgICAgICAgICAgIFwiZHRcIjogXCJ0ZXJtXCIsXG4gICAgICAgICAgICBcImZpZWxkc2V0XCI6IFwiZ3JvdXBcIixcbiAgICAgICAgICAgIFwiZmlndXJlXCI6IFwiZmlndXJlXCIsXG4gICAgICAgICAgICBcImZvb3RlclwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIC8vIElmIG5lYXJlc3Qgc2VjdGlvbmluZ1Jvb3Qgb3Igc2VjdGlvbmluZ0NvbnRlbnQgaXMgYm9keVxuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlID0gKHBhcmVudC5ub2RlVHlwZSA9PT0gMSAmJiAocGFyZW50IGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpKSB8fCBcIlwiXG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IHBhcmVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VjdGlvbmluZ1Jvb3RzW25vZGVOYW1lXSB8fCBzZWN0aW9uaW5nQ29udGVudFtub2RlTmFtZV0gfHwgc2VjdGlvbmluZ1JvbGVbcm9sZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobm9kZU5hbWUgPT09IFwiYm9keVwiKSA/IFwiY29udGVudGluZm9cIiA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmb3JtXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IEFSSUFNYXBwZXIuY29tcHV0ZU5hbWUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApID8gXCJmb3JtXCIgOiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFRPRE8gXCJmb3JtLWFzc29jaWF0ZWQgY3VzdG9tIGVsZW1lbnRcIlxuICAgICAgICAgICAgXCJoMVwiOiBcImhlYWRpbmdcIixcbiAgICAgICAgICAgIFwiaDJcIjogXCJoZWFkaW5nXCIsXG4gICAgICAgICAgICBcImgzXCI6IFwiaGVhZGluZ1wiLFxuICAgICAgICAgICAgXCJoNFwiOiBcImhlYWRpbmdcIixcbiAgICAgICAgICAgIFwiaDVcIjogXCJoZWFkaW5nXCIsXG4gICAgICAgICAgICBcImg2XCI6IFwiaGVhZGluZ1wiLFxuICAgICAgICAgICAgXCJoZWFkZXJcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAvLyBJZiBuZWFyZXN0IHNlY3Rpb25pbmdSb290IG9yIHNlY3Rpb25pbmdDb250ZW50IGlzIGJvZHlcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGUgPSAocGFyZW50Lm5vZGVUeXBlID09PSAxICYmIChwYXJlbnQgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcInJvbGVcIikpIHx8IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3Rpb25pbmdSb290c1tub2RlTmFtZV0gfHwgc2VjdGlvbmluZ0NvbnRlbnRbbm9kZU5hbWVdIHx8IHNlY3Rpb25pbmdSb2xlW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5vZGVOYW1lID09PSBcImJvZHlcIikgPyBcImJhbm5lclwiIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImhyXCI6IFwic2VwYXJhdG9yXCIsXG4gICAgICAgICAgICBcImh0bWxcIjogXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJpbWdcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImFsdFwiKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicHJlc2VudGF0aW9uXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiaW1nXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW5wdXRcIjogaW5wdXRUb1JvbGUsXG4gICAgICAgICAgICBcImtleWdlblwiOiBcImxpc3Rib3hcIiwgLy8gZGVwcmVjYXRlZCwgYnV0IGtlZXAgZm9yIGJhY2t3YXJkIGNvbXBhdFxuICAgICAgICAgICAgXCJsaVwiOiBcImxpc3RpdGVtXCIsXG4gICAgICAgICAgICBcIm1haW5cIjogXCJtYWluXCIsXG4gICAgICAgICAgICBcIm1hdGhcIjogXCJtYXRoXCIsXG4gICAgICAgICAgICBcIm1lbnVcIjogXCJsaXN0XCIsXG4gICAgICAgICAgICBcIm5hdlwiOiBcIm5hdmlnYXRpb25cIixcbiAgICAgICAgICAgIFwib2xcIjogXCJsaXN0XCIsXG4gICAgICAgICAgICBcIm9wdGdyb3VwXCI6IFwiZ3JvdXBcIixcbiAgICAgICAgICAgIFwib3B0aW9uXCI6IFwib3B0aW9uXCIsXG4gICAgICAgICAgICBcIm91dHB1dFwiOiBcInN0YXR1c1wiLFxuICAgICAgICAgICAgXCJwcm9ncmVzc1wiOiBcInByb2dyZXNzYmFyXCIsXG4gICAgICAgICAgICBcInNlY3Rpb25cIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKG5hbWUgJiYgbmFtZS50cmltKCkubGVuZ3RoID4gMCkgPyBcInJlZ2lvblwiIDogbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwibXVsdGlwbGVcIikgfHwgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJzaXplXCIpICYmIHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic2l6ZVwiKSkgPiAxKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJsaXN0Ym94XCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiY29tYm9ib3hcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzdW1tYXJ5XCI6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcInN2Z1wiOiBcImdyYXBoaWNzLWRvY3VtZW50XCIsXG4gICAgICAgICAgICBcInRhYmxlXCI6IFwidGFibGVcIixcbiAgICAgICAgICAgIFwidGJvZHlcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlID09PSBcInRhYmxlXCIgfHwgcm9sZSA9PT0gXCJncmlkXCIgfHwgcm9sZSA9PT0gXCJ0cmVlZ3JpZFwiKSByZXR1cm4gXCJyb3dncm91cFwiO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRleHRhcmVhXCI6IFwidGV4dGJveFwiLFxuICAgICAgICAgICAgXCJ0ZFwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwidGFibGVcIikgcmV0dXJuIFwiY2VsbFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJncmlkXCIgfHwgcm9sZSA9PT0gXCJ0cmVlZ3JpZFwiKSByZXR1cm4gXCJncmlkY2VsbFwiO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRoXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgIT09IFwidGFibGVcIiAmJiByb2xlICE9PSBcImdyaWRcIiAmJiByb2xlICE9PSBcInRyZWVncmlkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyBcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIEVhc2llc3QgYW5zd2VyIGlzIGlmIHNjb3BlIGlzIHNwZWNpZmllZFxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJzY29wZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNjb3BlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlID09PSBcInJvd1wiIHx8IHNjb3BlID09PSAncm93Z3JvdXAnKSByZXR1cm4gXCJyb3doZWFkZXJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZSA9PT0gXCJjb2xcIiB8fCBzY29wZSA9PT0gJ2NvbGdyb3VwJykgcmV0dXJuIFwiY29sdW1uaGVhZGVyXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIHNjb3BlIGlzIGF1dG8sIGRlZmF1bHQgKHdpdGhvdXQgYSBzY29wZSkgb3IgaW52YWxpZCB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgYWxsIHRoZSBzaWJsaW5nIGVsZW1lbnRzIGFyZSB0aCwgdGhlbiByZXR1cm4gXCJjb2x1bW5oZWFkZXJcIiBcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNpYmxpbmdzID0gZWxlbWVudCA9PiBbLi4uZWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuXS5maWx0ZXIobm9kZT0+bm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlLnRhZ05hbWUgIT0gXCJUSFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpYmxpbmdzID09PSBudWxsIHx8IHNpYmxpbmdzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcImNvbHVtbmhlYWRlclwiOyBcbiAgICAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gXCJyb3doZWFkZXJcIjtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGZvb3RcIjogXCJyb3dncm91cFwiLFxuICAgICAgICAgICAgXCJ0aGVhZFwiOiBcInJvd2dyb3VwXCIsXG4gICAgICAgICAgICBcInRyXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJ0YWJsZVwiIHx8IHJvbGUgPT09IFwiZ3JpZFwiIHx8IHJvbGUgPT09IFwidHJlZWdyaWRcIikgcmV0dXJuIFwicm93XCI7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidWxcIjogXCJsaXN0XCJcbiAgICAgICAgfVxuICAgIH0pKClcbiAgICovXG59IFxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4vQVJJQU1hcHBlclwiO1xuXG4vKipcbiAqIFdhbGtzIGluIGFuIEFSSUEgb3JkZXJcbiAqIFxuICogU2VlIGFsc28gLi4vZG9tL0RPTVdhbGtlclxuICovXG5leHBvcnQgY2xhc3MgQVJJQVdhbGtlciB7XG4gICAgcm9vdCA6IE5vZGU7XG4gICAgbm9kZSA6IE5vZGU7XG4gICAgYkVuZFRhZzogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQgOiBOb2RlLCBiRW5kPyA6IGJvb2xlYW4sIHJvb3Q/IDogTm9kZSkge1xuICAgICAgICB0aGlzLnJvb3QgPSByb290IHx8IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuYkVuZFRhZyA9IChiRW5kID09IHVuZGVmaW5lZCA/IGZhbHNlIDogYkVuZCA9PSB0cnVlKTtcbiAgICB9XG5cbiAgICBhdFJvb3QoKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS5vd25lckVsZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PT0gdGhpcy5ub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QuaXNTYW1lTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5pc1NhbWVOb2RlKHRoaXMubm9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMubm9kZSkgPT09IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgLSB0cnkgb3VyIGJlc3RcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGUucGFyZW50Tm9kZSA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5leHROb2RlKCkgOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHNraXBPd25lZCA9IGZhbHNlO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBza2lwT3duZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMubm9kZS5ub2RlTmFtZSwgdGhpcy5iRW5kVGFnP1wiRU5EXCI6XCJTVEFSVFwiLCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBhbnkpLmdldEF0dHJpYnV0ZShcImlkXCIpKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlmcmFtZU5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxJRnJhbWVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudE5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgc2xvdEVsZW1lbnQgPSAodGhpcy5ub2RlIGFzIEhUTUxTbG90RWxlbWVudClcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIlxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5pc05vZGVWaXNpYmxlKGVsZW1lbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2xvdFwiXG4gICAgICAgICAgICAgICAgICAgICYmIHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETzogbmVlZCB0byBjb25zaWRlIGl0cyBvd24gY29udGVudCwgYSBzbG90IG1heSBoYXZlIGl0cyBvd24gY29udGVudCBvciBhc3NpZ25lZCBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKVswXTtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lciA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIHx8IHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMTEpIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmIHRoaXMubm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFNsb3RJbmRleCA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXgrMTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFNsb3RJbmRleCA8IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXIuYXNzaWduZWROb2RlcygpW25leHRTbG90SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lciA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXggPSBuZXh0U2xvdEluZGV4OyAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHNraXBPd25lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25JZHMgPSAodGhpcy5ub2RlLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS5zcGxpdCgvICsvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIHx8ICEodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHRoaXMubm9kZSkuZ2V0RWxlbWVudEJ5SWQob3duSWRzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IG93bklkcy5pbmRleE9mKCh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImlkXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09PSBvd25JZHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTsgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBncmFiIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQodGhpcy5ub2RlKS5nZXRFbGVtZW50QnlJZChvd25JZHNbaWR4KzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLylcbiAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgICAgIHx8IChza2lwT3duZWQgJiYgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICEhQVJJQU1hcHBlci5nZXRBcmlhT3duZWRCeSh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcmV2Tm9kZSgpIDogYm9vbGVhbiB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5pc05vZGVWaXNpYmxlKGVsZW1lbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QubGFzdENoaWxkKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIHx8IHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMTEpICYmIHRoaXMubm9kZS5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLmxhc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0Um9vdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoXG4gICAgICAgICAgICAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMTEpXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uLy4uLy4uL2FwaS9JRW5naW5lXCI7XG5cbmV4cG9ydCBjbGFzcyBBbmNlc3RvclV0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgaXNQcmVzZW50YXRpb25GcmFtZShjb250ZXh0SGllcmFyY2h5OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNvbnRleHRIaWVyYXJjaHkgJiYgY29udGV4dEhpZXJhcmNoeS5kb20pIHtcbiAgICAgICAgICAgIC8vIFNraXAgY3VycmVudCBub2RlIGJlY2F1c2Ugd2Ugd2FudCBhbmNlc3RyeVxuICAgICAgICAgICAgZm9yIChsZXQgaWR4PWNvbnRleHRIaWVyYXJjaHkuZG9tLmxlbmd0aC0yOyBpZHggPj0gMDsgLS1pZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gKGNvbnRleHRIaWVyYXJjaHkuZG9tW2lkeF0ubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZVR5cGUgPT09IDEgXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpZnJhbWVcIlxuICAgICAgICAgICAgICAgICAgICAmJiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpID09PSBcInByZXNlbnRhdGlvblwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09IFwidHJ1ZVwiKSkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNGcmFtZShjb250ZXh0SGllcmFyY2h5OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNvbnRleHRIaWVyYXJjaHkgJiYgY29udGV4dEhpZXJhcmNoeS5kb20pIHtcbiAgICAgICAgICAgIC8vIFNraXAgY3VycmVudCBub2RlIGJlY2F1c2Ugd2Ugd2FudCBhbmNlc3RyeVxuICAgICAgICAgICAgZm9yIChsZXQgaWR4PWNvbnRleHRIaWVyYXJjaHkuZG9tLmxlbmd0aC0yOyBpZHggPj0gMDsgLS1pZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gKGNvbnRleHRIaWVyYXJjaHkuZG9tW2lkeF0ubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlmcmFtZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vLi4vLi4vYXBpL0lFbmdpbmVcIjtcblxuZXhwb3J0IGNsYXNzIEZyYWdtZW50VXRpbCB7XG4gICAgcHVibGljIHN0YXRpYyBnZXRPd25lckZyYWdtZW50KG5vZGU6IE5vZGUpIDogRG9jdW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHtcbiAgICAgICAgbGV0IG4gOiBOb2RlID0gbm9kZTtcbiAgICAgICAgd2hpbGUobi5wYXJlbnROb2RlICYmIChuID0gbi5wYXJlbnROb2RlKSl7XG4gICAgICAgICAgICBpZiAobi5ub2RlVHlwZSA9PT0gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbiBhcyBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRCeUlkKG5vZGU6IE5vZGUsIGlkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3duZXJGcmFnbWVudChub2RlKS5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcihoaWVyYXJjaGllczogUnVsZUNvbnRleHRIaWVyYXJjaHksIGVsZW1OYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IG1hdGNoZXMgPSBoaWVyYXJjaGllc1tcImRvbVwiXS5maWx0ZXIoaW5mbyA9PiBpbmZvLnJvbGUgPT09IGVsZW1OYW1lKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXMubGVuZ3RoID4gMCAmJiBtYXRjaGVzWzBdLm5vZGUgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGUoaGllcmFyY2hpZXM6IFJ1bGVDb250ZXh0SGllcmFyY2h5LCByb2xlOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IG1hdGNoZXMgPSBoaWVyYXJjaGllc1tcImFyaWFcIl0uZmlsdGVyKGluZm8gPT4gaW5mby5yb2xlID09PSByb2xlKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXMubGVuZ3RoID4gMCAmJiBtYXRjaGVzWzBdLm5vZGUgfHwgbnVsbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIxLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vLyBGcm9tIGh0dHBzOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2xhbmd1YWdlLXN1YnRhZy1yZWdpc3RyeS9sYW5ndWFnZS1zdWJ0YWctcmVnaXN0cnlcbmNvbnN0IHZhbGlkUHJpbWFyeUxhbmdzID0gWyAvLyBcInFhYS4ucXR6XCIsXG5bIFwiYWFcIixcImFiXCIsXCJhZVwiLFwiYWZcIixcImFrXCIsXCJhbVwiLFwiYW5cIixcImFyXCIsXCJhc1wiLFwiYXZcIixcImF5XCIsXCJhelwiLFwiYWFhXCIsXCJhYWJcIixcImFhY1wiLFwiYWFkXCIsXCJhYWVcIixcImFhZlwiLFwiYWFnXCIsXCJhYWhcIixcImFhaVwiLFwiYWFrXCIsXCJhYWxcIixcImFhbVwiLFwiYWFuXCIsXCJhYW9cIixcImFhcFwiLFwiYWFxXCIsXCJhYXNcIixcImFhdFwiLFwiYWF1XCIsXCJhYXZcIixcImFhd1wiLFwiYWF4XCIsXCJhYXpcIixcImFiYVwiLFwiYWJiXCIsXCJhYmNcIixcImFiZFwiLFwiYWJlXCIsXCJhYmZcIixcImFiZ1wiLFwiYWJoXCIsXCJhYmlcIixcImFialwiLFwiYWJsXCIsXCJhYm1cIixcImFiblwiLFwiYWJvXCIsXCJhYnBcIixcImFicVwiLFwiYWJyXCIsXCJhYnNcIixcImFidFwiLFwiYWJ1XCIsXCJhYnZcIixcImFid1wiLFwiYWJ4XCIsXCJhYnlcIixcImFielwiLFwiYWNhXCIsXCJhY2JcIixcImFjZFwiLFwiYWNlXCIsXCJhY2ZcIixcImFjaFwiLFwiYWNpXCIsXCJhY2tcIixcImFjbFwiLFwiYWNtXCIsXCJhY25cIixcImFjcFwiLFwiYWNxXCIsXCJhY3JcIixcImFjc1wiLFwiYWN0XCIsXCJhY3VcIixcImFjdlwiLFwiYWN3XCIsXCJhY3hcIixcImFjeVwiLFwiYWN6XCIsXCJhZGFcIixcImFkYlwiLFwiYWRkXCIsXCJhZGVcIixcImFkZlwiLFwiYWRnXCIsXCJhZGhcIixcImFkaVwiLFwiYWRqXCIsXCJhZGxcIixcImFkblwiLFwiYWRvXCIsXCJhZHBcIixcImFkcVwiLFwiYWRyXCIsXCJhZHNcIixcImFkdFwiLFwiYWR1XCIsXCJhZHdcIixcImFkeFwiLFwiYWR5XCIsXCJhZHpcIixcImFlYVwiLFwiYWViXCIsXCJhZWNcIixcImFlZFwiLFwiYWVlXCIsXCJhZWtcIixcImFlbFwiLFwiYWVtXCIsXCJhZW5cIixcImFlcVwiLFwiYWVyXCIsXCJhZXNcIixcImFldVwiLFwiYWV3XCIsXCJhZXlcIixcImFlelwiLFwiYWZhXCIsXCJhZmJcIixcImFmZFwiLFwiYWZlXCIsXCJhZmdcIixcImFmaFwiLFwiYWZpXCIsXCJhZmtcIixcImFmblwiLFwiYWZvXCIsXCJhZnBcIixcImFmc1wiLFwiYWZ0XCIsXCJhZnVcIixcImFmelwiLFwiYWdhXCIsXCJhZ2JcIixcImFnY1wiLFwiYWdkXCIsXCJhZ2VcIixcImFnZlwiLFwiYWdnXCIsXCJhZ2hcIixcImFnaVwiLFwiYWdqXCIsXCJhZ2tcIixcImFnbFwiLFwiYWdtXCIsXCJhZ25cIixcImFnb1wiLFwiYWdwXCIsXCJhZ3FcIixcImFnclwiLFwiYWdzXCIsXCJhZ3RcIixcImFndVwiLFwiYWd2XCIsXCJhZ3dcIixcImFneFwiLFwiYWd5XCIsXCJhZ3pcIixcImFoYVwiLFwiYWhiXCIsXCJhaGdcIixcImFoaFwiLFwiYWhpXCIsXCJhaGtcIixcImFobFwiLFwiYWhtXCIsXCJhaG5cIixcImFob1wiLFwiYWhwXCIsXCJhaHJcIixcImFoc1wiLFwiYWh0XCIsXCJhaWFcIixcImFpYlwiLFwiYWljXCIsXCJhaWRcIixcImFpZVwiLFwiYWlmXCIsXCJhaWdcIixcImFpaFwiLFwiYWlpXCIsXCJhaWpcIixcImFpa1wiLFwiYWlsXCIsXCJhaW1cIixcImFpblwiLFwiYWlvXCIsXCJhaXBcIixcImFpcVwiLFwiYWlyXCIsXCJhaXNcIixcImFpdFwiLFwiYWl3XCIsXCJhaXhcIixcImFpeVwiLFwiYWphXCIsXCJhamdcIixcImFqaVwiLFwiYWpuXCIsXCJhanBcIixcImFqdFwiLFwiYWp1XCIsXCJhandcIixcImFqelwiLFwiYWtiXCIsXCJha2NcIixcImFrZFwiLFwiYWtlXCIsXCJha2ZcIixcImFrZ1wiLFwiYWtoXCIsXCJha2lcIixcImFralwiLFwiYWtrXCIsXCJha2xcIixcImFrbVwiLFwiYWtvXCIsXCJha3BcIixcImFrcVwiLFwiYWtyXCIsXCJha3NcIixcImFrdFwiLFwiYWt1XCIsXCJha3ZcIixcImFrd1wiLFwiYWt4XCIsXCJha3lcIixcImFrelwiLFwiYWxhXCIsXCJhbGNcIixcImFsZFwiLFwiYWxlXCIsXCJhbGZcIixcImFsZ1wiLFwiYWxoXCIsXCJhbGlcIixcImFsalwiLFwiYWxrXCIsXCJhbGxcIixcImFsbVwiLFwiYWxuXCIsXCJhbG9cIixcImFscFwiLFwiYWxxXCIsXCJhbHJcIixcImFsc1wiLFwiYWx0XCIsXCJhbHVcIixcImFsdlwiLFwiYWx3XCIsXCJhbHhcIixcImFseVwiLFwiYWx6XCIsXCJhbWFcIixcImFtYlwiLFwiYW1jXCIsXCJhbWVcIixcImFtZlwiLFwiYW1nXCIsXCJhbWlcIixcImFtalwiLFwiYW1rXCIsXCJhbWxcIixcImFtbVwiLFwiYW1uXCIsXCJhbW9cIixcImFtcFwiLFwiYW1xXCIsXCJhbXJcIixcImFtc1wiLFwiYW10XCIsXCJhbXVcIixcImFtdlwiLFwiYW13XCIsXCJhbXhcIixcImFteVwiLFwiYW16XCIsXCJhbmFcIixcImFuYlwiLFwiYW5jXCIsXCJhbmRcIixcImFuZVwiLFwiYW5mXCIsXCJhbmdcIixcImFuaFwiLFwiYW5pXCIsXCJhbmpcIixcImFua1wiLFwiYW5sXCIsXCJhbm1cIixcImFublwiLFwiYW5vXCIsXCJhbnBcIixcImFucVwiLFwiYW5yXCIsXCJhbnNcIixcImFudFwiLFwiYW51XCIsXCJhbnZcIixcImFud1wiLFwiYW54XCIsXCJhbnlcIixcImFuelwiLFwiYW9hXCIsXCJhb2JcIixcImFvY1wiLFwiYW9kXCIsXCJhb2VcIixcImFvZlwiLFwiYW9nXCIsXCJhb2hcIixcImFvaVwiLFwiYW9qXCIsXCJhb2tcIixcImFvbFwiLFwiYW9tXCIsXCJhb25cIixcImFvclwiLFwiYW9zXCIsXCJhb3RcIixcImFvdVwiLFwiYW94XCIsXCJhb3pcIixcImFwYVwiLFwiYXBiXCIsXCJhcGNcIixcImFwZFwiLFwiYXBlXCIsXCJhcGZcIixcImFwZ1wiLFwiYXBoXCIsXCJhcGlcIixcImFwalwiLFwiYXBrXCIsXCJhcGxcIixcImFwbVwiLFwiYXBuXCIsXCJhcG9cIixcImFwcFwiLFwiYXBxXCIsXCJhcHJcIixcImFwc1wiLFwiYXB0XCIsXCJhcHVcIixcImFwdlwiLFwiYXB3XCIsXCJhcHhcIixcImFweVwiLFwiYXB6XCIsXCJhcWFcIixcImFxY1wiLFwiYXFkXCIsXCJhcWdcIixcImFxa1wiLFwiYXFsXCIsXCJhcW1cIixcImFxblwiLFwiYXFwXCIsXCJhcXJcIixcImFxdFwiLFwiYXF6XCIsXCJhcmJcIixcImFyY1wiLFwiYXJkXCIsXCJhcmVcIixcImFyaFwiLFwiYXJpXCIsXCJhcmpcIixcImFya1wiLFwiYXJsXCIsXCJhcm5cIixcImFyb1wiLFwiYXJwXCIsXCJhcnFcIixcImFyclwiLFwiYXJzXCIsXCJhcnRcIixcImFydVwiLFwiYXJ2XCIsXCJhcndcIixcImFyeFwiLFwiYXJ5XCIsXCJhcnpcIixcImFzYVwiLFwiYXNiXCIsXCJhc2NcIixcImFzZFwiLFwiYXNlXCIsXCJhc2ZcIixcImFzZ1wiLFwiYXNoXCIsXCJhc2lcIixcImFzalwiLFwiYXNrXCIsXCJhc2xcIixcImFzblwiLFwiYXNvXCIsXCJhc3BcIixcImFzcVwiLFwiYXNyXCIsXCJhc3NcIixcImFzdFwiLFwiYXN1XCIsXCJhc3ZcIixcImFzd1wiLFwiYXN4XCIsXCJhc3lcIixcImFzelwiLFwiYXRhXCIsXCJhdGJcIixcImF0Y1wiLFwiYXRkXCIsXCJhdGVcIixcImF0Z1wiLFwiYXRoXCIsXCJhdGlcIixcImF0alwiLFwiYXRrXCIsXCJhdGxcIixcImF0bVwiLFwiYXRuXCIsXCJhdG9cIixcImF0cFwiLFwiYXRxXCIsXCJhdHJcIixcImF0c1wiLFwiYXR0XCIsXCJhdHVcIixcImF0dlwiLFwiYXR3XCIsXCJhdHhcIixcImF0eVwiLFwiYXR6XCIsXCJhdWFcIixcImF1YlwiLFwiYXVjXCIsXCJhdWRcIixcImF1ZVwiLFwiYXVmXCIsXCJhdWdcIixcImF1aFwiLFwiYXVpXCIsXCJhdWpcIixcImF1a1wiLFwiYXVsXCIsXCJhdW1cIixcImF1blwiLFwiYXVvXCIsXCJhdXBcIixcImF1cVwiLFwiYXVyXCIsXCJhdXNcIixcImF1dFwiLFwiYXV1XCIsXCJhdXdcIixcImF1eFwiLFwiYXV5XCIsXCJhdXpcIixcImF2YlwiLFwiYXZkXCIsXCJhdmlcIixcImF2a1wiLFwiYXZsXCIsXCJhdm1cIixcImF2blwiLFwiYXZvXCIsXCJhdnNcIixcImF2dFwiLFwiYXZ1XCIsXCJhdnZcIixcImF3YVwiLFwiYXdiXCIsXCJhd2NcIixcImF3ZFwiLFwiYXdlXCIsXCJhd2dcIixcImF3aFwiLFwiYXdpXCIsXCJhd2tcIixcImF3bVwiLFwiYXduXCIsXCJhd29cIixcImF3clwiLFwiYXdzXCIsXCJhd3RcIixcImF3dVwiLFwiYXd2XCIsXCJhd3dcIixcImF3eFwiLFwiYXd5XCIsXCJheGJcIixcImF4ZVwiLFwiYXhnXCIsXCJheGtcIixcImF4bFwiLFwiYXhtXCIsXCJheHhcIixcImF5YVwiLFwiYXliXCIsXCJheWNcIixcImF5ZFwiLFwiYXllXCIsXCJheWdcIixcImF5aFwiLFwiYXlpXCIsXCJheWtcIixcImF5bFwiLFwiYXluXCIsXCJheW9cIixcImF5cFwiLFwiYXlxXCIsXCJheXJcIixcImF5c1wiLFwiYXl0XCIsXCJheXVcIixcImF5eFwiLFwiYXl5XCIsXCJheXpcIixcImF6YVwiLFwiYXpiXCIsXCJhemNcIixcImF6ZFwiLFwiYXpnXCIsXCJhempcIixcImF6bVwiLFwiYXpuXCIsXCJhem9cIixcImF6dFwiLFwiYXp6XCJdXG4sWyBcImJhXCIsXCJiZVwiLFwiYmdcIixcImJoXCIsXCJiaVwiLFwiYm1cIixcImJuXCIsXCJib1wiLFwiYnJcIixcImJzXCIsXCJiYWFcIixcImJhYlwiLFwiYmFjXCIsXCJiYWRcIixcImJhZVwiLFwiYmFmXCIsXCJiYWdcIixcImJhaFwiLFwiYmFpXCIsXCJiYWpcIixcImJhbFwiLFwiYmFuXCIsXCJiYW9cIixcImJhcFwiLFwiYmFyXCIsXCJiYXNcIixcImJhdFwiLFwiYmF1XCIsXCJiYXZcIixcImJhd1wiLFwiYmF4XCIsXCJiYXlcIixcImJhelwiLFwiYmJhXCIsXCJiYmJcIixcImJiY1wiLFwiYmJkXCIsXCJiYmVcIixcImJiZlwiLFwiYmJnXCIsXCJiYmhcIixcImJiaVwiLFwiYmJqXCIsXCJiYmtcIixcImJibFwiLFwiYmJtXCIsXCJiYm5cIixcImJib1wiLFwiYmJwXCIsXCJiYnFcIixcImJiclwiLFwiYmJzXCIsXCJiYnRcIixcImJidVwiLFwiYmJ2XCIsXCJiYndcIixcImJieFwiLFwiYmJ5XCIsXCJiYnpcIixcImJjYVwiLFwiYmNiXCIsXCJiY2NcIixcImJjZFwiLFwiYmNlXCIsXCJiY2ZcIixcImJjZ1wiLFwiYmNoXCIsXCJiY2lcIixcImJjalwiLFwiYmNrXCIsXCJiY2xcIixcImJjbVwiLFwiYmNuXCIsXCJiY29cIixcImJjcFwiLFwiYmNxXCIsXCJiY3JcIixcImJjc1wiLFwiYmN0XCIsXCJiY3VcIixcImJjdlwiLFwiYmN3XCIsXCJiY3lcIixcImJjelwiLFwiYmRhXCIsXCJiZGJcIixcImJkY1wiLFwiYmRkXCIsXCJiZGVcIixcImJkZlwiLFwiYmRnXCIsXCJiZGhcIixcImJkaVwiLFwiYmRqXCIsXCJiZGtcIixcImJkbFwiLFwiYmRtXCIsXCJiZG5cIixcImJkb1wiLFwiYmRwXCIsXCJiZHFcIixcImJkclwiLFwiYmRzXCIsXCJiZHRcIixcImJkdVwiLFwiYmR2XCIsXCJiZHdcIixcImJkeFwiLFwiYmR5XCIsXCJiZHpcIixcImJlYVwiLFwiYmViXCIsXCJiZWNcIixcImJlZFwiLFwiYmVlXCIsXCJiZWZcIixcImJlZ1wiLFwiYmVoXCIsXCJiZWlcIixcImJlalwiLFwiYmVrXCIsXCJiZW1cIixcImJlb1wiLFwiYmVwXCIsXCJiZXFcIixcImJlclwiLFwiYmVzXCIsXCJiZXRcIixcImJldVwiLFwiYmV2XCIsXCJiZXdcIixcImJleFwiLFwiYmV5XCIsXCJiZXpcIixcImJmYVwiLFwiYmZiXCIsXCJiZmNcIixcImJmZFwiLFwiYmZlXCIsXCJiZmZcIixcImJmZ1wiLFwiYmZoXCIsXCJiZmlcIixcImJmalwiLFwiYmZrXCIsXCJiZmxcIixcImJmbVwiLFwiYmZuXCIsXCJiZm9cIixcImJmcFwiLFwiYmZxXCIsXCJiZnJcIixcImJmc1wiLFwiYmZ0XCIsXCJiZnVcIixcImJmd1wiLFwiYmZ4XCIsXCJiZnlcIixcImJmelwiLFwiYmdhXCIsXCJiZ2JcIixcImJnY1wiLFwiYmdkXCIsXCJiZ2VcIixcImJnZlwiLFwiYmdnXCIsXCJiZ2lcIixcImJnalwiLFwiYmdrXCIsXCJiZ2xcIixcImJnbVwiLFwiYmduXCIsXCJiZ29cIixcImJncFwiLFwiYmdxXCIsXCJiZ3JcIixcImJnc1wiLFwiYmd0XCIsXCJiZ3VcIixcImJndlwiLFwiYmd3XCIsXCJiZ3hcIixcImJneVwiLFwiYmd6XCIsXCJiaGFcIixcImJoYlwiLFwiYmhjXCIsXCJiaGRcIixcImJoZVwiLFwiYmhmXCIsXCJiaGdcIixcImJoaFwiLFwiYmhpXCIsXCJiaGpcIixcImJoa1wiLFwiYmhsXCIsXCJiaG1cIixcImJoblwiLFwiYmhvXCIsXCJiaHBcIixcImJocVwiLFwiYmhyXCIsXCJiaHNcIixcImJodFwiLFwiYmh1XCIsXCJiaHZcIixcImJod1wiLFwiYmh4XCIsXCJiaHlcIixcImJoelwiLFwiYmlhXCIsXCJiaWJcIixcImJpY1wiLFwiYmlkXCIsXCJiaWVcIixcImJpZlwiLFwiYmlnXCIsXCJiaWpcIixcImJpa1wiLFwiYmlsXCIsXCJiaW1cIixcImJpblwiLFwiYmlvXCIsXCJiaXBcIixcImJpcVwiLFwiYmlyXCIsXCJiaXRcIixcImJpdVwiLFwiYml2XCIsXCJiaXdcIixcImJpeFwiLFwiYml5XCIsXCJiaXpcIixcImJqYVwiLFwiYmpiXCIsXCJiamNcIixcImJqZFwiLFwiYmplXCIsXCJiamZcIixcImJqZ1wiLFwiYmpoXCIsXCJiamlcIixcImJqalwiLFwiYmprXCIsXCJiamxcIixcImJqbVwiLFwiYmpuXCIsXCJiam9cIixcImJqcFwiLFwiYmpxXCIsXCJianJcIixcImJqc1wiLFwiYmp0XCIsXCJianVcIixcImJqdlwiLFwiYmp3XCIsXCJianhcIixcImJqeVwiLFwiYmp6XCIsXCJia2FcIixcImJrYlwiLFwiYmtjXCIsXCJia2RcIixcImJrZlwiLFwiYmtnXCIsXCJia2hcIixcImJraVwiLFwiYmtqXCIsXCJia2tcIixcImJrbFwiLFwiYmttXCIsXCJia25cIixcImJrb1wiLFwiYmtwXCIsXCJia3FcIixcImJrclwiLFwiYmtzXCIsXCJia3RcIixcImJrdVwiLFwiYmt2XCIsXCJia3dcIixcImJreFwiLFwiYmt5XCIsXCJia3pcIixcImJsYVwiLFwiYmxiXCIsXCJibGNcIixcImJsZFwiLFwiYmxlXCIsXCJibGZcIixcImJsZ1wiLFwiYmxoXCIsXCJibGlcIixcImJsalwiLFwiYmxrXCIsXCJibGxcIixcImJsbVwiLFwiYmxuXCIsXCJibG9cIixcImJscFwiLFwiYmxxXCIsXCJibHJcIixcImJsc1wiLFwiYmx0XCIsXCJibHZcIixcImJsd1wiLFwiYmx4XCIsXCJibHlcIixcImJselwiLFwiYm1hXCIsXCJibWJcIixcImJtY1wiLFwiYm1kXCIsXCJibWVcIixcImJtZlwiLFwiYm1nXCIsXCJibWhcIixcImJtaVwiLFwiYm1qXCIsXCJibWtcIixcImJtbFwiLFwiYm1tXCIsXCJibW5cIixcImJtb1wiLFwiYm1wXCIsXCJibXFcIixcImJtclwiLFwiYm1zXCIsXCJibXRcIixcImJtdVwiLFwiYm12XCIsXCJibXdcIixcImJteFwiLFwiYm15XCIsXCJibXpcIixcImJuYVwiLFwiYm5iXCIsXCJibmNcIixcImJuZFwiLFwiYm5lXCIsXCJibmZcIixcImJuZ1wiLFwiYm5pXCIsXCJibmpcIixcImJua1wiLFwiYm5sXCIsXCJibm1cIixcImJublwiLFwiYm5vXCIsXCJibnBcIixcImJucVwiLFwiYm5yXCIsXCJibnNcIixcImJudFwiLFwiYm51XCIsXCJibnZcIixcImJud1wiLFwiYm54XCIsXCJibnlcIixcImJuelwiLFwiYm9hXCIsXCJib2JcIixcImJvZVwiLFwiYm9mXCIsXCJib2dcIixcImJvaFwiLFwiYm9pXCIsXCJib2pcIixcImJva1wiLFwiYm9sXCIsXCJib21cIixcImJvblwiLFwiYm9vXCIsXCJib3BcIixcImJvcVwiLFwiYm9yXCIsXCJib3RcIixcImJvdVwiLFwiYm92XCIsXCJib3dcIixcImJveFwiLFwiYm95XCIsXCJib3pcIixcImJwYVwiLFwiYnBiXCIsXCJicGRcIixcImJwZVwiLFwiYnBnXCIsXCJicGhcIixcImJwaVwiLFwiYnBqXCIsXCJicGtcIixcImJwbFwiLFwiYnBtXCIsXCJicG5cIixcImJwb1wiLFwiYnBwXCIsXCJicHFcIixcImJwclwiLFwiYnBzXCIsXCJicHRcIixcImJwdVwiLFwiYnB2XCIsXCJicHdcIixcImJweFwiLFwiYnB5XCIsXCJicHpcIixcImJxYVwiLFwiYnFiXCIsXCJicWNcIixcImJxZFwiLFwiYnFmXCIsXCJicWdcIixcImJxaFwiLFwiYnFpXCIsXCJicWpcIixcImJxa1wiLFwiYnFsXCIsXCJicW1cIixcImJxblwiLFwiYnFvXCIsXCJicXBcIixcImJxcVwiLFwiYnFyXCIsXCJicXNcIixcImJxdFwiLFwiYnF1XCIsXCJicXZcIixcImJxd1wiLFwiYnF4XCIsXCJicXlcIixcImJxelwiLFwiYnJhXCIsXCJicmJcIixcImJyY1wiLFwiYnJkXCIsXCJicmZcIixcImJyZ1wiLFwiYnJoXCIsXCJicmlcIixcImJyalwiLFwiYnJrXCIsXCJicmxcIixcImJybVwiLFwiYnJuXCIsXCJicm9cIixcImJycFwiLFwiYnJxXCIsXCJicnJcIixcImJyc1wiLFwiYnJ0XCIsXCJicnVcIixcImJydlwiLFwiYnJ3XCIsXCJicnhcIixcImJyeVwiLFwiYnJ6XCIsXCJic2FcIixcImJzYlwiLFwiYnNjXCIsXCJic2VcIixcImJzZlwiLFwiYnNnXCIsXCJic2hcIixcImJzaVwiLFwiYnNqXCIsXCJic2tcIixcImJzbFwiLFwiYnNtXCIsXCJic25cIixcImJzb1wiLFwiYnNwXCIsXCJic3FcIixcImJzclwiLFwiYnNzXCIsXCJic3RcIixcImJzdVwiLFwiYnN2XCIsXCJic3dcIixcImJzeFwiLFwiYnN5XCIsXCJidGFcIixcImJ0YlwiLFwiYnRjXCIsXCJidGRcIixcImJ0ZVwiLFwiYnRmXCIsXCJidGdcIixcImJ0aFwiLFwiYnRpXCIsXCJidGpcIixcImJ0a1wiLFwiYnRsXCIsXCJidG1cIixcImJ0blwiLFwiYnRvXCIsXCJidHBcIixcImJ0cVwiLFwiYnRyXCIsXCJidHNcIixcImJ0dFwiLFwiYnR1XCIsXCJidHZcIixcImJ0d1wiLFwiYnR4XCIsXCJidHlcIixcImJ0elwiLFwiYnVhXCIsXCJidWJcIixcImJ1Y1wiLFwiYnVkXCIsXCJidWVcIixcImJ1ZlwiLFwiYnVnXCIsXCJidWhcIixcImJ1aVwiLFwiYnVqXCIsXCJidWtcIixcImJ1bVwiLFwiYnVuXCIsXCJidW9cIixcImJ1cFwiLFwiYnVxXCIsXCJidXNcIixcImJ1dFwiLFwiYnV1XCIsXCJidXZcIixcImJ1d1wiLFwiYnV4XCIsXCJidXlcIixcImJ1elwiLFwiYnZhXCIsXCJidmJcIixcImJ2Y1wiLFwiYnZkXCIsXCJidmVcIixcImJ2ZlwiLFwiYnZnXCIsXCJidmhcIixcImJ2aVwiLFwiYnZqXCIsXCJidmtcIixcImJ2bFwiLFwiYnZtXCIsXCJidm5cIixcImJ2b1wiLFwiYnZwXCIsXCJidnFcIixcImJ2clwiLFwiYnZ0XCIsXCJidnVcIixcImJ2dlwiLFwiYnZ3XCIsXCJidnhcIixcImJ2eVwiLFwiYnZ6XCIsXCJid2FcIixcImJ3YlwiLFwiYndjXCIsXCJid2RcIixcImJ3ZVwiLFwiYndmXCIsXCJid2dcIixcImJ3aFwiLFwiYndpXCIsXCJid2pcIixcImJ3a1wiLFwiYndsXCIsXCJid21cIixcImJ3blwiLFwiYndvXCIsXCJid3BcIixcImJ3cVwiLFwiYndyXCIsXCJid3NcIixcImJ3dFwiLFwiYnd1XCIsXCJid3dcIixcImJ3eFwiLFwiYnd5XCIsXCJid3pcIixcImJ4YVwiLFwiYnhiXCIsXCJieGNcIixcImJ4ZFwiLFwiYnhlXCIsXCJieGZcIixcImJ4Z1wiLFwiYnhoXCIsXCJieGlcIixcImJ4alwiLFwiYnhrXCIsXCJieGxcIixcImJ4bVwiLFwiYnhuXCIsXCJieG9cIixcImJ4cFwiLFwiYnhxXCIsXCJieHJcIixcImJ4c1wiLFwiYnh1XCIsXCJieHZcIixcImJ4d1wiLFwiYnh4XCIsXCJieHpcIixcImJ5YVwiLFwiYnliXCIsXCJieWNcIixcImJ5ZFwiLFwiYnllXCIsXCJieWZcIixcImJ5Z1wiLFwiYnloXCIsXCJieWlcIixcImJ5alwiLFwiYnlrXCIsXCJieWxcIixcImJ5bVwiLFwiYnluXCIsXCJieW9cIixcImJ5cFwiLFwiYnlxXCIsXCJieXJcIixcImJ5c1wiLFwiYnl0XCIsXCJieXZcIixcImJ5d1wiLFwiYnl4XCIsXCJieXlcIixcImJ5elwiLFwiYnphXCIsXCJiemJcIixcImJ6Y1wiLFwiYnpkXCIsXCJiemVcIixcImJ6ZlwiLFwiYnpnXCIsXCJiemhcIixcImJ6aVwiLFwiYnpqXCIsXCJiemtcIixcImJ6bFwiLFwiYnptXCIsXCJiem5cIixcImJ6b1wiLFwiYnpwXCIsXCJienFcIixcImJ6clwiLFwiYnpzXCIsXCJienRcIixcImJ6dVwiLFwiYnp2XCIsXCJiendcIixcImJ6eFwiLFwiYnp5XCIsXCJienpcIl1cbixbIFwiY2FcIixcImNlXCIsXCJjaFwiLFwiY29cIixcImNyXCIsXCJjc1wiLFwiY3VcIixcImN2XCIsXCJjeVwiLFwiY2FhXCIsXCJjYWJcIixcImNhY1wiLFwiY2FkXCIsXCJjYWVcIixcImNhZlwiLFwiY2FnXCIsXCJjYWhcIixcImNhaVwiLFwiY2FqXCIsXCJjYWtcIixcImNhbFwiLFwiY2FtXCIsXCJjYW5cIixcImNhb1wiLFwiY2FwXCIsXCJjYXFcIixcImNhclwiLFwiY2FzXCIsXCJjYXVcIixcImNhdlwiLFwiY2F3XCIsXCJjYXhcIixcImNheVwiLFwiY2F6XCIsXCJjYmFcIixcImNiYlwiLFwiY2JjXCIsXCJjYmRcIixcImNiZVwiLFwiY2JnXCIsXCJjYmhcIixcImNiaVwiLFwiY2JqXCIsXCJjYmtcIixcImNibFwiLFwiY2JuXCIsXCJjYm9cIixcImNicVwiLFwiY2JyXCIsXCJjYnNcIixcImNidFwiLFwiY2J1XCIsXCJjYnZcIixcImNid1wiLFwiY2J5XCIsXCJjY2FcIixcImNjY1wiLFwiY2NkXCIsXCJjY2VcIixcImNjZ1wiLFwiY2NoXCIsXCJjY2pcIixcImNjbFwiLFwiY2NtXCIsXCJjY25cIixcImNjb1wiLFwiY2NwXCIsXCJjY3FcIixcImNjclwiLFwiY2NzXCIsXCJjZGFcIixcImNkY1wiLFwiY2RkXCIsXCJjZGVcIixcImNkZlwiLFwiY2RnXCIsXCJjZGhcIixcImNkaVwiLFwiY2RqXCIsXCJjZG1cIixcImNkblwiLFwiY2RvXCIsXCJjZHJcIixcImNkc1wiLFwiY2R5XCIsXCJjZHpcIixcImNlYVwiLFwiY2ViXCIsXCJjZWdcIixcImNla1wiLFwiY2VsXCIsXCJjZW5cIixcImNldFwiLFwiY2V5XCIsXCJjZmFcIixcImNmZFwiLFwiY2ZnXCIsXCJjZm1cIixcImNnYVwiLFwiY2djXCIsXCJjZ2dcIixcImNna1wiLFwiY2hiXCIsXCJjaGNcIixcImNoZFwiLFwiY2hmXCIsXCJjaGdcIixcImNoaFwiLFwiY2hqXCIsXCJjaGtcIixcImNobFwiLFwiY2htXCIsXCJjaG5cIixcImNob1wiLFwiY2hwXCIsXCJjaHFcIixcImNoclwiLFwiY2h0XCIsXCJjaHdcIixcImNoeFwiLFwiY2h5XCIsXCJjaHpcIixcImNpYVwiLFwiY2liXCIsXCJjaWNcIixcImNpZFwiLFwiY2llXCIsXCJjaWhcIixcImNpa1wiLFwiY2ltXCIsXCJjaW5cIixcImNpcFwiLFwiY2lyXCIsXCJjaXdcIixcImNpeVwiLFwiY2phXCIsXCJjamVcIixcImNqaFwiLFwiY2ppXCIsXCJjamtcIixcImNqbVwiLFwiY2puXCIsXCJjam9cIixcImNqcFwiLFwiY2pyXCIsXCJjanNcIixcImNqdlwiLFwiY2p5XCIsXCJja2FcIixcImNrYlwiLFwiY2toXCIsXCJja2xcIixcImNrbVwiLFwiY2tuXCIsXCJja29cIixcImNrcVwiLFwiY2tyXCIsXCJja3NcIixcImNrdFwiLFwiY2t1XCIsXCJja3ZcIixcImNreFwiLFwiY2t5XCIsXCJja3pcIixcImNsYVwiLFwiY2xjXCIsXCJjbGRcIixcImNsZVwiLFwiY2xoXCIsXCJjbGlcIixcImNsalwiLFwiY2xrXCIsXCJjbGxcIixcImNsbVwiLFwiY2xvXCIsXCJjbHRcIixcImNsdVwiLFwiY2x3XCIsXCJjbHlcIixcImNtYVwiLFwiY21jXCIsXCJjbWVcIixcImNtZ1wiLFwiY21pXCIsXCJjbWtcIixcImNtbFwiLFwiY21tXCIsXCJjbW5cIixcImNtb1wiLFwiY21yXCIsXCJjbXNcIixcImNtdFwiLFwiY25hXCIsXCJjbmJcIixcImNuY1wiLFwiY25nXCIsXCJjbmhcIixcImNuaVwiLFwiY25rXCIsXCJjbmxcIixcImNub1wiLFwiY25wXCIsXCJjbnJcIixcImNuc1wiLFwiY250XCIsXCJjbnVcIixcImNud1wiLFwiY254XCIsXCJjb2FcIixcImNvYlwiLFwiY29jXCIsXCJjb2RcIixcImNvZVwiLFwiY29mXCIsXCJjb2dcIixcImNvaFwiLFwiY29qXCIsXCJjb2tcIixcImNvbFwiLFwiY29tXCIsXCJjb25cIixcImNvb1wiLFwiY29wXCIsXCJjb3FcIixcImNvdFwiLFwiY291XCIsXCJjb3ZcIixcImNvd1wiLFwiY294XCIsXCJjb3lcIixcImNvelwiLFwiY3BhXCIsXCJjcGJcIixcImNwY1wiLFwiY3BlXCIsXCJjcGZcIixcImNwZ1wiLFwiY3BpXCIsXCJjcG5cIixcImNwb1wiLFwiY3BwXCIsXCJjcHNcIixcImNwdVwiLFwiY3B4XCIsXCJjcHlcIixcImNxZFwiLFwiY3F1XCIsXCJjcmFcIixcImNyYlwiLFwiY3JjXCIsXCJjcmRcIixcImNyZlwiLFwiY3JnXCIsXCJjcmhcIixcImNyaVwiLFwiY3JqXCIsXCJjcmtcIixcImNybFwiLFwiY3JtXCIsXCJjcm5cIixcImNyb1wiLFwiY3JwXCIsXCJjcnFcIixcImNyclwiLFwiY3JzXCIsXCJjcnRcIixcImNydlwiLFwiY3J3XCIsXCJjcnhcIixcImNyeVwiLFwiY3J6XCIsXCJjc2FcIixcImNzYlwiLFwiY3NjXCIsXCJjc2RcIixcImNzZVwiLFwiY3NmXCIsXCJjc2dcIixcImNzaFwiLFwiY3NpXCIsXCJjc2pcIixcImNza1wiLFwiY3NsXCIsXCJjc21cIixcImNzblwiLFwiY3NvXCIsXCJjc3BcIixcImNzcVwiLFwiY3NyXCIsXCJjc3NcIixcImNzdFwiLFwiY3N1XCIsXCJjc3ZcIixcImNzd1wiLFwiY3N4XCIsXCJjc3lcIixcImNzelwiLFwiY3RhXCIsXCJjdGNcIixcImN0ZFwiLFwiY3RlXCIsXCJjdGdcIixcImN0aFwiLFwiY3RsXCIsXCJjdG1cIixcImN0blwiLFwiY3RvXCIsXCJjdHBcIixcImN0c1wiLFwiY3R0XCIsXCJjdHVcIixcImN0eVwiLFwiY3R6XCIsXCJjdWFcIixcImN1YlwiLFwiY3VjXCIsXCJjdWdcIixcImN1aFwiLFwiY3VpXCIsXCJjdWpcIixcImN1a1wiLFwiY3VsXCIsXCJjdW1cIixcImN1b1wiLFwiY3VwXCIsXCJjdXFcIixcImN1clwiLFwiY3VzXCIsXCJjdXRcIixcImN1dVwiLFwiY3V2XCIsXCJjdXdcIixcImN1eFwiLFwiY3V5XCIsXCJjdmdcIixcImN2blwiLFwiY3dhXCIsXCJjd2JcIixcImN3ZFwiLFwiY3dlXCIsXCJjd2dcIixcImN3dFwiLFwiY3lhXCIsXCJjeWJcIixcImN5b1wiLFwiY3poXCIsXCJjemtcIixcImN6blwiLFwiY3pvXCIsXCJjenRcIl1cbixbIFwiZGFcIixcImRlXCIsXCJkdlwiLFwiZHpcIixcImRhYVwiLFwiZGFjXCIsXCJkYWRcIixcImRhZVwiLFwiZGFmXCIsXCJkYWdcIixcImRhaFwiLFwiZGFpXCIsXCJkYWpcIixcImRha1wiLFwiZGFsXCIsXCJkYW1cIixcImRhb1wiLFwiZGFwXCIsXCJkYXFcIixcImRhclwiLFwiZGFzXCIsXCJkYXVcIixcImRhdlwiLFwiZGF3XCIsXCJkYXhcIixcImRheVwiLFwiZGF6XCIsXCJkYmFcIixcImRiYlwiLFwiZGJkXCIsXCJkYmVcIixcImRiZlwiLFwiZGJnXCIsXCJkYmlcIixcImRialwiLFwiZGJsXCIsXCJkYm1cIixcImRiblwiLFwiZGJvXCIsXCJkYnBcIixcImRicVwiLFwiZGJyXCIsXCJkYnRcIixcImRidVwiLFwiZGJ2XCIsXCJkYndcIixcImRieVwiLFwiZGNjXCIsXCJkY3JcIixcImRkYVwiLFwiZGRkXCIsXCJkZGVcIixcImRkZ1wiLFwiZGRpXCIsXCJkZGpcIixcImRkblwiLFwiZGRvXCIsXCJkZHJcIixcImRkc1wiLFwiZGR3XCIsXCJkZWNcIixcImRlZFwiLFwiZGVlXCIsXCJkZWZcIixcImRlZ1wiLFwiZGVoXCIsXCJkZWlcIixcImRla1wiLFwiZGVsXCIsXCJkZW1cIixcImRlblwiLFwiZGVwXCIsXCJkZXFcIixcImRlclwiLFwiZGVzXCIsXCJkZXZcIixcImRlelwiLFwiZGdhXCIsXCJkZ2JcIixcImRnY1wiLFwiZGdkXCIsXCJkZ2VcIixcImRnZ1wiLFwiZGdoXCIsXCJkZ2lcIixcImRna1wiLFwiZGdsXCIsXCJkZ25cIixcImRnb1wiLFwiZGdyXCIsXCJkZ3NcIixcImRndFwiLFwiZGd1XCIsXCJkZ3dcIixcImRneFwiLFwiZGd6XCIsXCJkaGFcIixcImRoZFwiLFwiZGhnXCIsXCJkaGlcIixcImRobFwiLFwiZGhtXCIsXCJkaG5cIixcImRob1wiLFwiZGhyXCIsXCJkaHNcIixcImRodVwiLFwiZGh2XCIsXCJkaHdcIixcImRoeFwiLFwiZGlhXCIsXCJkaWJcIixcImRpY1wiLFwiZGlkXCIsXCJkaWZcIixcImRpZ1wiLFwiZGloXCIsXCJkaWlcIixcImRpalwiLFwiZGlrXCIsXCJkaWxcIixcImRpbVwiLFwiZGluXCIsXCJkaW9cIixcImRpcFwiLFwiZGlxXCIsXCJkaXJcIixcImRpc1wiLFwiZGl0XCIsXCJkaXVcIixcImRpd1wiLFwiZGl4XCIsXCJkaXlcIixcImRpelwiLFwiZGphXCIsXCJkamJcIixcImRqY1wiLFwiZGpkXCIsXCJkamVcIixcImRqZlwiLFwiZGppXCIsXCJkampcIixcImRqa1wiLFwiZGpsXCIsXCJkam1cIixcImRqblwiLFwiZGpvXCIsXCJkanJcIixcImRqdVwiLFwiZGp3XCIsXCJka2FcIixcImRrZ1wiLFwiZGtrXCIsXCJka2xcIixcImRrclwiLFwiZGtzXCIsXCJka3hcIixcImRsZ1wiLFwiZGxrXCIsXCJkbG1cIixcImRsblwiLFwiZG1hXCIsXCJkbWJcIixcImRtY1wiLFwiZG1kXCIsXCJkbWVcIixcImRtZlwiLFwiZG1nXCIsXCJkbWtcIixcImRtbFwiLFwiZG1tXCIsXCJkbW5cIixcImRtb1wiLFwiZG1yXCIsXCJkbXNcIixcImRtdVwiLFwiZG12XCIsXCJkbXdcIixcImRteFwiLFwiZG15XCIsXCJkbmFcIixcImRuZFwiLFwiZG5lXCIsXCJkbmdcIixcImRuaVwiLFwiZG5qXCIsXCJkbmtcIixcImRublwiLFwiZG5vXCIsXCJkbnJcIixcImRudFwiLFwiZG51XCIsXCJkbnZcIixcImRud1wiLFwiZG55XCIsXCJkb2FcIixcImRvYlwiLFwiZG9jXCIsXCJkb2VcIixcImRvZlwiLFwiZG9oXCIsXCJkb2lcIixcImRva1wiLFwiZG9sXCIsXCJkb25cIixcImRvb1wiLFwiZG9wXCIsXCJkb3FcIixcImRvclwiLFwiZG9zXCIsXCJkb3RcIixcImRvdlwiLFwiZG93XCIsXCJkb3hcIixcImRveVwiLFwiZG96XCIsXCJkcHBcIixcImRyYVwiLFwiZHJiXCIsXCJkcmNcIixcImRyZFwiLFwiZHJlXCIsXCJkcmdcIixcImRyaFwiLFwiZHJpXCIsXCJkcmxcIixcImRyblwiLFwiZHJvXCIsXCJkcnFcIixcImRyclwiLFwiZHJzXCIsXCJkcnRcIixcImRydVwiLFwiZHJ3XCIsXCJkcnlcIixcImRzYlwiLFwiZHNlXCIsXCJkc2hcIixcImRzaVwiLFwiZHNsXCIsXCJkc25cIixcImRzb1wiLFwiZHNxXCIsXCJkdGFcIixcImR0YlwiLFwiZHRkXCIsXCJkdGhcIixcImR0aVwiLFwiZHRrXCIsXCJkdG1cIixcImR0blwiLFwiZHRvXCIsXCJkdHBcIixcImR0clwiLFwiZHRzXCIsXCJkdHRcIixcImR0dVwiLFwiZHR5XCIsXCJkdWFcIixcImR1YlwiLFwiZHVjXCIsXCJkdWRcIixcImR1ZVwiLFwiZHVmXCIsXCJkdWdcIixcImR1aFwiLFwiZHVpXCIsXCJkdWpcIixcImR1a1wiLFwiZHVsXCIsXCJkdW1cIixcImR1blwiLFwiZHVvXCIsXCJkdXBcIixcImR1cVwiLFwiZHVyXCIsXCJkdXNcIixcImR1dVwiLFwiZHV2XCIsXCJkdXdcIixcImR1eFwiLFwiZHV5XCIsXCJkdXpcIixcImR2YVwiLFwiZHdhXCIsXCJkd2tcIixcImR3bFwiLFwiZHdyXCIsXCJkd3NcIixcImR3dVwiLFwiZHd3XCIsXCJkd3lcIixcImR3elwiLFwiZHlhXCIsXCJkeWJcIixcImR5ZFwiLFwiZHlnXCIsXCJkeWlcIixcImR5bVwiLFwiZHluXCIsXCJkeW9cIixcImR5dVwiLFwiZHl5XCIsXCJkemFcIixcImR6ZFwiLFwiZHplXCIsXCJkemdcIixcImR6bFwiLFwiZHpuXCJdXG4sWyBcImVlXCIsXCJlbFwiLFwiZW5cIixcImVvXCIsXCJlc1wiLFwiZXRcIixcImV1XCIsXCJlYWFcIixcImViY1wiLFwiZWJnXCIsXCJlYmtcIixcImVib1wiLFwiZWJyXCIsXCJlYnVcIixcImVjclwiLFwiZWNzXCIsXCJlY3lcIixcImVlZVwiLFwiZWZhXCIsXCJlZmVcIixcImVmaVwiLFwiZWdhXCIsXCJlZ2xcIixcImVnb1wiLFwiZWd4XCIsXCJlZ3lcIixcImVoc1wiLFwiZWh1XCIsXCJlaXBcIixcImVpdFwiLFwiZWl2XCIsXCJlamFcIixcImVrYVwiLFwiZWtjXCIsXCJla2VcIixcImVrZ1wiLFwiZWtpXCIsXCJla2tcIixcImVrbFwiLFwiZWttXCIsXCJla29cIixcImVrcFwiLFwiZWtyXCIsXCJla3lcIixcImVsZVwiLFwiZWxoXCIsXCJlbGlcIixcImVsa1wiLFwiZWxtXCIsXCJlbG9cIixcImVscFwiLFwiZWx1XCIsXCJlbHhcIixcImVtYVwiLFwiZW1iXCIsXCJlbWVcIixcImVtZ1wiLFwiZW1pXCIsXCJlbWtcIixcImVtbVwiLFwiZW1uXCIsXCJlbW9cIixcImVtcFwiLFwiZW1xXCIsXCJlbXNcIixcImVtdVwiLFwiZW13XCIsXCJlbXhcIixcImVteVwiLFwiZW16XCIsXCJlbmFcIixcImVuYlwiLFwiZW5jXCIsXCJlbmRcIixcImVuZlwiLFwiZW5oXCIsXCJlbmxcIixcImVubVwiLFwiZW5uXCIsXCJlbm9cIixcImVucVwiLFwiZW5yXCIsXCJlbnVcIixcImVudlwiLFwiZW53XCIsXCJlbnhcIixcImVvdFwiLFwiZXBpXCIsXCJlcmFcIixcImVyZ1wiLFwiZXJoXCIsXCJlcmlcIixcImVya1wiLFwiZXJvXCIsXCJlcnJcIixcImVyc1wiLFwiZXJ0XCIsXCJlcndcIixcImVzZVwiLFwiZXNnXCIsXCJlc2hcIixcImVzaVwiLFwiZXNrXCIsXCJlc2xcIixcImVzbVwiLFwiZXNuXCIsXCJlc29cIixcImVzcVwiLFwiZXNzXCIsXCJlc3VcIixcImVzeFwiLFwiZXN5XCIsXCJldGJcIixcImV0Y1wiLFwiZXRoXCIsXCJldG5cIixcImV0b1wiLFwiZXRyXCIsXCJldHNcIixcImV0dFwiLFwiZXR1XCIsXCJldHhcIixcImV0elwiLFwiZXVxXCIsXCJldmVcIixcImV2aFwiLFwiZXZuXCIsXCJld29cIixcImV4dFwiLFwiZXlhXCIsXCJleW9cIixcImV6YVwiLFwiZXplXCJdXG4sWyBcImZhXCIsXCJmZlwiLFwiZmlcIixcImZqXCIsXCJmb1wiLFwiZnJcIixcImZ5XCIsXCJmYWFcIixcImZhYlwiLFwiZmFkXCIsXCJmYWZcIixcImZhZ1wiLFwiZmFoXCIsXCJmYWlcIixcImZhalwiLFwiZmFrXCIsXCJmYWxcIixcImZhbVwiLFwiZmFuXCIsXCJmYXBcIixcImZhclwiLFwiZmF0XCIsXCJmYXVcIixcImZheFwiLFwiZmF5XCIsXCJmYXpcIixcImZibFwiLFwiZmNzXCIsXCJmZXJcIixcImZmaVwiLFwiZmZtXCIsXCJmZ3JcIixcImZpYVwiLFwiZmllXCIsXCJmaWZcIixcImZpbFwiLFwiZmlwXCIsXCJmaXJcIixcImZpdFwiLFwiZml1XCIsXCJmaXdcIixcImZra1wiLFwiZmt2XCIsXCJmbGFcIixcImZsaFwiLFwiZmxpXCIsXCJmbGxcIixcImZsblwiLFwiZmxyXCIsXCJmbHlcIixcImZtcFwiLFwiZm11XCIsXCJmbmJcIixcImZuZ1wiLFwiZm5pXCIsXCJmb2RcIixcImZvaVwiLFwiZm9tXCIsXCJmb25cIixcImZvclwiLFwiZm9zXCIsXCJmb3hcIixcImZwZVwiLFwiZnFzXCIsXCJmcmNcIixcImZyZFwiLFwiZnJrXCIsXCJmcm1cIixcImZyb1wiLFwiZnJwXCIsXCJmcnFcIixcImZyclwiLFwiZnJzXCIsXCJmcnRcIixcImZzZVwiLFwiZnNsXCIsXCJmc3NcIixcImZ1YlwiLFwiZnVjXCIsXCJmdWRcIixcImZ1ZVwiLFwiZnVmXCIsXCJmdWhcIixcImZ1aVwiLFwiZnVqXCIsXCJmdW1cIixcImZ1blwiLFwiZnVxXCIsXCJmdXJcIixcImZ1dFwiLFwiZnV1XCIsXCJmdXZcIixcImZ1eVwiLFwiZnZyXCIsXCJmd2FcIixcImZ3ZVwiXVxuLFsgXCJnYVwiLFwiZ2RcIixcImdsXCIsXCJnblwiLFwiZ3VcIixcImd2XCIsXCJnYWFcIixcImdhYlwiLFwiZ2FjXCIsXCJnYWRcIixcImdhZVwiLFwiZ2FmXCIsXCJnYWdcIixcImdhaFwiLFwiZ2FpXCIsXCJnYWpcIixcImdha1wiLFwiZ2FsXCIsXCJnYW1cIixcImdhblwiLFwiZ2FvXCIsXCJnYXBcIixcImdhcVwiLFwiZ2FyXCIsXCJnYXNcIixcImdhdFwiLFwiZ2F1XCIsXCJnYXZcIixcImdhd1wiLFwiZ2F4XCIsXCJnYXlcIixcImdhelwiLFwiZ2JhXCIsXCJnYmJcIixcImdiY1wiLFwiZ2JkXCIsXCJnYmVcIixcImdiZlwiLFwiZ2JnXCIsXCJnYmhcIixcImdiaVwiLFwiZ2JqXCIsXCJnYmtcIixcImdibFwiLFwiZ2JtXCIsXCJnYm5cIixcImdib1wiLFwiZ2JwXCIsXCJnYnFcIixcImdiclwiLFwiZ2JzXCIsXCJnYnVcIixcImdidlwiLFwiZ2J3XCIsXCJnYnhcIixcImdieVwiLFwiZ2J6XCIsXCJnY2NcIixcImdjZFwiLFwiZ2NlXCIsXCJnY2ZcIixcImdjbFwiLFwiZ2NuXCIsXCJnY3JcIixcImdjdFwiLFwiZ2RhXCIsXCJnZGJcIixcImdkY1wiLFwiZ2RkXCIsXCJnZGVcIixcImdkZlwiLFwiZ2RnXCIsXCJnZGhcIixcImdkaVwiLFwiZ2RqXCIsXCJnZGtcIixcImdkbFwiLFwiZ2RtXCIsXCJnZG5cIixcImdkb1wiLFwiZ2RxXCIsXCJnZHJcIixcImdkc1wiLFwiZ2R0XCIsXCJnZHVcIixcImdkeFwiLFwiZ2VhXCIsXCJnZWJcIixcImdlY1wiLFwiZ2VkXCIsXCJnZWZcIixcImdlZ1wiLFwiZ2VoXCIsXCJnZWlcIixcImdlalwiLFwiZ2VrXCIsXCJnZWxcIixcImdlbVwiLFwiZ2VxXCIsXCJnZXNcIixcImdldlwiLFwiZ2V3XCIsXCJnZXhcIixcImdleVwiLFwiZ2V6XCIsXCJnZmtcIixcImdmdFwiLFwiZ2Z4XCIsXCJnZ2FcIixcImdnYlwiLFwiZ2dkXCIsXCJnZ2VcIixcImdnZ1wiLFwiZ2drXCIsXCJnZ2xcIixcImdnblwiLFwiZ2dvXCIsXCJnZ3JcIixcImdndFwiLFwiZ2d1XCIsXCJnZ3dcIixcImdoYVwiLFwiZ2hjXCIsXCJnaGVcIixcImdoaFwiLFwiZ2hrXCIsXCJnaGxcIixcImdoblwiLFwiZ2hvXCIsXCJnaHJcIixcImdoc1wiLFwiZ2h0XCIsXCJnaWFcIixcImdpYlwiLFwiZ2ljXCIsXCJnaWRcIixcImdpZVwiLFwiZ2lnXCIsXCJnaWhcIixcImdpaVwiLFwiZ2lsXCIsXCJnaW1cIixcImdpblwiLFwiZ2lvXCIsXCJnaXBcIixcImdpcVwiLFwiZ2lyXCIsXCJnaXNcIixcImdpdFwiLFwiZ2l1XCIsXCJnaXdcIixcImdpeFwiLFwiZ2l5XCIsXCJnaXpcIixcImdqaVwiLFwiZ2prXCIsXCJnam1cIixcImdqblwiLFwiZ2pyXCIsXCJnanVcIixcImdrYVwiLFwiZ2tkXCIsXCJna2VcIixcImdrblwiLFwiZ2tvXCIsXCJna3BcIixcImdrdVwiLFwiZ2xiXCIsXCJnbGNcIixcImdsZFwiLFwiZ2xoXCIsXCJnbGlcIixcImdsalwiLFwiZ2xrXCIsXCJnbGxcIixcImdsb1wiLFwiZ2xyXCIsXCJnbHVcIixcImdsd1wiLFwiZ2x5XCIsXCJnbWFcIixcImdtYlwiLFwiZ21kXCIsXCJnbWVcIixcImdtZ1wiLFwiZ21oXCIsXCJnbWxcIixcImdtbVwiLFwiZ21uXCIsXCJnbXFcIixcImdtclwiLFwiZ211XCIsXCJnbXZcIixcImdtd1wiLFwiZ214XCIsXCJnbXlcIixcImdtelwiLFwiZ25hXCIsXCJnbmJcIixcImduY1wiLFwiZ25kXCIsXCJnbmVcIixcImduZ1wiLFwiZ25oXCIsXCJnbmlcIixcImdualwiLFwiZ25rXCIsXCJnbmxcIixcImdubVwiLFwiZ25uXCIsXCJnbm9cIixcImducVwiLFwiZ25yXCIsXCJnbnRcIixcImdudVwiLFwiZ253XCIsXCJnbnpcIixcImdvYVwiLFwiZ29iXCIsXCJnb2NcIixcImdvZFwiLFwiZ29lXCIsXCJnb2ZcIixcImdvZ1wiLFwiZ29oXCIsXCJnb2lcIixcImdvalwiLFwiZ29rXCIsXCJnb2xcIixcImdvbVwiLFwiZ29uXCIsXCJnb29cIixcImdvcFwiLFwiZ29xXCIsXCJnb3JcIixcImdvc1wiLFwiZ290XCIsXCJnb3VcIixcImdvd1wiLFwiZ294XCIsXCJnb3lcIixcImdvelwiLFwiZ3BhXCIsXCJncGVcIixcImdwblwiLFwiZ3FhXCIsXCJncWlcIixcImdxblwiLFwiZ3FyXCIsXCJncXVcIixcImdyYVwiLFwiZ3JiXCIsXCJncmNcIixcImdyZFwiLFwiZ3JnXCIsXCJncmhcIixcImdyaVwiLFwiZ3JqXCIsXCJncmtcIixcImdybVwiLFwiZ3JvXCIsXCJncnFcIixcImdyclwiLFwiZ3JzXCIsXCJncnRcIixcImdydVwiLFwiZ3J2XCIsXCJncndcIixcImdyeFwiLFwiZ3J5XCIsXCJncnpcIixcImdzZVwiLFwiZ3NnXCIsXCJnc2xcIixcImdzbVwiLFwiZ3NuXCIsXCJnc29cIixcImdzcFwiLFwiZ3NzXCIsXCJnc3dcIixcImd0YVwiLFwiZ3RpXCIsXCJndHVcIixcImd1YVwiLFwiZ3ViXCIsXCJndWNcIixcImd1ZFwiLFwiZ3VlXCIsXCJndWZcIixcImd1Z1wiLFwiZ3VoXCIsXCJndWlcIixcImd1a1wiLFwiZ3VsXCIsXCJndW1cIixcImd1blwiLFwiZ3VvXCIsXCJndXBcIixcImd1cVwiLFwiZ3VyXCIsXCJndXNcIixcImd1dFwiLFwiZ3V1XCIsXCJndXZcIixcImd1d1wiLFwiZ3V4XCIsXCJndXpcIixcImd2YVwiLFwiZ3ZjXCIsXCJndmVcIixcImd2ZlwiLFwiZ3ZqXCIsXCJndmxcIixcImd2bVwiLFwiZ3ZuXCIsXCJndm9cIixcImd2cFwiLFwiZ3ZyXCIsXCJndnNcIixcImd2eVwiLFwiZ3dhXCIsXCJnd2JcIixcImd3Y1wiLFwiZ3dkXCIsXCJnd2VcIixcImd3ZlwiLFwiZ3dnXCIsXCJnd2lcIixcImd3alwiLFwiZ3dtXCIsXCJnd25cIixcImd3clwiLFwiZ3d0XCIsXCJnd3VcIixcImd3d1wiLFwiZ3d4XCIsXCJneHhcIixcImd5YVwiLFwiZ3liXCIsXCJneWRcIixcImd5ZVwiLFwiZ3lmXCIsXCJneWdcIixcImd5aVwiLFwiZ3lsXCIsXCJneW1cIixcImd5blwiLFwiZ3lvXCIsXCJneXJcIixcImd5eVwiLFwiZ3l6XCIsXCJnemFcIixcImd6aVwiLFwiZ3puXCJdXG4sWyBcImhhXCIsXCJoZVwiLFwiaGlcIixcImhvXCIsXCJoclwiLFwiaHRcIixcImh1XCIsXCJoeVwiLFwiaHpcIixcImhhYVwiLFwiaGFiXCIsXCJoYWNcIixcImhhZFwiLFwiaGFlXCIsXCJoYWZcIixcImhhZ1wiLFwiaGFoXCIsXCJoYWlcIixcImhhalwiLFwiaGFrXCIsXCJoYWxcIixcImhhbVwiLFwiaGFuXCIsXCJoYW9cIixcImhhcFwiLFwiaGFxXCIsXCJoYXJcIixcImhhc1wiLFwiaGF2XCIsXCJoYXdcIixcImhheFwiLFwiaGF5XCIsXCJoYXpcIixcImhiYVwiLFwiaGJiXCIsXCJoYm5cIixcImhib1wiLFwiaGJ1XCIsXCJoY2FcIixcImhjaFwiLFwiaGRuXCIsXCJoZHNcIixcImhkeVwiLFwiaGVhXCIsXCJoZWRcIixcImhlZ1wiLFwiaGVoXCIsXCJoZWlcIixcImhlbVwiLFwiaGdtXCIsXCJoZ3dcIixcImhoaVwiLFwiaGhyXCIsXCJoaHlcIixcImhpYVwiLFwiaGliXCIsXCJoaWRcIixcImhpZlwiLFwiaGlnXCIsXCJoaWhcIixcImhpaVwiLFwiaGlqXCIsXCJoaWtcIixcImhpbFwiLFwiaGltXCIsXCJoaW9cIixcImhpclwiLFwiaGl0XCIsXCJoaXdcIixcImhpeFwiLFwiaGppXCIsXCJoa2FcIixcImhrZVwiLFwiaGtoXCIsXCJoa2tcIixcImhrblwiLFwiaGtzXCIsXCJobGFcIixcImhsYlwiLFwiaGxkXCIsXCJobGVcIixcImhsdFwiLFwiaGx1XCIsXCJobWFcIixcImhtYlwiLFwiaG1jXCIsXCJobWRcIixcImhtZVwiLFwiaG1mXCIsXCJobWdcIixcImhtaFwiLFwiaG1pXCIsXCJobWpcIixcImhta1wiLFwiaG1sXCIsXCJobW1cIixcImhtblwiLFwiaG1wXCIsXCJobXFcIixcImhtclwiLFwiaG1zXCIsXCJobXRcIixcImhtdVwiLFwiaG12XCIsXCJobXdcIixcImhteFwiLFwiaG15XCIsXCJobXpcIixcImhuYVwiLFwiaG5kXCIsXCJobmVcIixcImhuZ1wiLFwiaG5oXCIsXCJobmlcIixcImhualwiLFwiaG5uXCIsXCJobm9cIixcImhuc1wiLFwiaG51XCIsXCJob2FcIixcImhvYlwiLFwiaG9jXCIsXCJob2RcIixcImhvZVwiLFwiaG9oXCIsXCJob2lcIixcImhvalwiLFwiaG9rXCIsXCJob2xcIixcImhvbVwiLFwiaG9vXCIsXCJob3BcIixcImhvclwiLFwiaG9zXCIsXCJob3RcIixcImhvdlwiLFwiaG93XCIsXCJob3lcIixcImhvelwiLFwiaHBvXCIsXCJocHNcIixcImhyYVwiLFwiaHJjXCIsXCJocmVcIixcImhya1wiLFwiaHJtXCIsXCJocm9cIixcImhycFwiLFwiaHJyXCIsXCJocnRcIixcImhydVwiLFwiaHJ3XCIsXCJocnhcIixcImhyelwiLFwiaHNiXCIsXCJoc2hcIixcImhzbFwiLFwiaHNuXCIsXCJoc3NcIixcImh0aVwiLFwiaHRvXCIsXCJodHNcIixcImh0dVwiLFwiaHR4XCIsXCJodWJcIixcImh1Y1wiLFwiaHVkXCIsXCJodWVcIixcImh1ZlwiLFwiaHVnXCIsXCJodWhcIixcImh1aVwiLFwiaHVqXCIsXCJodWtcIixcImh1bFwiLFwiaHVtXCIsXCJodW9cIixcImh1cFwiLFwiaHVxXCIsXCJodXJcIixcImh1c1wiLFwiaHV0XCIsXCJodXVcIixcImh1dlwiLFwiaHV3XCIsXCJodXhcIixcImh1eVwiLFwiaHV6XCIsXCJodmNcIixcImh2ZVwiLFwiaHZrXCIsXCJodm5cIixcImh2dlwiLFwiaHdhXCIsXCJod2NcIixcImh3b1wiLFwiaHlhXCIsXCJoeXdcIixcImh5eFwiXVxuLFsgXCJpYVwiLFwiaWRcIixcImllXCIsXCJpZ1wiLFwiaWlcIixcImlrXCIsXCJpblwiLFwiaW9cIixcImlzXCIsXCJpdFwiLFwiaXVcIixcIml3XCIsXCJpYWlcIixcImlhblwiLFwiaWFwXCIsXCJpYXJcIixcImliYVwiLFwiaWJiXCIsXCJpYmRcIixcImliZVwiLFwiaWJnXCIsXCJpYmhcIixcImliaVwiLFwiaWJsXCIsXCJpYm1cIixcImliblwiLFwiaWJyXCIsXCJpYnVcIixcImlieVwiLFwiaWNhXCIsXCJpY2hcIixcImljbFwiLFwiaWNyXCIsXCJpZGFcIixcImlkYlwiLFwiaWRjXCIsXCJpZGRcIixcImlkZVwiLFwiaWRpXCIsXCJpZHJcIixcImlkc1wiLFwiaWR0XCIsXCJpZHVcIixcImlmYVwiLFwiaWZiXCIsXCJpZmVcIixcImlmZlwiLFwiaWZrXCIsXCJpZm1cIixcImlmdVwiLFwiaWZ5XCIsXCJpZ2JcIixcImlnZVwiLFwiaWdnXCIsXCJpZ2xcIixcImlnbVwiLFwiaWduXCIsXCJpZ29cIixcImlnc1wiLFwiaWd3XCIsXCJpaGJcIixcImloaVwiLFwiaWhwXCIsXCJpaHdcIixcImlpblwiLFwiaWlyXCIsXCJpamNcIixcImlqZVwiLFwiaWpqXCIsXCJpam5cIixcImlqb1wiLFwiaWpzXCIsXCJpa2VcIixcImlraVwiLFwiaWtrXCIsXCJpa2xcIixcImlrb1wiLFwiaWtwXCIsXCJpa3JcIixcImlrc1wiLFwiaWt0XCIsXCJpa3ZcIixcImlrd1wiLFwiaWt4XCIsXCJpa3pcIixcImlsYVwiLFwiaWxiXCIsXCJpbGdcIixcImlsaVwiLFwiaWxrXCIsXCJpbGxcIixcImlsbVwiLFwiaWxvXCIsXCJpbHBcIixcImlsc1wiLFwiaWx1XCIsXCJpbHZcIixcImlsd1wiLFwiaW1hXCIsXCJpbWVcIixcImltaVwiLFwiaW1sXCIsXCJpbW5cIixcImltb1wiLFwiaW1yXCIsXCJpbXNcIixcImlteVwiLFwiaW5iXCIsXCJpbmNcIixcImluZVwiLFwiaW5nXCIsXCJpbmhcIixcImlualwiLFwiaW5sXCIsXCJpbm1cIixcImlublwiLFwiaW5vXCIsXCJpbnBcIixcImluc1wiLFwiaW50XCIsXCJpbnpcIixcImlvclwiLFwiaW91XCIsXCJpb3dcIixcImlwaVwiLFwiaXBvXCIsXCJpcXVcIixcImlxd1wiLFwiaXJhXCIsXCJpcmVcIixcImlyaFwiLFwiaXJpXCIsXCJpcmtcIixcImlyblwiLFwiaXJvXCIsXCJpcnJcIixcImlydVwiLFwiaXJ4XCIsXCJpcnlcIixcImlzYVwiLFwiaXNjXCIsXCJpc2RcIixcImlzZVwiLFwiaXNnXCIsXCJpc2hcIixcImlzaVwiLFwiaXNrXCIsXCJpc21cIixcImlzblwiLFwiaXNvXCIsXCJpc3JcIixcImlzdFwiLFwiaXN1XCIsXCJpdGJcIixcIml0Y1wiLFwiaXRkXCIsXCJpdGVcIixcIml0aVwiLFwiaXRrXCIsXCJpdGxcIixcIml0bVwiLFwiaXRvXCIsXCJpdHJcIixcIml0c1wiLFwiaXR0XCIsXCJpdHZcIixcIml0d1wiLFwiaXR4XCIsXCJpdHlcIixcIml0elwiLFwiaXVtXCIsXCJpdmJcIixcIml2dlwiLFwiaXdrXCIsXCJpd21cIixcIml3b1wiLFwiaXdzXCIsXCJpeGNcIixcIml4bFwiLFwiaXlhXCIsXCJpeW9cIixcIml5eFwiLFwiaXpoXCIsXCJpemlcIixcIml6clwiLFwiaXp6XCJdXG4sWyBcImphXCIsXCJqaVwiLFwianZcIixcImp3XCIsXCJqYWFcIixcImphYlwiLFwiamFjXCIsXCJqYWRcIixcImphZVwiLFwiamFmXCIsXCJqYWhcIixcImphalwiLFwiamFrXCIsXCJqYWxcIixcImphbVwiLFwiamFuXCIsXCJqYW9cIixcImphcVwiLFwiamFyXCIsXCJqYXNcIixcImphdFwiLFwiamF1XCIsXCJqYXhcIixcImpheVwiLFwiamF6XCIsXCJqYmVcIixcImpiaVwiLFwiamJqXCIsXCJqYmtcIixcImpibVwiLFwiamJuXCIsXCJqYm9cIixcImpiclwiLFwiamJ0XCIsXCJqYnVcIixcImpid1wiLFwiamNzXCIsXCJqY3RcIixcImpkYVwiLFwiamRnXCIsXCJqZHRcIixcImplYlwiLFwiamVlXCIsXCJqZWdcIixcImplaFwiLFwiamVpXCIsXCJqZWtcIixcImplbFwiLFwiamVuXCIsXCJqZXJcIixcImpldFwiLFwiamV1XCIsXCJqZ2JcIixcImpnZVwiLFwiamdrXCIsXCJqZ29cIixcImpoaVwiLFwiamhzXCIsXCJqaWFcIixcImppYlwiLFwiamljXCIsXCJqaWRcIixcImppZVwiLFwiamlnXCIsXCJqaWhcIixcImppaVwiLFwiamlsXCIsXCJqaW1cIixcImppb1wiLFwiamlxXCIsXCJqaXRcIixcImppdVwiLFwiaml2XCIsXCJqaXlcIixcImpqZVwiLFwiampyXCIsXCJqa2FcIixcImprbVwiLFwiamtvXCIsXCJqa3BcIixcImprclwiLFwiamtzXCIsXCJqa3VcIixcImpsZVwiLFwiamxzXCIsXCJqbWFcIixcImptYlwiLFwiam1jXCIsXCJqbWRcIixcImptaVwiLFwiam1sXCIsXCJqbW5cIixcImptclwiLFwiam1zXCIsXCJqbXdcIixcImpteFwiLFwiam5hXCIsXCJqbmRcIixcImpuZ1wiLFwiam5pXCIsXCJqbmpcIixcImpubFwiLFwiam5zXCIsXCJqb2JcIixcImpvZFwiLFwiam9nXCIsXCJqb3JcIixcImpvc1wiLFwiam93XCIsXCJqcGFcIixcImpwclwiLFwianB4XCIsXCJqcXJcIixcImpyYVwiLFwianJiXCIsXCJqcnJcIixcImpydFwiLFwianJ1XCIsXCJqc2xcIixcImp1YVwiLFwianViXCIsXCJqdWNcIixcImp1ZFwiLFwianVoXCIsXCJqdWlcIixcImp1a1wiLFwianVsXCIsXCJqdW1cIixcImp1blwiLFwianVvXCIsXCJqdXBcIixcImp1clwiLFwianVzXCIsXCJqdXRcIixcImp1dVwiLFwianV3XCIsXCJqdXlcIixcImp2ZFwiLFwianZuXCIsXCJqd2lcIixcImp5YVwiLFwianllXCIsXCJqeXlcIl1cbixbIFwia2FcIixcImtnXCIsXCJraVwiLFwia2pcIixcImtrXCIsXCJrbFwiLFwia21cIixcImtuXCIsXCJrb1wiLFwia3JcIixcImtzXCIsXCJrdVwiLFwia3ZcIixcImt3XCIsXCJreVwiLFwia2FhXCIsXCJrYWJcIixcImthY1wiLFwia2FkXCIsXCJrYWVcIixcImthZlwiLFwia2FnXCIsXCJrYWhcIixcImthaVwiLFwia2FqXCIsXCJrYWtcIixcImthbVwiLFwia2FvXCIsXCJrYXBcIixcImthcVwiLFwia2FyXCIsXCJrYXZcIixcImthd1wiLFwia2F4XCIsXCJrYXlcIixcImtiYVwiLFwia2JiXCIsXCJrYmNcIixcImtiZFwiLFwia2JlXCIsXCJrYmZcIixcImtiZ1wiLFwia2JoXCIsXCJrYmlcIixcImtialwiLFwia2JrXCIsXCJrYmxcIixcImtibVwiLFwia2JuXCIsXCJrYm9cIixcImticFwiLFwia2JxXCIsXCJrYnJcIixcImtic1wiLFwia2J0XCIsXCJrYnVcIixcImtidlwiLFwia2J3XCIsXCJrYnhcIixcImtieVwiLFwia2J6XCIsXCJrY2FcIixcImtjYlwiLFwia2NjXCIsXCJrY2RcIixcImtjZVwiLFwia2NmXCIsXCJrY2dcIixcImtjaFwiLFwia2NpXCIsXCJrY2pcIixcImtja1wiLFwia2NsXCIsXCJrY21cIixcImtjblwiLFwia2NvXCIsXCJrY3BcIixcImtjcVwiLFwia2NyXCIsXCJrY3NcIixcImtjdFwiLFwia2N1XCIsXCJrY3ZcIixcImtjd1wiLFwia2N4XCIsXCJrY3lcIixcImtjelwiLFwia2RhXCIsXCJrZGNcIixcImtkZFwiLFwia2RlXCIsXCJrZGZcIixcImtkZ1wiLFwia2RoXCIsXCJrZGlcIixcImtkalwiLFwia2RrXCIsXCJrZGxcIixcImtkbVwiLFwia2RuXCIsXCJrZG9cIixcImtkcFwiLFwia2RxXCIsXCJrZHJcIixcImtkdFwiLFwia2R1XCIsXCJrZHZcIixcImtkd1wiLFwia2R4XCIsXCJrZHlcIixcImtkelwiLFwia2VhXCIsXCJrZWJcIixcImtlY1wiLFwia2VkXCIsXCJrZWVcIixcImtlZlwiLFwia2VnXCIsXCJrZWhcIixcImtlaVwiLFwia2VqXCIsXCJrZWtcIixcImtlbFwiLFwia2VtXCIsXCJrZW5cIixcImtlb1wiLFwia2VwXCIsXCJrZXFcIixcImtlclwiLFwia2VzXCIsXCJrZXRcIixcImtldVwiLFwia2V2XCIsXCJrZXdcIixcImtleFwiLFwia2V5XCIsXCJrZXpcIixcImtmYVwiLFwia2ZiXCIsXCJrZmNcIixcImtmZFwiLFwia2ZlXCIsXCJrZmZcIixcImtmZ1wiLFwia2ZoXCIsXCJrZmlcIixcImtmalwiLFwia2ZrXCIsXCJrZmxcIixcImtmbVwiLFwia2ZuXCIsXCJrZm9cIixcImtmcFwiLFwia2ZxXCIsXCJrZnJcIixcImtmc1wiLFwia2Z0XCIsXCJrZnVcIixcImtmdlwiLFwia2Z3XCIsXCJrZnhcIixcImtmeVwiLFwia2Z6XCIsXCJrZ2FcIixcImtnYlwiLFwia2djXCIsXCJrZ2RcIixcImtnZVwiLFwia2dmXCIsXCJrZ2dcIixcImtnaFwiLFwia2dpXCIsXCJrZ2pcIixcImtna1wiLFwia2dsXCIsXCJrZ21cIixcImtnblwiLFwia2dvXCIsXCJrZ3BcIixcImtncVwiLFwia2dyXCIsXCJrZ3NcIixcImtndFwiLFwia2d1XCIsXCJrZ3ZcIixcImtnd1wiLFwia2d4XCIsXCJrZ3lcIixcImtoYVwiLFwibHlnXCIsXCJraGJcIixcImtoY1wiLFwia2hkXCIsXCJraGVcIixcImtoZlwiLFwia2hnXCIsXCJraGhcIixcImtoaVwiLFwia2hqXCIsXCJraGtcIixcImtobFwiLFwia2huXCIsXCJraG9cIixcImtocFwiLFwia2hxXCIsXCJraHJcIixcImtoc1wiLFwia2h0XCIsXCJraHVcIixcImtodlwiLFwia2h3XCIsXCJraHhcIixcImtoeVwiLFwia2h6XCIsXCJraWFcIixcImtpYlwiLFwia2ljXCIsXCJraWRcIixcImtpZVwiLFwia2lmXCIsXCJraWdcIixcImtpaFwiLFwia2lpXCIsXCJraWpcIixcImtpbFwiLFwia2ltXCIsXCJraW9cIixcImtpcFwiLFwia2lxXCIsXCJraXNcIixcImtpdFwiLFwia2l1XCIsXCJraXZcIixcImtpd1wiLFwia2l4XCIsXCJraXlcIixcImtpelwiLFwia2phXCIsXCJramJcIixcImtqY1wiLFwia2pkXCIsXCJramVcIixcImtqZlwiLFwia2pnXCIsXCJramhcIixcImtqaVwiLFwia2pqXCIsXCJramtcIixcImtqbFwiLFwia2ptXCIsXCJram5cIixcImtqb1wiLFwia2pwXCIsXCJranFcIixcImtqclwiLFwia2pzXCIsXCJranRcIixcImtqdVwiLFwia2p2XCIsXCJranhcIixcImtqeVwiLFwia2p6XCIsXCJra2FcIixcImtrYlwiLFwia2tjXCIsXCJra2RcIixcImtrZVwiLFwia2tmXCIsXCJra2dcIixcImtraFwiLFwia2tpXCIsXCJra2pcIixcImtra1wiLFwia2tsXCIsXCJra21cIixcImtrblwiLFwia2tvXCIsXCJra3BcIixcImtrcVwiLFwia2tyXCIsXCJra3NcIixcImtrdFwiLFwia2t1XCIsXCJra3ZcIixcImtrd1wiLFwia2t4XCIsXCJra3lcIixcImtrelwiLFwia2xhXCIsXCJrbGJcIixcImtsY1wiLFwia2xkXCIsXCJrbGVcIixcImtsZlwiLFwia2xnXCIsXCJrbGhcIixcImtsaVwiLFwia2xqXCIsXCJrbGtcIixcImtsbFwiLFwia2xtXCIsXCJrbG5cIixcImtsb1wiLFwia2xwXCIsXCJrbHFcIixcImtsclwiLFwia2xzXCIsXCJrbHRcIixcImtsdVwiLFwia2x2XCIsXCJrbHdcIixcImtseFwiLFwia2x5XCIsXCJrbHpcIixcImttYVwiLFwia21iXCIsXCJrbWNcIixcImttZFwiLFwia21lXCIsXCJrbWZcIixcImttZ1wiLFwia21oXCIsXCJrbWlcIixcImttalwiLFwia21rXCIsXCJrbWxcIixcImttbVwiLFwia21uXCIsXCJrbW9cIixcImttcFwiLFwia21xXCIsXCJrbXJcIixcImttc1wiLFwia210XCIsXCJrbXVcIixcImttdlwiLFwia213XCIsXCJrbXhcIixcImtteVwiLFwia216XCIsXCJrbmFcIixcImtuYlwiLFwia25jXCIsXCJrbmRcIixcImtuZVwiLFwia25mXCIsXCJrbmdcIixcImtuaVwiLFwia25qXCIsXCJrbmtcIixcImtubFwiLFwia25tXCIsXCJrbm5cIixcImtub1wiLFwia25wXCIsXCJrbnFcIixcImtuclwiLFwia25zXCIsXCJrbnRcIixcImtudVwiLFwia252XCIsXCJrbndcIixcImtueFwiLFwia255XCIsXCJrbnpcIixcImtvYVwiLFwia29jXCIsXCJrb2RcIixcImtvZVwiLFwia29mXCIsXCJrb2dcIixcImtvaFwiLFwia29pXCIsXCJrb2pcIixcImtva1wiLFwia29sXCIsXCJrb29cIixcImtvcFwiLFwia29xXCIsXCJrb3NcIixcImtvdFwiLFwia291XCIsXCJrb3ZcIixcImtvd1wiLFwia294XCIsXCJrb3lcIixcImtvelwiLFwia3BhXCIsXCJrcGJcIixcImtwY1wiLFwia3BkXCIsXCJrcGVcIixcImtwZlwiLFwia3BnXCIsXCJrcGhcIixcImtwaVwiLFwia3BqXCIsXCJrcGtcIixcImtwbFwiLFwia3BtXCIsXCJrcG5cIixcImtwb1wiLFwia3BwXCIsXCJrcHFcIixcImtwclwiLFwia3BzXCIsXCJrcHRcIixcImtwdVwiLFwia3B2XCIsXCJrcHdcIixcImtweFwiLFwia3B5XCIsXCJrcHpcIixcImtxYVwiLFwia3FiXCIsXCJrcWNcIixcImtxZFwiLFwia3FlXCIsXCJrcWZcIixcImtxZ1wiLFwia3FoXCIsXCJrcWlcIixcImtxalwiLFwia3FrXCIsXCJrcWxcIixcImtxbVwiLFwia3FuXCIsXCJrcW9cIixcImtxcFwiLFwia3FxXCIsXCJrcXJcIixcImtxc1wiLFwia3F0XCIsXCJrcXVcIixcImtxdlwiLFwia3F3XCIsXCJrcXhcIixcImtxeVwiLFwia3F6XCIsXCJrcmFcIixcImtyYlwiLFwia3JjXCIsXCJrcmRcIixcImtyZVwiLFwia3JmXCIsXCJrcmhcIixcImtyaVwiLFwia3JqXCIsXCJrcmtcIixcImtybFwiLFwia3JtXCIsXCJrcm5cIixcImtyb1wiLFwia3JwXCIsXCJrcnJcIixcImtyc1wiLFwia3J0XCIsXCJrcnVcIixcImtydlwiLFwia3J3XCIsXCJrcnhcIixcImtyeVwiLFwia3J6XCIsXCJrc2FcIixcImtzYlwiLFwia3NjXCIsXCJrc2RcIixcImtzZVwiLFwia3NmXCIsXCJrc2dcIixcImtzaFwiLFwia3NpXCIsXCJrc2pcIixcImtza1wiLFwia3NsXCIsXCJrc21cIixcImtzblwiLFwia3NvXCIsXCJrc3BcIixcImtzcVwiLFwia3NyXCIsXCJrc3NcIixcImtzdFwiLFwia3N1XCIsXCJrc3ZcIixcImtzd1wiLFwia3N4XCIsXCJrc3lcIixcImtzelwiLFwia3RhXCIsXCJrdGJcIixcImt0Y1wiLFwia3RkXCIsXCJrdGVcIixcImt0ZlwiLFwia3RnXCIsXCJrdGhcIixcImt0aVwiLFwia3RqXCIsXCJrdGtcIixcImt0bFwiLFwia3RtXCIsXCJrdG5cIixcImt0b1wiLFwia3RwXCIsXCJrdHFcIixcImt0clwiLFwia3RzXCIsXCJrdHRcIixcImt0dVwiLFwia3R2XCIsXCJrdHdcIixcImt0eFwiLFwia3R5XCIsXCJrdHpcIixcImt1YlwiLFwia3VjXCIsXCJrdWRcIixcImt1ZVwiLFwia3VmXCIsXCJrdWdcIixcImt1aFwiLFwia3VpXCIsXCJrdWpcIixcImt1a1wiLFwia3VsXCIsXCJrdW1cIixcImt1blwiLFwia3VvXCIsXCJrdXBcIixcImt1cVwiLFwia3VzXCIsXCJrdXRcIixcImt1dVwiLFwia3V2XCIsXCJrdXdcIixcImt1eFwiLFwia3V5XCIsXCJrdXpcIixcImt2YVwiLFwia3ZiXCIsXCJrdmNcIixcImt2ZFwiLFwia3ZlXCIsXCJrdmZcIixcImt2Z1wiLFwia3ZoXCIsXCJrdmlcIixcImt2alwiLFwia3ZrXCIsXCJrdmxcIixcImt2bVwiLFwia3ZuXCIsXCJrdm9cIixcImt2cFwiLFwia3ZxXCIsXCJrdnJcIixcImt2c1wiLFwia3Z0XCIsXCJrdnVcIixcImt2dlwiLFwia3Z3XCIsXCJrdnhcIixcImt2eVwiLFwia3Z6XCIsXCJrd2FcIixcImt3YlwiLFwia3djXCIsXCJrd2RcIixcImt3ZVwiLFwia3dmXCIsXCJrd2dcIixcImt3aFwiLFwia3dpXCIsXCJrd2pcIixcImt3a1wiLFwia3dsXCIsXCJrd21cIixcImt3blwiLFwia3dvXCIsXCJrd3BcIixcImt3cVwiLFwia3dyXCIsXCJrd3NcIixcImt3dFwiLFwia3d1XCIsXCJrd3ZcIixcImt3d1wiLFwia3d4XCIsXCJrd3lcIixcImt3elwiLFwia3hhXCIsXCJreGJcIixcImt4Y1wiLFwia3hkXCIsXCJreGVcIixcImt4ZlwiLFwia3hoXCIsXCJreGlcIixcImt4alwiLFwia3hrXCIsXCJreGxcIixcImt4bVwiLFwia3huXCIsXCJreG9cIixcImt4cFwiLFwia3hxXCIsXCJreHJcIixcImt4c1wiLFwia3h0XCIsXCJreHVcIixcImt4dlwiLFwia3h3XCIsXCJreHhcIixcImt4eVwiLFwia3h6XCIsXCJreWFcIixcImt5YlwiLFwia3ljXCIsXCJreWRcIixcImt5ZVwiLFwia3lmXCIsXCJreWdcIixcImt5aFwiLFwia3lpXCIsXCJreWpcIixcImt5a1wiLFwia3lsXCIsXCJreW1cIixcImt5blwiLFwia3lvXCIsXCJreXBcIixcImt5cVwiLFwia3lyXCIsXCJreXNcIixcImt5dFwiLFwia3l1XCIsXCJreXZcIixcImt5d1wiLFwia3l4XCIsXCJreXlcIixcImt5elwiLFwia3phXCIsXCJremJcIixcImt6Y1wiLFwia3pkXCIsXCJremVcIixcImt6ZlwiLFwia3pnXCIsXCJremhcIixcImt6aVwiLFwia3pqXCIsXCJremtcIixcImt6bFwiLFwia3ptXCIsXCJrem5cIixcImt6b1wiLFwia3pwXCIsXCJrenFcIixcImt6clwiLFwia3pzXCIsXCJrenRcIixcImt6dVwiLFwia3p2XCIsXCJrendcIixcImt6eFwiLFwia3p5XCIsXCJrenpcIl1cbixbIFwibGFcIixcImxiXCIsXCJsZ1wiLFwibGlcIixcImxuXCIsXCJsb1wiLFwibHRcIixcImx1XCIsXCJsdlwiLFwibGFhXCIsXCJsYWJcIixcImxhY1wiLFwibGFkXCIsXCJsYWVcIixcImxhZlwiLFwibGFnXCIsXCJsYWhcIixcImxhaVwiLFwibGFqXCIsXCJsYWtcIixcImxhbFwiLFwibGFtXCIsXCJsYW5cIixcImxhcFwiLFwibGFxXCIsXCJsYXJcIixcImxhc1wiLFwibGF1XCIsXCJsYXdcIixcImxheFwiLFwibGF5XCIsXCJsYXpcIixcImxiYVwiLFwibGJiXCIsXCJsYmNcIixcImxiZVwiLFwibGJmXCIsXCJsYmdcIixcImxiaVwiLFwibGJqXCIsXCJsYmtcIixcImxibFwiLFwibGJtXCIsXCJsYm5cIixcImxib1wiLFwibGJxXCIsXCJsYnJcIixcImxic1wiLFwibGJ0XCIsXCJsYnVcIixcImxidlwiLFwibGJ3XCIsXCJsYnhcIixcImxieVwiLFwibGJ6XCIsXCJsY2NcIixcImxjZFwiLFwibGNlXCIsXCJsY2ZcIixcImxjaFwiLFwibGNsXCIsXCJsY21cIixcImxjcFwiLFwibGNxXCIsXCJsY3NcIixcImxkYVwiLFwibGRiXCIsXCJsZGRcIixcImxkZ1wiLFwibGRoXCIsXCJsZGlcIixcImxkalwiLFwibGRrXCIsXCJsZGxcIixcImxkbVwiLFwibGRuXCIsXCJsZG9cIixcImxkcFwiLFwibGRxXCIsXCJsZWFcIixcImxlYlwiLFwibGVjXCIsXCJsZWRcIixcImxlZVwiLFwibGVmXCIsXCJsZWdcIixcImxlaFwiLFwibGVpXCIsXCJsZWpcIixcImxla1wiLFwibGVsXCIsXCJsZW1cIixcImxlblwiLFwibGVvXCIsXCJsZXBcIixcImxlcVwiLFwibGVyXCIsXCJsZXNcIixcImxldFwiLFwibGV1XCIsXCJsZXZcIixcImxld1wiLFwibGV4XCIsXCJsZXlcIixcImxlelwiLFwibGZhXCIsXCJsZm5cIixcImxnYVwiLFwibGdiXCIsXCJsZ2dcIixcImxnaFwiLFwibGdpXCIsXCJsZ2tcIixcImxnbFwiLFwibGdtXCIsXCJsZ25cIixcImxncVwiLFwibGdyXCIsXCJsZ3RcIixcImxndVwiLFwibGd6XCIsXCJsaGFcIixcImxoaFwiLFwibGhpXCIsXCJsaGxcIixcImxobVwiLFwibGhuXCIsXCJsaHBcIixcImxoc1wiLFwibGh0XCIsXCJsaHVcIixcImxpYVwiLFwibGliXCIsXCJsaWNcIixcImxpZFwiLFwibGllXCIsXCJsaWZcIixcImxpZ1wiLFwibGloXCIsXCJsaWlcIixcImxpalwiLFwibGlrXCIsXCJsaWxcIixcImxpb1wiLFwibGlwXCIsXCJsaXFcIixcImxpclwiLFwibGlzXCIsXCJsaXVcIixcImxpdlwiLFwibGl3XCIsXCJsaXhcIixcImxpeVwiLFwibGl6XCIsXCJsamFcIixcImxqZVwiLFwibGppXCIsXCJsamxcIixcImxqcFwiLFwibGp3XCIsXCJsanhcIixcImxrYVwiLFwibGtiXCIsXCJsa2NcIixcImxrZFwiLFwibGtlXCIsXCJsa2hcIixcImxraVwiLFwibGtqXCIsXCJsa2xcIixcImxrbVwiLFwibGtuXCIsXCJsa29cIixcImxrclwiLFwibGtzXCIsXCJsa3RcIixcImxrdVwiLFwibGt5XCIsXCJsbGFcIixcImxsYlwiLFwibGxjXCIsXCJsbGRcIixcImxsZVwiLFwibGxmXCIsXCJsbGdcIixcImxsaFwiLFwibGxpXCIsXCJsbGpcIixcImxsa1wiLFwibGxsXCIsXCJsbG1cIixcImxsblwiLFwibGxvXCIsXCJsbHBcIixcImxscVwiLFwibGxzXCIsXCJsbHVcIixcImxseFwiLFwibG1hXCIsXCJsbWJcIixcImxtY1wiLFwibG1kXCIsXCJsbWVcIixcImxtZlwiLFwibG1nXCIsXCJsbWhcIixcImxtaVwiLFwibG1qXCIsXCJsbWtcIixcImxtbFwiLFwibG1tXCIsXCJsbW5cIixcImxtb1wiLFwibG1wXCIsXCJsbXFcIixcImxtclwiLFwibG11XCIsXCJsbXZcIixcImxtd1wiLFwibG14XCIsXCJsbXlcIixcImxtelwiLFwibG5hXCIsXCJsbmJcIixcImxuZFwiLFwibG5nXCIsXCJsbmhcIixcImxuaVwiLFwibG5qXCIsXCJsbmxcIixcImxubVwiLFwibG5uXCIsXCJsbm9cIixcImxuc1wiLFwibG51XCIsXCJsbndcIixcImxuelwiLFwibG9hXCIsXCJsb2JcIixcImxvY1wiLFwibG9lXCIsXCJsb2ZcIixcImxvZ1wiLFwibG9oXCIsXCJsb2lcIixcImxvalwiLFwibG9rXCIsXCJsb2xcIixcImxvbVwiLFwibG9uXCIsXCJsb29cIixcImxvcFwiLFwibG9xXCIsXCJsb3JcIixcImxvc1wiLFwibG90XCIsXCJsb3VcIixcImxvdlwiLFwibG93XCIsXCJsb3hcIixcImxveVwiLFwibG96XCIsXCJscGFcIixcImxwZVwiLFwibHBuXCIsXCJscG9cIixcImxweFwiLFwibHJhXCIsXCJscmNcIixcImxyZVwiLFwibHJnXCIsXCJscmlcIixcImxya1wiLFwibHJsXCIsXCJscm1cIixcImxyblwiLFwibHJvXCIsXCJscnJcIixcImxydFwiLFwibHJ2XCIsXCJscnpcIixcImxzYVwiLFwibHNiXCIsXCJsc2RcIixcImxzZVwiLFwibHNnXCIsXCJsc2hcIixcImxzaVwiLFwibHNsXCIsXCJsc21cIixcImxzblwiLFwibHNvXCIsXCJsc3BcIixcImxzclwiLFwibHNzXCIsXCJsc3RcIixcImxzdlwiLFwibHN5XCIsXCJsdGNcIixcImx0Z1wiLFwibHRoXCIsXCJsdGlcIixcImx0blwiLFwibHRvXCIsXCJsdHNcIixcImx0dVwiLFwibHVhXCIsXCJsdWNcIixcImx1ZFwiLFwibHVlXCIsXCJsdWZcIixcImx1aVwiLFwibHVqXCIsXCJsdWtcIixcImx1bFwiLFwibHVtXCIsXCJsdW5cIixcImx1b1wiLFwibHVwXCIsXCJsdXFcIixcImx1clwiLFwibHVzXCIsXCJsdXRcIixcImx1dVwiLFwibHV2XCIsXCJsdXdcIixcImx1eVwiLFwibHV6XCIsXCJsdmFcIixcImx2aVwiLFwibHZrXCIsXCJsdnNcIixcImx2dVwiLFwibHdhXCIsXCJsd2VcIixcImx3Z1wiLFwibHdoXCIsXCJsd2xcIixcImx3bVwiLFwibHdvXCIsXCJsd3NcIixcImx3dFwiLFwibHd1XCIsXCJsd3dcIixcImx4bVwiLFwibHlhXCIsXCJseWdcIixcImx5blwiLFwibHpoXCIsXCJsemxcIixcImx6blwiLFwibHp6XCJdXG4sWyBcIm1nXCIsXCJtaFwiLFwibWlcIixcIm1rXCIsXCJtbFwiLFwibW5cIixcIm1vXCIsXCJtclwiLFwibXNcIixcIm10XCIsXCJteVwiLFwibWFhXCIsXCJtYWJcIixcIm1hZFwiLFwibWFlXCIsXCJtYWZcIixcIm1hZ1wiLFwibWFpXCIsXCJtYWpcIixcIm1ha1wiLFwibWFtXCIsXCJtYW5cIixcIm1hcFwiLFwibWFxXCIsXCJtYXNcIixcIm1hdFwiLFwibWF1XCIsXCJtYXZcIixcIm1hd1wiLFwibWF4XCIsXCJtYXpcIixcIm1iYVwiLFwibWJiXCIsXCJtYmNcIixcIm1iZFwiLFwibWJlXCIsXCJtYmZcIixcIm1iaFwiLFwibWJpXCIsXCJtYmpcIixcIm1ia1wiLFwibWJsXCIsXCJtYm1cIixcIm1iblwiLFwibWJvXCIsXCJtYnBcIixcIm1icVwiLFwibWJyXCIsXCJtYnNcIixcIm1idFwiLFwibWJ1XCIsXCJtYnZcIixcIm1id1wiLFwibWJ4XCIsXCJtYnlcIixcIm1ielwiLFwibWNhXCIsXCJtY2JcIixcIm1jY1wiLFwibWNkXCIsXCJtY2VcIixcIm1jZlwiLFwibWNnXCIsXCJtY2hcIixcIm1jaVwiLFwibWNqXCIsXCJtY2tcIixcIm1jbFwiLFwibWNtXCIsXCJtY25cIixcIm1jb1wiLFwibWNwXCIsXCJtY3FcIixcIm1jclwiLFwibWNzXCIsXCJtY3RcIixcIm1jdVwiLFwibWN2XCIsXCJtY3dcIixcIm1jeFwiLFwibWN5XCIsXCJtY3pcIixcIm1kYVwiLFwibWRiXCIsXCJtZGNcIixcIm1kZFwiLFwibWRlXCIsXCJtZGZcIixcIm1kZ1wiLFwibWRoXCIsXCJtZGlcIixcIm1kalwiLFwibWRrXCIsXCJtZGxcIixcIm1kbVwiLFwibWRuXCIsXCJtZHBcIixcIm1kcVwiLFwibWRyXCIsXCJtZHNcIixcIm1kdFwiLFwibWR1XCIsXCJtZHZcIixcIm1kd1wiLFwibWR4XCIsXCJtZHlcIixcIm1kelwiLFwibWVhXCIsXCJtZWJcIixcIm1lY1wiLFwibWVkXCIsXCJtZWVcIixcIm1lZlwiLFwibWVnXCIsXCJtZWhcIixcIm1laVwiLFwibWVqXCIsXCJtZWtcIixcIm1lbFwiLFwibWVtXCIsXCJtZW5cIixcIm1lb1wiLFwibWVwXCIsXCJtZXFcIixcIm1lclwiLFwibWVzXCIsXCJtZXRcIixcIm1ldVwiLFwibWV2XCIsXCJtZXdcIixcIm1leVwiLFwibWV6XCIsXCJtZmFcIixcIm1mYlwiLFwibWZjXCIsXCJtZmRcIixcIm1mZVwiLFwibWZmXCIsXCJtZmdcIixcIm1maFwiLFwibWZpXCIsXCJtZmpcIixcIm1ma1wiLFwibWZsXCIsXCJtZm1cIixcIm1mblwiLFwibWZvXCIsXCJtZnBcIixcIm1mcVwiLFwibWZyXCIsXCJtZnNcIixcIm1mdFwiLFwibWZ1XCIsXCJtZnZcIixcIm1md1wiLFwibWZ4XCIsXCJtZnlcIixcIm1melwiLFwibWdhXCIsXCJtZ2JcIixcIm1nY1wiLFwibWdkXCIsXCJtZ2VcIixcIm1nZlwiLFwibWdnXCIsXCJtZ2hcIixcIm1naVwiLFwibWdqXCIsXCJtZ2tcIixcIm1nbFwiLFwibWdtXCIsXCJtZ25cIixcIm1nb1wiLFwibWdwXCIsXCJtZ3FcIixcIm1nclwiLFwibWdzXCIsXCJtZ3RcIixcIm1ndVwiLFwibWd2XCIsXCJtZ3dcIixcIm1neFwiLFwibWd5XCIsXCJtZ3pcIixcIm1oYVwiLFwibWhiXCIsXCJtaGNcIixcIm1oZFwiLFwibWhlXCIsXCJtaGZcIixcIm1oZ1wiLFwibWhoXCIsXCJtaGlcIixcIm1oalwiLFwibWhrXCIsXCJtaGxcIixcIm1obVwiLFwibWhuXCIsXCJtaG9cIixcIm1ocFwiLFwibWhxXCIsXCJtaHJcIixcIm1oc1wiLFwibWh0XCIsXCJtaHVcIixcIm1od1wiLFwibWh4XCIsXCJtaHlcIixcIm1oelwiLFwibWlhXCIsXCJtaWJcIixcIm1pY1wiLFwibWlkXCIsXCJtaWVcIixcIm1pZlwiLFwibWlnXCIsXCJtaWhcIixcIm1paVwiLFwibWlqXCIsXCJtaWtcIixcIm1pbFwiLFwibWltXCIsXCJtaW5cIixcIm1pb1wiLFwibWlwXCIsXCJtaXFcIixcIm1pclwiLFwibWlzXCIsXCJtaXRcIixcIm1pdVwiLFwibWl3XCIsXCJtaXhcIixcIm1peVwiLFwibWl6XCIsXCJtamFcIixcIm1qYlwiLFwibWpjXCIsXCJtamRcIixcIm1qZVwiLFwibWpnXCIsXCJtamhcIixcIm1qaVwiLFwibWpqXCIsXCJtamtcIixcIm1qbFwiLFwibWptXCIsXCJtam5cIixcIm1qb1wiLFwibWpwXCIsXCJtanFcIixcIm1qclwiLFwibWpzXCIsXCJtanRcIixcIm1qdVwiLFwibWp2XCIsXCJtandcIixcIm1qeFwiLFwibWp5XCIsXCJtanpcIixcIm1rYVwiLFwibWtiXCIsXCJta2NcIixcIm1rZVwiLFwibWtmXCIsXCJta2dcIixcIm1raFwiLFwibWtpXCIsXCJta2pcIixcIm1ra1wiLFwibWtsXCIsXCJta21cIixcIm1rblwiLFwibWtvXCIsXCJta3BcIixcIm1rcVwiLFwibWtyXCIsXCJta3NcIixcIm1rdFwiLFwibWt1XCIsXCJta3ZcIixcIm1rd1wiLFwibWt4XCIsXCJta3lcIixcIm1relwiLFwibWxhXCIsXCJtbGJcIixcIm1sY1wiLFwibWxkXCIsXCJtbGVcIixcIm1sZlwiLFwibWxoXCIsXCJtbGlcIixcIm1salwiLFwibWxrXCIsXCJtbGxcIixcIm1sbVwiLFwibWxuXCIsXCJtbG9cIixcIm1scFwiLFwibWxxXCIsXCJtbHJcIixcIm1sc1wiLFwibWx1XCIsXCJtbHZcIixcIm1sd1wiLFwibWx4XCIsXCJtbHpcIixcIm1tYVwiLFwibW1iXCIsXCJtbWNcIixcIm1tZFwiLFwibW1lXCIsXCJtbWZcIixcIm1tZ1wiLFwibW1oXCIsXCJtbWlcIixcIm1talwiLFwibW1rXCIsXCJtbWxcIixcIm1tbVwiLFwibW1uXCIsXCJtbW9cIixcIm1tcFwiLFwibW1xXCIsXCJtbXJcIixcIm1tdFwiLFwibW11XCIsXCJtbXZcIixcIm1td1wiLFwibW14XCIsXCJtbXlcIixcIm1telwiLFwibW5hXCIsXCJtbmJcIixcIm1uY1wiLFwibW5kXCIsXCJtbmVcIixcIm1uZlwiLFwibW5nXCIsXCJtbmhcIixcIm1uaVwiLFwibW5qXCIsXCJtbmtcIixcIm1ubFwiLFwibW5tXCIsXCJtbm5cIixcIm1ub1wiLFwibW5wXCIsXCJtbnFcIixcIm1uclwiLFwibW5zXCIsXCJtbnRcIixcIm1udVwiLFwibW52XCIsXCJtbndcIixcIm1ueFwiLFwibW55XCIsXCJtbnpcIixcIm1vYVwiLFwibW9jXCIsXCJtb2RcIixcIm1vZVwiLFwibW9mXCIsXCJtb2dcIixcIm1vaFwiLFwibW9pXCIsXCJtb2pcIixcIm1va1wiLFwibW9tXCIsXCJtb29cIixcIm1vcFwiLFwibW9xXCIsXCJtb3JcIixcIm1vc1wiLFwibW90XCIsXCJtb3VcIixcIm1vdlwiLFwibW93XCIsXCJtb3hcIixcIm1veVwiLFwibW96XCIsXCJtcGFcIixcIm1wYlwiLFwibXBjXCIsXCJtcGRcIixcIm1wZVwiLFwibXBnXCIsXCJtcGhcIixcIm1waVwiLFwibXBqXCIsXCJtcGtcIixcIm1wbFwiLFwibXBtXCIsXCJtcG5cIixcIm1wb1wiLFwibXBwXCIsXCJtcHFcIixcIm1wclwiLFwibXBzXCIsXCJtcHRcIixcIm1wdVwiLFwibXB2XCIsXCJtcHdcIixcIm1weFwiLFwibXB5XCIsXCJtcHpcIixcIm1xYVwiLFwibXFiXCIsXCJtcWNcIixcIm1xZVwiLFwibXFmXCIsXCJtcWdcIixcIm1xaFwiLFwibXFpXCIsXCJtcWpcIixcIm1xa1wiLFwibXFsXCIsXCJtcW1cIixcIm1xblwiLFwibXFvXCIsXCJtcXBcIixcIm1xcVwiLFwibXFyXCIsXCJtcXNcIixcIm1xdFwiLFwibXF1XCIsXCJtcXZcIixcIm1xd1wiLFwibXF4XCIsXCJtcXlcIixcIm1xelwiLFwibXJhXCIsXCJtcmJcIixcIm1yY1wiLFwibXJkXCIsXCJtcmVcIixcIm1yZlwiLFwibXJnXCIsXCJtcmhcIixcIm1yalwiLFwibXJrXCIsXCJtcmxcIixcIm1ybVwiLFwibXJuXCIsXCJtcm9cIixcIm1ycFwiLFwibXJxXCIsXCJtcnJcIixcIm1yc1wiLFwibXJ0XCIsXCJtcnVcIixcIm1ydlwiLFwibXJ3XCIsXCJtcnhcIixcIm1yeVwiLFwibXJ6XCIsXCJtc2JcIixcIm1zY1wiLFwibXNkXCIsXCJtc2VcIixcIm1zZlwiLFwibXNnXCIsXCJtc2hcIixcIm1zaVwiLFwibXNqXCIsXCJtc2tcIixcIm1zbFwiLFwibXNtXCIsXCJtc25cIixcIm1zb1wiLFwibXNwXCIsXCJtc3FcIixcIm1zclwiLFwibXNzXCIsXCJtc3RcIixcIm1zdVwiLFwibXN2XCIsXCJtc3dcIixcIm1zeFwiLFwibXN5XCIsXCJtc3pcIixcIm10YVwiLFwibXRiXCIsXCJtdGNcIixcIm10ZFwiLFwibXRlXCIsXCJtdGZcIixcIm10Z1wiLFwibXRoXCIsXCJtdGlcIixcIm10alwiLFwibXRrXCIsXCJtdGxcIixcIm10bVwiLFwibXRuXCIsXCJtdG9cIixcIm10cFwiLFwibXRxXCIsXCJtdHJcIixcIm10c1wiLFwibXR0XCIsXCJtdHVcIixcIm10dlwiLFwibXR3XCIsXCJtdHhcIixcIm10eVwiLFwibXVhXCIsXCJtdWJcIixcIm11Y1wiLFwibXVkXCIsXCJtdWVcIixcIm11Z1wiLFwibXVoXCIsXCJtdWlcIixcIm11alwiLFwibXVrXCIsXCJtdWxcIixcIm11bVwiLFwibXVuXCIsXCJtdW9cIixcIm11cFwiLFwibXVxXCIsXCJtdXJcIixcIm11c1wiLFwibXV0XCIsXCJtdXVcIixcIm11dlwiLFwibXV4XCIsXCJtdXlcIixcIm11elwiLFwibXZhXCIsXCJtdmJcIixcIm12ZFwiLFwibXZlXCIsXCJtdmZcIixcIm12Z1wiLFwibXZoXCIsXCJtdmlcIixcIm12a1wiLFwibXZsXCIsXCJtdm1cIixcIm12blwiLFwibXZvXCIsXCJtdnBcIixcIm12cVwiLFwibXZyXCIsXCJtdnNcIixcIm12dFwiLFwibXZ1XCIsXCJtdnZcIixcIm12d1wiLFwibXZ4XCIsXCJtdnlcIixcIm12elwiLFwibXdhXCIsXCJtd2JcIixcIm13Y1wiLFwibXdkXCIsXCJtd2VcIixcIm13ZlwiLFwibXdnXCIsXCJtd2hcIixcIm13aVwiLFwibXdqXCIsXCJtd2tcIixcIm13bFwiLFwibXdtXCIsXCJtd25cIixcIm13b1wiLFwibXdwXCIsXCJtd3FcIixcIm13clwiLFwibXdzXCIsXCJtd3RcIixcIm13dVwiLFwibXd2XCIsXCJtd3dcIixcIm13eFwiLFwibXd5XCIsXCJtd3pcIixcIm14YVwiLFwibXhiXCIsXCJteGNcIixcIm14ZFwiLFwibXhlXCIsXCJteGZcIixcIm14Z1wiLFwibXhoXCIsXCJteGlcIixcIm14alwiLFwibXhrXCIsXCJteGxcIixcIm14bVwiLFwibXhuXCIsXCJteG9cIixcIm14cFwiLFwibXhxXCIsXCJteHJcIixcIm14c1wiLFwibXh0XCIsXCJteHVcIixcIm14dlwiLFwibXh3XCIsXCJteHhcIixcIm14eVwiLFwibXh6XCIsXCJteWJcIixcIm15Y1wiLFwibXlkXCIsXCJteWVcIixcIm15ZlwiLFwibXlnXCIsXCJteWhcIixcIm15aVwiLFwibXlqXCIsXCJteWtcIixcIm15bFwiLFwibXltXCIsXCJteW5cIixcIm15b1wiLFwibXlwXCIsXCJteXFcIixcIm15clwiLFwibXlzXCIsXCJteXRcIixcIm15dVwiLFwibXl2XCIsXCJteXdcIixcIm15eFwiLFwibXl5XCIsXCJteXpcIixcIm16YVwiLFwibXpiXCIsXCJtemNcIixcIm16ZFwiLFwibXplXCIsXCJtemdcIixcIm16aFwiLFwibXppXCIsXCJtempcIixcIm16a1wiLFwibXpsXCIsXCJtem1cIixcIm16blwiLFwibXpvXCIsXCJtenBcIixcIm16cVwiLFwibXpyXCIsXCJtenNcIixcIm16dFwiLFwibXp1XCIsXCJtenZcIixcIm16d1wiLFwibXp4XCIsXCJtenlcIixcIm16elwiXVxuLFsgXCJuYVwiLFwibmJcIixcIm5kXCIsXCJuZVwiLFwibmdcIixcIm5sXCIsXCJublwiLFwibm9cIixcIm5yXCIsXCJudlwiLFwibnlcIixcIm5hYVwiLFwibmFiXCIsXCJuYWNcIixcIm5hZFwiLFwibmFlXCIsXCJuYWZcIixcIm5hZ1wiLFwibmFoXCIsXCJuYWlcIixcIm5halwiLFwibmFrXCIsXCJuYWxcIixcIm5hbVwiLFwibmFuXCIsXCJuYW9cIixcIm5hcFwiLFwibmFxXCIsXCJuYXJcIixcIm5hc1wiLFwibmF0XCIsXCJuYXdcIixcIm5heFwiLFwibmF5XCIsXCJuYXpcIixcIm5iYVwiLFwibmJiXCIsXCJuYmNcIixcIm5iZFwiLFwibmJlXCIsXCJuYmZcIixcIm5iZ1wiLFwibmJoXCIsXCJuYmlcIixcIm5ialwiLFwibmJrXCIsXCJuYm1cIixcIm5iblwiLFwibmJvXCIsXCJuYnBcIixcIm5icVwiLFwibmJyXCIsXCJuYnNcIixcIm5idFwiLFwibmJ1XCIsXCJuYnZcIixcIm5id1wiLFwibmJ4XCIsXCJuYnlcIixcIm5jYVwiLFwibmNiXCIsXCJuY2NcIixcIm5jZFwiLFwibmNlXCIsXCJuY2ZcIixcIm5jZ1wiLFwibmNoXCIsXCJuY2lcIixcIm5jalwiLFwibmNrXCIsXCJuY2xcIixcIm5jbVwiLFwibmNuXCIsXCJuY29cIixcIm5jcFwiLFwibmNxXCIsXCJuY3JcIixcIm5jc1wiLFwibmN0XCIsXCJuY3VcIixcIm5jeFwiLFwibmN6XCIsXCJuZGFcIixcIm5kYlwiLFwibmRjXCIsXCJuZGRcIixcIm5kZlwiLFwibmRnXCIsXCJuZGhcIixcIm5kaVwiLFwibmRqXCIsXCJuZGtcIixcIm5kbFwiLFwibmRtXCIsXCJuZG5cIixcIm5kcFwiLFwibmRxXCIsXCJuZHJcIixcIm5kc1wiLFwibmR0XCIsXCJuZHVcIixcIm5kdlwiLFwibmR3XCIsXCJuZHhcIixcIm5keVwiLFwibmR6XCIsXCJuZWFcIixcIm5lYlwiLFwibmVjXCIsXCJuZWRcIixcIm5lZVwiLFwibmVmXCIsXCJuZWdcIixcIm5laFwiLFwibmVpXCIsXCJuZWpcIixcIm5la1wiLFwibmVtXCIsXCJuZW5cIixcIm5lb1wiLFwibmVxXCIsXCJuZXJcIixcIm5lc1wiLFwibmV0XCIsXCJuZXVcIixcIm5ldlwiLFwibmV3XCIsXCJuZXhcIixcIm5leVwiLFwibmV6XCIsXCJuZmFcIixcIm5mZFwiLFwibmZsXCIsXCJuZnJcIixcIm5mdVwiLFwibmdhXCIsXCJuZ2JcIixcIm5nY1wiLFwibmdkXCIsXCJuZ2VcIixcIm5nZlwiLFwibmdnXCIsXCJuZ2hcIixcIm5naVwiLFwibmdqXCIsXCJuZ2tcIixcIm5nbFwiLFwibmdtXCIsXCJuZ25cIixcIm5nb1wiLFwibmdwXCIsXCJuZ3FcIixcIm5nclwiLFwibmdzXCIsXCJuZ3RcIixcIm5ndVwiLFwibmd2XCIsXCJuZ3dcIixcIm5neFwiLFwibmd5XCIsXCJuZ3pcIixcIm5oYVwiLFwibmhiXCIsXCJuaGNcIixcIm5oZFwiLFwibmhlXCIsXCJuaGZcIixcIm5oZ1wiLFwibmhoXCIsXCJuaGlcIixcIm5oa1wiLFwibmhtXCIsXCJuaG5cIixcIm5ob1wiLFwibmhwXCIsXCJuaHFcIixcIm5oclwiLFwibmh0XCIsXCJuaHVcIixcIm5odlwiLFwibmh3XCIsXCJuaHhcIixcIm5oeVwiLFwibmh6XCIsXCJuaWFcIixcIm5pYlwiLFwibmljXCIsXCJuaWRcIixcIm5pZVwiLFwibmlmXCIsXCJuaWdcIixcIm5paFwiLFwibmlpXCIsXCJuaWpcIixcIm5pa1wiLFwibmlsXCIsXCJuaW1cIixcIm5pblwiLFwibmlvXCIsXCJuaXFcIixcIm5pclwiLFwibmlzXCIsXCJuaXRcIixcIm5pdVwiLFwibml2XCIsXCJuaXdcIixcIm5peFwiLFwibml5XCIsXCJuaXpcIixcIm5qYVwiLFwibmpiXCIsXCJuamRcIixcIm5qaFwiLFwibmppXCIsXCJuampcIixcIm5qbFwiLFwibmptXCIsXCJuam5cIixcIm5qb1wiLFwibmpyXCIsXCJuanNcIixcIm5qdFwiLFwibmp1XCIsXCJuanhcIixcIm5qeVwiLFwibmp6XCIsXCJua2FcIixcIm5rYlwiLFwibmtjXCIsXCJua2RcIixcIm5rZVwiLFwibmtmXCIsXCJua2dcIixcIm5raFwiLFwibmtpXCIsXCJua2pcIixcIm5ra1wiLFwibmttXCIsXCJua25cIixcIm5rb1wiLFwibmtwXCIsXCJua3FcIixcIm5rclwiLFwibmtzXCIsXCJua3RcIixcIm5rdVwiLFwibmt2XCIsXCJua3dcIixcIm5reFwiLFwibmt6XCIsXCJubGFcIixcIm5sY1wiLFwibmxlXCIsXCJubGdcIixcIm5saVwiLFwibmxqXCIsXCJubGtcIixcIm5sbFwiLFwibmxtXCIsXCJubG5cIixcIm5sb1wiLFwibmxxXCIsXCJubHJcIixcIm5sdVwiLFwibmx2XCIsXCJubHdcIixcIm5seFwiLFwibmx5XCIsXCJubHpcIixcIm5tYVwiLFwibm1iXCIsXCJubWNcIixcIm5tZFwiLFwibm1lXCIsXCJubWZcIixcIm5tZ1wiLFwibm1oXCIsXCJubWlcIixcIm5talwiLFwibm1rXCIsXCJubWxcIixcIm5tbVwiLFwibm1uXCIsXCJubW9cIixcIm5tcFwiLFwibm1xXCIsXCJubXJcIixcIm5tc1wiLFwibm10XCIsXCJubXVcIixcIm5tdlwiLFwibm13XCIsXCJubXhcIixcIm5teVwiLFwibm16XCIsXCJubmFcIixcIm5uYlwiLFwibm5jXCIsXCJubmRcIixcIm5uZVwiLFwibm5mXCIsXCJubmdcIixcIm5uaFwiLFwibm5pXCIsXCJubmpcIixcIm5ua1wiLFwibm5sXCIsXCJubm1cIixcIm5ublwiLFwibm5wXCIsXCJubnFcIixcIm5uclwiLFwibm5zXCIsXCJubnRcIixcIm5udVwiLFwibm52XCIsXCJubndcIixcIm5ueFwiLFwibm55XCIsXCJubnpcIixcIm5vYVwiLFwibm9jXCIsXCJub2RcIixcIm5vZVwiLFwibm9mXCIsXCJub2dcIixcIm5vaFwiLFwibm9pXCIsXCJub2pcIixcIm5va1wiLFwibm9sXCIsXCJub21cIixcIm5vblwiLFwibm9vXCIsXCJub3BcIixcIm5vcVwiLFwibm9zXCIsXCJub3RcIixcIm5vdVwiLFwibm92XCIsXCJub3dcIixcIm5veVwiLFwibm96XCIsXCJucGFcIixcIm5wYlwiLFwibnBnXCIsXCJucGhcIixcIm5waVwiLFwibnBsXCIsXCJucG5cIixcIm5wb1wiLFwibnBzXCIsXCJucHVcIixcIm5weFwiLFwibnB5XCIsXCJucWdcIixcIm5xa1wiLFwibnFsXCIsXCJucW1cIixcIm5xblwiLFwibnFvXCIsXCJucXFcIixcIm5xdFwiLFwibnF5XCIsXCJucmFcIixcIm5yYlwiLFwibnJjXCIsXCJucmVcIixcIm5yZlwiLFwibnJnXCIsXCJucmlcIixcIm5ya1wiLFwibnJsXCIsXCJucm1cIixcIm5yblwiLFwibnJwXCIsXCJucnJcIixcIm5ydFwiLFwibnJ1XCIsXCJucnhcIixcIm5yelwiLFwibnNhXCIsXCJuc2JcIixcIm5zY1wiLFwibnNkXCIsXCJuc2VcIixcIm5zZlwiLFwibnNnXCIsXCJuc2hcIixcIm5zaVwiLFwibnNrXCIsXCJuc2xcIixcIm5zbVwiLFwibnNuXCIsXCJuc29cIixcIm5zcFwiLFwibnNxXCIsXCJuc3JcIixcIm5zc1wiLFwibnN0XCIsXCJuc3VcIixcIm5zdlwiLFwibnN3XCIsXCJuc3hcIixcIm5zeVwiLFwibnN6XCIsXCJudGRcIixcIm50ZVwiLFwibnRnXCIsXCJudGlcIixcIm50alwiLFwibnRrXCIsXCJudG1cIixcIm50b1wiLFwibnRwXCIsXCJudHJcIixcIm50c1wiLFwibnR1XCIsXCJudHdcIixcIm50eFwiLFwibnR5XCIsXCJudHpcIixcIm51YVwiLFwibnViXCIsXCJudWNcIixcIm51ZFwiLFwibnVlXCIsXCJudWZcIixcIm51Z1wiLFwibnVoXCIsXCJudWlcIixcIm51alwiLFwibnVrXCIsXCJudWxcIixcIm51bVwiLFwibnVuXCIsXCJudW9cIixcIm51cFwiLFwibnVxXCIsXCJudXJcIixcIm51c1wiLFwibnV0XCIsXCJudXVcIixcIm51dlwiLFwibnV3XCIsXCJudXhcIixcIm51eVwiLFwibnV6XCIsXCJudmhcIixcIm52bVwiLFwibnZvXCIsXCJud2FcIixcIm53YlwiLFwibndjXCIsXCJud2VcIixcIm53Z1wiLFwibndpXCIsXCJud21cIixcIm53b1wiLFwibndyXCIsXCJud3hcIixcIm53eVwiLFwibnhhXCIsXCJueGRcIixcIm54ZVwiLFwibnhnXCIsXCJueGlcIixcIm54a1wiLFwibnhsXCIsXCJueG1cIixcIm54blwiLFwibnhvXCIsXCJueHFcIixcIm54clwiLFwibnh1XCIsXCJueHhcIixcIm55YlwiLFwibnljXCIsXCJueWRcIixcIm55ZVwiLFwibnlmXCIsXCJueWdcIixcIm55aFwiLFwibnlpXCIsXCJueWpcIixcIm55a1wiLFwibnlsXCIsXCJueW1cIixcIm55blwiLFwibnlvXCIsXCJueXBcIixcIm55cVwiLFwibnlyXCIsXCJueXNcIixcIm55dFwiLFwibnl1XCIsXCJueXZcIixcIm55d1wiLFwibnl4XCIsXCJueXlcIixcIm56YVwiLFwibnpiXCIsXCJuemRcIixcIm56aVwiLFwibnprXCIsXCJuem1cIixcIm56c1wiLFwibnp1XCIsXCJuenlcIixcIm56elwiXVxuLFsgXCJvY1wiLFwib2pcIixcIm9tXCIsXCJvclwiLFwib3NcIixcIm9hYVwiLFwib2FjXCIsXCJvYXJcIixcIm9hdlwiLFwib2JpXCIsXCJvYmtcIixcIm9ibFwiLFwib2JtXCIsXCJvYm9cIixcIm9iclwiLFwib2J0XCIsXCJvYnVcIixcIm9jYVwiLFwib2NoXCIsXCJvY21cIixcIm9jb1wiLFwib2N1XCIsXCJvZGFcIixcIm9ka1wiLFwib2R0XCIsXCJvZHVcIixcIm9mb1wiLFwib2ZzXCIsXCJvZnVcIixcIm9nYlwiLFwib2djXCIsXCJvZ2VcIixcIm9nZ1wiLFwib2dvXCIsXCJvZ3VcIixcIm9odFwiLFwib2h1XCIsXCJvaWFcIixcIm9pblwiLFwib2piXCIsXCJvamNcIixcIm9qZ1wiLFwib2pwXCIsXCJvanNcIixcIm9qdlwiLFwib2p3XCIsXCJva2FcIixcIm9rYlwiLFwib2tjXCIsXCJva2RcIixcIm9rZVwiLFwib2tnXCIsXCJva2hcIixcIm9raVwiLFwib2tqXCIsXCJva2tcIixcIm9rbFwiLFwib2ttXCIsXCJva25cIixcIm9rb1wiLFwib2tyXCIsXCJva3NcIixcIm9rdVwiLFwib2t2XCIsXCJva3hcIixcIm9relwiLFwib2xhXCIsXCJvbGRcIixcIm9sZVwiLFwib2xrXCIsXCJvbG1cIixcIm9sb1wiLFwib2xyXCIsXCJvbHRcIixcIm9sdVwiLFwib21hXCIsXCJvbWJcIixcIm9tY1wiLFwib21lXCIsXCJvbWdcIixcIm9taVwiLFwib21rXCIsXCJvbWxcIixcIm9tblwiLFwib21vXCIsXCJvbXBcIixcIm9tcVwiLFwib21yXCIsXCJvbXRcIixcIm9tdVwiLFwib212XCIsXCJvbXdcIixcIm9teFwiLFwib215XCIsXCJvbmFcIixcIm9uYlwiLFwib25lXCIsXCJvbmdcIixcIm9uaVwiLFwib25qXCIsXCJvbmtcIixcIm9ublwiLFwib25vXCIsXCJvbnBcIixcIm9uclwiLFwib25zXCIsXCJvbnRcIixcIm9udVwiLFwib253XCIsXCJvbnhcIixcIm9vZFwiLFwib29nXCIsXCJvb25cIixcIm9vclwiLFwib29zXCIsXCJvcGFcIixcIm9wa1wiLFwib3BtXCIsXCJvcG9cIixcIm9wdFwiLFwib3B5XCIsXCJvcmFcIixcIm9yY1wiLFwib3JlXCIsXCJvcmdcIixcIm9yaFwiLFwib3JuXCIsXCJvcm9cIixcIm9yclwiLFwib3JzXCIsXCJvcnRcIixcIm9ydVwiLFwib3J2XCIsXCJvcndcIixcIm9yeFwiLFwib3J5XCIsXCJvcnpcIixcIm9zYVwiLFwib3NjXCIsXCJvc2lcIixcIm9zblwiLFwib3NvXCIsXCJvc3BcIixcIm9zdFwiLFwib3N1XCIsXCJvc3hcIixcIm90YVwiLFwib3RiXCIsXCJvdGRcIixcIm90ZVwiLFwib3RpXCIsXCJvdGtcIixcIm90bFwiLFwib3RtXCIsXCJvdG5cIixcIm90b1wiLFwib3RxXCIsXCJvdHJcIixcIm90c1wiLFwib3R0XCIsXCJvdHVcIixcIm90d1wiLFwib3R4XCIsXCJvdHlcIixcIm90elwiLFwib3VhXCIsXCJvdWJcIixcIm91ZVwiLFwib3VpXCIsXCJvdW1cIixcIm91blwiLFwib3ZkXCIsXCJvd2lcIixcIm93bFwiLFwib3liXCIsXCJveWRcIixcIm95bVwiLFwib3l5XCIsXCJvem1cIl1cbixbIFwicGFcIixcInBpXCIsXCJwbFwiLFwicHNcIixcInB0XCIsXCJwYWFcIixcInBhYlwiLFwicGFjXCIsXCJwYWRcIixcInBhZVwiLFwicGFmXCIsXCJwYWdcIixcInBhaFwiLFwicGFpXCIsXCJwYWtcIixcInBhbFwiLFwicGFtXCIsXCJwYW9cIixcInBhcFwiLFwicGFxXCIsXCJwYXJcIixcInBhc1wiLFwicGF0XCIsXCJwYXVcIixcInBhdlwiLFwicGF3XCIsXCJwYXhcIixcInBheVwiLFwicGF6XCIsXCJwYmJcIixcInBiY1wiLFwicGJlXCIsXCJwYmZcIixcInBiZ1wiLFwicGJoXCIsXCJwYmlcIixcInBibFwiLFwicGJtXCIsXCJwYm5cIixcInBib1wiLFwicGJwXCIsXCJwYnJcIixcInBic1wiLFwicGJ0XCIsXCJwYnVcIixcInBidlwiLFwicGJ5XCIsXCJwYnpcIixcInBjYVwiLFwicGNiXCIsXCJwY2NcIixcInBjZFwiLFwicGNlXCIsXCJwY2ZcIixcInBjZ1wiLFwicGNoXCIsXCJwY2lcIixcInBjalwiLFwicGNrXCIsXCJwY2xcIixcInBjbVwiLFwicGNuXCIsXCJwY3BcIixcInBjclwiLFwicGN3XCIsXCJwZGFcIixcInBkY1wiLFwicGRpXCIsXCJwZG5cIixcInBkb1wiLFwicGR0XCIsXCJwZHVcIixcInBlYVwiLFwicGViXCIsXCJwZWRcIixcInBlZVwiLFwicGVmXCIsXCJwZWdcIixcInBlaFwiLFwicGVpXCIsXCJwZWpcIixcInBla1wiLFwicGVsXCIsXCJwZW1cIixcInBlb1wiLFwicGVwXCIsXCJwZXFcIixcInBlc1wiLFwicGV2XCIsXCJwZXhcIixcInBleVwiLFwicGV6XCIsXCJwZmFcIixcInBmZVwiLFwicGZsXCIsXCJwZ2FcIixcInBnZFwiLFwicGdnXCIsXCJwZ2lcIixcInBna1wiLFwicGdsXCIsXCJwZ25cIixcInBnc1wiLFwicGd1XCIsXCJwZ3lcIixcInBnelwiLFwicGhhXCIsXCJwaGRcIixcInBoZ1wiLFwicGhoXCIsXCJwaGlcIixcInBoa1wiLFwicGhsXCIsXCJwaG1cIixcInBoblwiLFwicGhvXCIsXCJwaHFcIixcInBoclwiLFwicGh0XCIsXCJwaHVcIixcInBodlwiLFwicGh3XCIsXCJwaWFcIixcInBpYlwiLFwicGljXCIsXCJwaWRcIixcInBpZVwiLFwicGlmXCIsXCJwaWdcIixcInBpaFwiLFwicGlpXCIsXCJwaWpcIixcInBpbFwiLFwicGltXCIsXCJwaW5cIixcInBpb1wiLFwicGlwXCIsXCJwaXJcIixcInBpc1wiLFwicGl0XCIsXCJwaXVcIixcInBpdlwiLFwicGl3XCIsXCJwaXhcIixcInBpeVwiLFwicGl6XCIsXCJwanRcIixcInBrYVwiLFwicGtiXCIsXCJwa2NcIixcInBrZ1wiLFwicGtoXCIsXCJwa25cIixcInBrb1wiLFwicGtwXCIsXCJwa3JcIixcInBrc1wiLFwicGt0XCIsXCJwa3VcIixcInBsYVwiLFwicGxiXCIsXCJwbGNcIixcInBsZFwiLFwicGxlXCIsXCJwbGZcIixcInBsZ1wiLFwicGxoXCIsXCJwbGpcIixcInBsa1wiLFwicGxsXCIsXCJwbG5cIixcInBsb1wiLFwicGxwXCIsXCJwbHFcIixcInBsclwiLFwicGxzXCIsXCJwbHRcIixcInBsdVwiLFwicGx2XCIsXCJwbHdcIixcInBseVwiLFwicGx6XCIsXCJwbWFcIixcInBtYlwiLFwicG1jXCIsXCJwbWRcIixcInBtZVwiLFwicG1mXCIsXCJwbWhcIixcInBtaVwiLFwicG1qXCIsXCJwbWtcIixcInBtbFwiLFwicG1tXCIsXCJwbW5cIixcInBtb1wiLFwicG1xXCIsXCJwbXJcIixcInBtc1wiLFwicG10XCIsXCJwbXVcIixcInBtd1wiLFwicG14XCIsXCJwbXlcIixcInBtelwiLFwicG5hXCIsXCJwbmJcIixcInBuY1wiLFwicG5kXCIsXCJwbmVcIixcInBuZ1wiLFwicG5oXCIsXCJwbmlcIixcInBualwiLFwicG5rXCIsXCJwbmxcIixcInBubVwiLFwicG5uXCIsXCJwbm9cIixcInBucFwiLFwicG5xXCIsXCJwbnJcIixcInBuc1wiLFwicG50XCIsXCJwbnVcIixcInBudlwiLFwicG53XCIsXCJwbnhcIixcInBueVwiLFwicG56XCIsXCJwb2NcIixcInBvZFwiLFwicG9lXCIsXCJwb2ZcIixcInBvZ1wiLFwicG9oXCIsXCJwb2lcIixcInBva1wiLFwicG9tXCIsXCJwb25cIixcInBvb1wiLFwicG9wXCIsXCJwb3FcIixcInBvc1wiLFwicG90XCIsXCJwb3ZcIixcInBvd1wiLFwicG94XCIsXCJwb3lcIixcInBvelwiLFwicHBhXCIsXCJwcGVcIixcInBwaVwiLFwicHBrXCIsXCJwcGxcIixcInBwbVwiLFwicHBuXCIsXCJwcG9cIixcInBwcFwiLFwicHBxXCIsXCJwcHJcIixcInBwc1wiLFwicHB0XCIsXCJwcHVcIixcInBxYVwiLFwicHFlXCIsXCJwcW1cIixcInBxd1wiLFwicHJhXCIsXCJwcmJcIixcInByY1wiLFwicHJkXCIsXCJwcmVcIixcInByZlwiLFwicHJnXCIsXCJwcmhcIixcInByaVwiLFwicHJrXCIsXCJwcmxcIixcInBybVwiLFwicHJuXCIsXCJwcm9cIixcInBycFwiLFwicHJxXCIsXCJwcnJcIixcInByc1wiLFwicHJ0XCIsXCJwcnVcIixcInByd1wiLFwicHJ4XCIsXCJwcnlcIixcInByelwiLFwicHNhXCIsXCJwc2NcIixcInBzZFwiLFwicHNlXCIsXCJwc2dcIixcInBzaFwiLFwicHNpXCIsXCJwc2xcIixcInBzbVwiLFwicHNuXCIsXCJwc29cIixcInBzcFwiLFwicHNxXCIsXCJwc3JcIixcInBzc1wiLFwicHN0XCIsXCJwc3VcIixcInBzd1wiLFwicHN5XCIsXCJwdGFcIixcInB0aFwiLFwicHRpXCIsXCJwdG5cIixcInB0b1wiLFwicHRwXCIsXCJwdHFcIixcInB0clwiLFwicHR0XCIsXCJwdHVcIixcInB0dlwiLFwicHR3XCIsXCJwdHlcIixcInB1YVwiLFwicHViXCIsXCJwdWNcIixcInB1ZFwiLFwicHVlXCIsXCJwdWZcIixcInB1Z1wiLFwicHVpXCIsXCJwdWpcIixcInB1a1wiLFwicHVtXCIsXCJwdW9cIixcInB1cFwiLFwicHVxXCIsXCJwdXJcIixcInB1dFwiLFwicHV1XCIsXCJwdXdcIixcInB1eFwiLFwicHV5XCIsXCJwdXpcIixcInB3YVwiLFwicHdiXCIsXCJwd2dcIixcInB3aVwiLFwicHdtXCIsXCJwd25cIixcInB3b1wiLFwicHdyXCIsXCJwd3dcIixcInB4bVwiLFwicHllXCIsXCJweW1cIixcInB5blwiLFwicHlzXCIsXCJweXVcIixcInB5eFwiLFwicHl5XCIsXCJwem5cIl1cbixbIFwicXVcIixcInF1YVwiLFwicXViXCIsXCJxdWNcIixcInF1ZFwiLFwicXVmXCIsXCJxdWdcIixcInF1aFwiLFwicXVpXCIsXCJxdWtcIixcInF1bFwiLFwicXVtXCIsXCJxdW5cIixcInF1cFwiLFwicXVxXCIsXCJxdXJcIixcInF1c1wiLFwicXV2XCIsXCJxdXdcIixcInF1eFwiLFwicXV5XCIsXCJxdXpcIixcInF2YVwiLFwicXZjXCIsXCJxdmVcIixcInF2aFwiLFwicXZpXCIsXCJxdmpcIixcInF2bFwiLFwicXZtXCIsXCJxdm5cIixcInF2b1wiLFwicXZwXCIsXCJxdnNcIixcInF2d1wiLFwicXZ5XCIsXCJxdnpcIixcInF3YVwiLFwicXdjXCIsXCJxd2VcIixcInF3aFwiLFwicXdtXCIsXCJxd3NcIixcInF3dFwiLFwicXhhXCIsXCJxeGNcIixcInF4aFwiLFwicXhsXCIsXCJxeG5cIixcInF4b1wiLFwicXhwXCIsXCJxeHFcIixcInF4clwiLFwicXhzXCIsXCJxeHRcIixcInF4dVwiLFwicXh3XCIsXCJxeWFcIixcInF5cFwiXVxuLFsgXCJybVwiLFwicm5cIixcInJvXCIsXCJydVwiLFwicndcIixcInJhYVwiLFwicmFiXCIsXCJyYWNcIixcInJhZFwiLFwicmFmXCIsXCJyYWdcIixcInJhaFwiLFwicmFpXCIsXCJyYWpcIixcInJha1wiLFwicmFsXCIsXCJyYW1cIixcInJhblwiLFwicmFvXCIsXCJyYXBcIixcInJhcVwiLFwicmFyXCIsXCJyYXNcIixcInJhdFwiLFwicmF1XCIsXCJyYXZcIixcInJhd1wiLFwicmF4XCIsXCJyYXlcIixcInJhelwiLFwicmJiXCIsXCJyYmtcIixcInJibFwiLFwicmJwXCIsXCJyY2ZcIixcInJkYlwiLFwicmVhXCIsXCJyZWJcIixcInJlZVwiLFwicmVnXCIsXCJyZWlcIixcInJlalwiLFwicmVsXCIsXCJyZW1cIixcInJlblwiLFwicmVyXCIsXCJyZXNcIixcInJldFwiLFwicmV5XCIsXCJyZ2FcIixcInJnZVwiLFwicmdrXCIsXCJyZ25cIixcInJnclwiLFwicmdzXCIsXCJyZ3VcIixcInJoZ1wiLFwicmhwXCIsXCJyaWFcIixcInJpZVwiLFwicmlmXCIsXCJyaWxcIixcInJpbVwiLFwicmluXCIsXCJyaXJcIixcInJpdFwiLFwicml1XCIsXCJyamdcIixcInJqaVwiLFwicmpzXCIsXCJya2FcIixcInJrYlwiLFwicmtoXCIsXCJya2lcIixcInJrbVwiLFwicmt0XCIsXCJya3dcIixcInJtYVwiLFwicm1iXCIsXCJybWNcIixcInJtZFwiLFwicm1lXCIsXCJybWZcIixcInJtZ1wiLFwicm1oXCIsXCJybWlcIixcInJta1wiLFwicm1sXCIsXCJybW1cIixcInJtblwiLFwicm1vXCIsXCJybXBcIixcInJtcVwiLFwicm1yXCIsXCJybXNcIixcInJtdFwiLFwicm11XCIsXCJybXZcIixcInJtd1wiLFwicm14XCIsXCJybXlcIixcInJtelwiLFwicm5hXCIsXCJybmRcIixcInJuZ1wiLFwicm5sXCIsXCJybm5cIixcInJucFwiLFwicm5yXCIsXCJybndcIixcInJvYVwiLFwicm9iXCIsXCJyb2NcIixcInJvZFwiLFwicm9lXCIsXCJyb2ZcIixcInJvZ1wiLFwicm9sXCIsXCJyb21cIixcInJvb1wiLFwicm9wXCIsXCJyb3JcIixcInJvdVwiLFwicm93XCIsXCJycG5cIixcInJwdFwiLFwicnJpXCIsXCJycm9cIixcInJydFwiLFwicnNiXCIsXCJyc2lcIixcInJzbFwiLFwicnNtXCIsXCJydGNcIixcInJ0aFwiLFwicnRtXCIsXCJydHNcIixcInJ0d1wiLFwicnViXCIsXCJydWNcIixcInJ1ZVwiLFwicnVmXCIsXCJydWdcIixcInJ1aFwiLFwicnVpXCIsXCJydWtcIixcInJ1b1wiLFwicnVwXCIsXCJydXFcIixcInJ1dFwiLFwicnV1XCIsXCJydXlcIixcInJ1elwiLFwicndhXCIsXCJyd2tcIixcInJ3bFwiLFwicndtXCIsXCJyd29cIixcInJ3clwiLFwicnhkXCIsXCJyeHdcIixcInJ5blwiLFwicnlzXCIsXCJyeXVcIixcInJ6aFwiXVxuLFsgXCJzYVwiLFwic2NcIixcInNkXCIsXCJzZVwiLFwic2dcIixcInNoXCIsXCJzaVwiLFwic2tcIixcInNsXCIsXCJzbVwiLFwic25cIixcInNvXCIsXCJzcVwiLFwic3JcIixcInNzXCIsXCJzdFwiLFwic3VcIixcInN2XCIsXCJzd1wiLFwic2FhXCIsXCJzYWJcIixcInNhY1wiLFwic2FkXCIsXCJzYWVcIixcInNhZlwiLFwic2FoXCIsXCJzYWlcIixcInNhalwiLFwic2FrXCIsXCJzYWxcIixcInNhbVwiLFwic2FvXCIsXCJzYXBcIixcInNhcVwiLFwic2FyXCIsXCJzYXNcIixcInNhdFwiLFwic2F1XCIsXCJzYXZcIixcInNhd1wiLFwic2F4XCIsXCJzYXlcIixcInNhelwiLFwic2JhXCIsXCJzYmJcIixcInNiY1wiLFwic2JkXCIsXCJzYmVcIixcInNiZlwiLFwic2JnXCIsXCJzYmhcIixcInNiaVwiLFwic2JqXCIsXCJzYmtcIixcInNibFwiLFwic2JtXCIsXCJzYm5cIixcInNib1wiLFwic2JwXCIsXCJzYnFcIixcInNiclwiLFwic2JzXCIsXCJzYnRcIixcInNidVwiLFwic2J2XCIsXCJzYndcIixcInNieFwiLFwic2J5XCIsXCJzYnpcIixcInNjYVwiLFwic2NiXCIsXCJzY2VcIixcInNjZlwiLFwic2NnXCIsXCJzY2hcIixcInNjaVwiLFwic2NrXCIsXCJzY2xcIixcInNjblwiLFwic2NvXCIsXCJzY3BcIixcInNjcVwiLFwic2NzXCIsXCJzY3RcIixcInNjdVwiLFwic2N2XCIsXCJzY3dcIixcInNjeFwiLFwic2RhXCIsXCJzZGJcIixcInNkY1wiLFwic2RlXCIsXCJzZGZcIixcInNkZ1wiLFwic2RoXCIsXCJzZGpcIixcInNka1wiLFwic2RsXCIsXCJzZG1cIixcInNkblwiLFwic2RvXCIsXCJzZHBcIixcInNkcVwiLFwic2RyXCIsXCJzZHNcIixcInNkdFwiLFwic2R1XCIsXCJzZHZcIixcInNkeFwiLFwic2R6XCIsXCJzZWFcIixcInNlYlwiLFwic2VjXCIsXCJzZWRcIixcInNlZVwiLFwic2VmXCIsXCJzZWdcIixcInNlaFwiLFwic2VpXCIsXCJzZWpcIixcInNla1wiLFwic2VsXCIsXCJzZW1cIixcInNlblwiLFwic2VvXCIsXCJzZXBcIixcInNlcVwiLFwic2VyXCIsXCJzZXNcIixcInNldFwiLFwic2V1XCIsXCJzZXZcIixcInNld1wiLFwic2V5XCIsXCJzZXpcIixcInNmYlwiLFwic2ZlXCIsXCJzZm1cIixcInNmc1wiLFwic2Z3XCIsXCJzZ2FcIixcInNnYlwiLFwic2djXCIsXCJzZ2RcIixcInNnZVwiLFwic2dnXCIsXCJzZ2hcIixcInNnaVwiLFwic2dqXCIsXCJzZ2tcIixcInNnbFwiLFwic2dtXCIsXCJzZ25cIixcInNnb1wiLFwic2dwXCIsXCJzZ3JcIixcInNnc1wiLFwic2d0XCIsXCJzZ3VcIixcInNnd1wiLFwic2d4XCIsXCJzZ3lcIixcInNnelwiLFwic2hhXCIsXCJzaGJcIixcInNoY1wiLFwic2hkXCIsXCJzaGVcIixcInNoZ1wiLFwic2hoXCIsXCJzaGlcIixcInNoalwiLFwic2hrXCIsXCJzaGxcIixcInNobVwiLFwic2huXCIsXCJzaG9cIixcInNocFwiLFwic2hxXCIsXCJzaHJcIixcInNoc1wiLFwic2h0XCIsXCJzaHVcIixcInNodlwiLFwic2h3XCIsXCJzaHhcIixcInNoeVwiLFwic2h6XCIsXCJzaWFcIixcInNpYlwiLFwic2lkXCIsXCJzaWVcIixcInNpZlwiLFwic2lnXCIsXCJzaWhcIixcInNpaVwiLFwic2lqXCIsXCJzaWtcIixcInNpbFwiLFwic2ltXCIsXCJzaW9cIixcInNpcFwiLFwic2lxXCIsXCJzaXJcIixcInNpc1wiLFwic2l0XCIsXCJzaXVcIixcInNpdlwiLFwic2l3XCIsXCJzaXhcIixcInNpeVwiLFwic2l6XCIsXCJzamFcIixcInNqYlwiLFwic2pkXCIsXCJzamVcIixcInNqZ1wiLFwic2prXCIsXCJzamxcIixcInNqbVwiLFwic2puXCIsXCJzam9cIixcInNqcFwiLFwic2pyXCIsXCJzanNcIixcInNqdFwiLFwic2p1XCIsXCJzandcIixcInNrYVwiLFwic2tiXCIsXCJza2NcIixcInNrZFwiLFwic2tlXCIsXCJza2ZcIixcInNrZ1wiLFwic2toXCIsXCJza2lcIixcInNralwiLFwic2trXCIsXCJza21cIixcInNrblwiLFwic2tvXCIsXCJza3BcIixcInNrcVwiLFwic2tyXCIsXCJza3NcIixcInNrdFwiLFwic2t1XCIsXCJza3ZcIixcInNrd1wiLFwic2t4XCIsXCJza3lcIixcInNrelwiLFwic2xhXCIsXCJzbGNcIixcInNsZFwiLFwic2xlXCIsXCJzbGZcIixcInNsZ1wiLFwic2xoXCIsXCJzbGlcIixcInNsalwiLFwic2xsXCIsXCJzbG1cIixcInNsblwiLFwic2xwXCIsXCJzbHFcIixcInNsclwiLFwic2xzXCIsXCJzbHRcIixcInNsdVwiLFwic2x3XCIsXCJzbHhcIixcInNseVwiLFwic2x6XCIsXCJzbWFcIixcInNtYlwiLFwic21jXCIsXCJzbWRcIixcInNtZlwiLFwic21nXCIsXCJzbWhcIixcInNtaVwiLFwic21qXCIsXCJzbWtcIixcInNtbFwiLFwic21tXCIsXCJzbW5cIixcInNtcFwiLFwic21xXCIsXCJzbXJcIixcInNtc1wiLFwic210XCIsXCJzbXVcIixcInNtdlwiLFwic213XCIsXCJzbXhcIixcInNteVwiLFwic216XCIsXCJzbmJcIixcInNuY1wiLFwic25lXCIsXCJzbmZcIixcInNuZ1wiLFwic25oXCIsXCJzbmlcIixcInNualwiLFwic25rXCIsXCJzbmxcIixcInNubVwiLFwic25uXCIsXCJzbm9cIixcInNucFwiLFwic25xXCIsXCJzbnJcIixcInNuc1wiLFwic251XCIsXCJzbnZcIixcInNud1wiLFwic254XCIsXCJzbnlcIixcInNuelwiLFwic29hXCIsXCJzb2JcIixcInNvY1wiLFwic29kXCIsXCJzb2VcIixcInNvZ1wiLFwic29oXCIsXCJzb2lcIixcInNvalwiLFwic29rXCIsXCJzb2xcIixcInNvblwiLFwic29vXCIsXCJzb3BcIixcInNvcVwiLFwic29yXCIsXCJzb3NcIixcInNvdVwiLFwic292XCIsXCJzb3dcIixcInNveFwiLFwic295XCIsXCJzb3pcIixcInNwYlwiLFwic3BjXCIsXCJzcGRcIixcInNwZVwiLFwic3BnXCIsXCJzcGlcIixcInNwa1wiLFwic3BsXCIsXCJzcG1cIixcInNwblwiLFwic3BvXCIsXCJzcHBcIixcInNwcVwiLFwic3ByXCIsXCJzcHNcIixcInNwdFwiLFwic3B1XCIsXCJzcHZcIixcInNweFwiLFwic3B5XCIsXCJzcWFcIixcInNxaFwiLFwic3FqXCIsXCJzcWtcIixcInNxbVwiLFwic3FuXCIsXCJzcW9cIixcInNxcVwiLFwic3FyXCIsXCJzcXNcIixcInNxdFwiLFwic3F1XCIsXCJzcXhcIixcInNyYVwiLFwic3JiXCIsXCJzcmNcIixcInNyZVwiLFwic3JmXCIsXCJzcmdcIixcInNyaFwiLFwic3JpXCIsXCJzcmtcIixcInNybFwiLFwic3JtXCIsXCJzcm5cIixcInNyb1wiLFwic3JxXCIsXCJzcnJcIixcInNyc1wiLFwic3J0XCIsXCJzcnVcIixcInNydlwiLFwic3J3XCIsXCJzcnhcIixcInNyeVwiLFwic3J6XCIsXCJzc2FcIixcInNzYlwiLFwic3NjXCIsXCJzc2RcIixcInNzZVwiLFwic3NmXCIsXCJzc2dcIixcInNzaFwiLFwic3NpXCIsXCJzc2pcIixcInNza1wiLFwic3NsXCIsXCJzc21cIixcInNzblwiLFwic3NvXCIsXCJzc3BcIixcInNzcVwiLFwic3NyXCIsXCJzc3NcIixcInNzdFwiLFwic3N1XCIsXCJzc3ZcIixcInNzeFwiLFwic3N5XCIsXCJzc3pcIixcInN0YVwiLFwic3RiXCIsXCJzdGRcIixcInN0ZVwiLFwic3RmXCIsXCJzdGdcIixcInN0aFwiLFwic3RpXCIsXCJzdGpcIixcInN0a1wiLFwic3RsXCIsXCJzdG1cIixcInN0blwiLFwic3RvXCIsXCJzdHBcIixcInN0cVwiLFwic3RyXCIsXCJzdHNcIixcInN0dFwiLFwic3R1XCIsXCJzdHZcIixcInN0d1wiLFwic3R5XCIsXCJzdWFcIixcInN1YlwiLFwic3VjXCIsXCJzdWVcIixcInN1Z1wiLFwic3VpXCIsXCJzdWpcIixcInN1a1wiLFwic3VsXCIsXCJzdW1cIixcInN1b1wiLFwic3VxXCIsXCJzdXJcIixcInN1c1wiLFwic3V0XCIsXCJzdXZcIixcInN1d1wiLFwic3V4XCIsXCJzdXlcIixcInN1elwiLFwic3ZhXCIsXCJzdmJcIixcInN2Y1wiLFwic3ZlXCIsXCJzdmtcIixcInN2bVwiLFwic3ZyXCIsXCJzdnNcIixcInN2eFwiLFwic3diXCIsXCJzd2NcIixcInN3ZlwiLFwic3dnXCIsXCJzd2hcIixcInN3aVwiLFwic3dqXCIsXCJzd2tcIixcInN3bFwiLFwic3dtXCIsXCJzd25cIixcInN3b1wiLFwic3dwXCIsXCJzd3FcIixcInN3clwiLFwic3dzXCIsXCJzd3RcIixcInN3dVwiLFwic3d2XCIsXCJzd3dcIixcInN3eFwiLFwic3d5XCIsXCJzeGJcIixcInN4Y1wiLFwic3hlXCIsXCJzeGdcIixcInN4a1wiLFwic3hsXCIsXCJzeG1cIixcInN4blwiLFwic3hvXCIsXCJzeHJcIixcInN4c1wiLFwic3h1XCIsXCJzeHdcIixcInN5YVwiLFwic3liXCIsXCJzeWNcIixcInN5ZFwiLFwic3lpXCIsXCJzeWtcIixcInN5bFwiLFwic3ltXCIsXCJzeW5cIixcInN5b1wiLFwic3lyXCIsXCJzeXNcIixcInN5d1wiLFwic3l4XCIsXCJzeXlcIixcInN6YVwiLFwic3piXCIsXCJzemNcIixcInN6ZFwiLFwic3plXCIsXCJzemdcIixcInN6bFwiLFwic3puXCIsXCJzenBcIixcInN6c1wiLFwic3p2XCIsXCJzendcIixcInN6eVwiXVxuLFsgXCJ0YVwiLFwidGVcIixcInRnXCIsXCJ0aFwiLFwidGlcIixcInRrXCIsXCJ0bFwiLFwidG5cIixcInRvXCIsXCJ0clwiLFwidHNcIixcInR0XCIsXCJ0d1wiLFwidHlcIixcInRhYVwiLFwidGFiXCIsXCJ0YWNcIixcInRhZFwiLFwidGFlXCIsXCJ0YWZcIixcInRhZ1wiLFwidGFpXCIsXCJ0YWpcIixcInRha1wiLFwidGFsXCIsXCJ0YW5cIixcInRhb1wiLFwidGFwXCIsXCJ0YXFcIixcInRhclwiLFwidGFzXCIsXCJ0YXVcIixcInRhdlwiLFwidGF3XCIsXCJ0YXhcIixcInRheVwiLFwidGF6XCIsXCJ0YmFcIixcInRiYlwiLFwidGJjXCIsXCJ0YmRcIixcInRiZVwiLFwidGJmXCIsXCJ0YmdcIixcInRiaFwiLFwidGJpXCIsXCJ0YmpcIixcInRia1wiLFwidGJsXCIsXCJ0Ym1cIixcInRiblwiLFwidGJvXCIsXCJ0YnBcIixcInRicVwiLFwidGJyXCIsXCJ0YnNcIixcInRidFwiLFwidGJ1XCIsXCJ0YnZcIixcInRid1wiLFwidGJ4XCIsXCJ0YnlcIixcInRielwiLFwidGNhXCIsXCJ0Y2JcIixcInRjY1wiLFwidGNkXCIsXCJ0Y2VcIixcInRjZlwiLFwidGNnXCIsXCJ0Y2hcIixcInRjaVwiLFwidGNrXCIsXCJ0Y2xcIixcInRjbVwiLFwidGNuXCIsXCJ0Y29cIixcInRjcFwiLFwidGNxXCIsXCJ0Y3NcIixcInRjdFwiLFwidGN1XCIsXCJ0Y3dcIixcInRjeFwiLFwidGN5XCIsXCJ0Y3pcIixcInRkYVwiLFwidGRiXCIsXCJ0ZGNcIixcInRkZFwiLFwidGRlXCIsXCJ0ZGZcIixcInRkZ1wiLFwidGRoXCIsXCJ0ZGlcIixcInRkalwiLFwidGRrXCIsXCJ0ZGxcIixcInRkbVwiLFwidGRuXCIsXCJ0ZG9cIixcInRkcVwiLFwidGRyXCIsXCJ0ZHNcIixcInRkdFwiLFwidGR1XCIsXCJ0ZHZcIixcInRkeFwiLFwidGR5XCIsXCJ0ZWFcIixcInRlYlwiLFwidGVjXCIsXCJ0ZWRcIixcInRlZVwiLFwidGVmXCIsXCJ0ZWdcIixcInRlaFwiLFwidGVpXCIsXCJ0ZWtcIixcInRlbVwiLFwidGVuXCIsXCJ0ZW9cIixcInRlcFwiLFwidGVxXCIsXCJ0ZXJcIixcInRlc1wiLFwidGV0XCIsXCJ0ZXVcIixcInRldlwiLFwidGV3XCIsXCJ0ZXhcIixcInRleVwiLFwidGV6XCIsXCJ0ZmlcIixcInRmblwiLFwidGZvXCIsXCJ0ZnJcIixcInRmdFwiLFwidGdhXCIsXCJ0Z2JcIixcInRnY1wiLFwidGdkXCIsXCJ0Z2VcIixcInRnZlwiLFwidGdnXCIsXCJ0Z2hcIixcInRnaVwiLFwidGdqXCIsXCJ0Z25cIixcInRnb1wiLFwidGdwXCIsXCJ0Z3FcIixcInRnclwiLFwidGdzXCIsXCJ0Z3RcIixcInRndVwiLFwidGd2XCIsXCJ0Z3dcIixcInRneFwiLFwidGd5XCIsXCJ0Z3pcIixcInRoY1wiLFwidGhkXCIsXCJ0aGVcIixcInRoZlwiLFwidGhoXCIsXCJ0aGlcIixcInRoa1wiLFwidGhsXCIsXCJ0aG1cIixcInRoblwiLFwidGhwXCIsXCJ0aHFcIixcInRoclwiLFwidGhzXCIsXCJ0aHRcIixcInRodVwiLFwidGh2XCIsXCJ0aHdcIixcInRoeFwiLFwidGh5XCIsXCJ0aHpcIixcInRpYVwiLFwidGljXCIsXCJ0aWRcIixcInRpZVwiLFwidGlmXCIsXCJ0aWdcIixcInRpaFwiLFwidGlpXCIsXCJ0aWpcIixcInRpa1wiLFwidGlsXCIsXCJ0aW1cIixcInRpblwiLFwidGlvXCIsXCJ0aXBcIixcInRpcVwiLFwidGlzXCIsXCJ0aXRcIixcInRpdVwiLFwidGl2XCIsXCJ0aXdcIixcInRpeFwiLFwidGl5XCIsXCJ0aXpcIixcInRqYVwiLFwidGpnXCIsXCJ0amlcIixcInRqalwiLFwidGpsXCIsXCJ0am1cIixcInRqblwiLFwidGpvXCIsXCJ0anBcIixcInRqc1wiLFwidGp1XCIsXCJ0andcIixcInRrYVwiLFwidGtiXCIsXCJ0a2RcIixcInRrZVwiLFwidGtmXCIsXCJ0a2dcIixcInRra1wiLFwidGtsXCIsXCJ0a21cIixcInRrblwiLFwidGtwXCIsXCJ0a3FcIixcInRrclwiLFwidGtzXCIsXCJ0a3RcIixcInRrdVwiLFwidGt2XCIsXCJ0a3dcIixcInRreFwiLFwidGt6XCIsXCJ0bGFcIixcInRsYlwiLFwidGxjXCIsXCJ0bGRcIixcInRsZlwiLFwidGxnXCIsXCJ0bGhcIixcInRsaVwiLFwidGxqXCIsXCJ0bGtcIixcInRsbFwiLFwidGxtXCIsXCJ0bG5cIixcInRsb1wiLFwidGxwXCIsXCJ0bHFcIixcInRsclwiLFwidGxzXCIsXCJ0bHRcIixcInRsdVwiLFwidGx2XCIsXCJ0bHdcIixcInRseFwiLFwidGx5XCIsXCJ0bWFcIixcInRtYlwiLFwidG1jXCIsXCJ0bWRcIixcInRtZVwiLFwidG1mXCIsXCJ0bWdcIixcInRtaFwiLFwidG1pXCIsXCJ0bWpcIixcInRta1wiLFwidG1sXCIsXCJ0bW1cIixcInRtblwiLFwidG1vXCIsXCJ0bXBcIixcInRtcVwiLFwidG1yXCIsXCJ0bXNcIixcInRtdFwiLFwidG11XCIsXCJ0bXZcIixcInRtd1wiLFwidG15XCIsXCJ0bXpcIixcInRuYVwiLFwidG5iXCIsXCJ0bmNcIixcInRuZFwiLFwidG5lXCIsXCJ0bmZcIixcInRuZ1wiLFwidG5oXCIsXCJ0bmlcIixcInRua1wiLFwidG5sXCIsXCJ0bm1cIixcInRublwiLFwidG5vXCIsXCJ0bnBcIixcInRucVwiLFwidG5yXCIsXCJ0bnNcIixcInRudFwiLFwidG51XCIsXCJ0bnZcIixcInRud1wiLFwidG54XCIsXCJ0bnlcIixcInRuelwiLFwidG9iXCIsXCJ0b2NcIixcInRvZFwiLFwidG9lXCIsXCJ0b2ZcIixcInRvZ1wiLFwidG9oXCIsXCJ0b2lcIixcInRvalwiLFwidG9sXCIsXCJ0b21cIixcInRvb1wiLFwidG9wXCIsXCJ0b3FcIixcInRvclwiLFwidG9zXCIsXCJ0b3VcIixcInRvdlwiLFwidG93XCIsXCJ0b3hcIixcInRveVwiLFwidG96XCIsXCJ0cGFcIixcInRwY1wiLFwidHBlXCIsXCJ0cGZcIixcInRwZ1wiLFwidHBpXCIsXCJ0cGpcIixcInRwa1wiLFwidHBsXCIsXCJ0cG1cIixcInRwblwiLFwidHBvXCIsXCJ0cHBcIixcInRwcVwiLFwidHByXCIsXCJ0cHRcIixcInRwdVwiLFwidHB2XCIsXCJ0cHdcIixcInRweFwiLFwidHB5XCIsXCJ0cHpcIixcInRxYlwiLFwidHFsXCIsXCJ0cW1cIixcInRxblwiLFwidHFvXCIsXCJ0cXBcIixcInRxcVwiLFwidHFyXCIsXCJ0cXRcIixcInRxdVwiLFwidHF3XCIsXCJ0cmFcIixcInRyYlwiLFwidHJjXCIsXCJ0cmRcIixcInRyZVwiLFwidHJmXCIsXCJ0cmdcIixcInRyaFwiLFwidHJpXCIsXCJ0cmpcIixcInRya1wiLFwidHJsXCIsXCJ0cm1cIixcInRyblwiLFwidHJvXCIsXCJ0cnBcIixcInRycVwiLFwidHJyXCIsXCJ0cnNcIixcInRydFwiLFwidHJ1XCIsXCJ0cnZcIixcInRyd1wiLFwidHJ4XCIsXCJ0cnlcIixcInRyelwiLFwidHNhXCIsXCJ0c2JcIixcInRzY1wiLFwidHNkXCIsXCJ0c2VcIixcInRzZlwiLFwidHNnXCIsXCJ0c2hcIixcInRzaVwiLFwidHNqXCIsXCJ0c2tcIixcInRzbFwiLFwidHNtXCIsXCJ0c3BcIixcInRzcVwiLFwidHNyXCIsXCJ0c3NcIixcInRzdFwiLFwidHN1XCIsXCJ0c3ZcIixcInRzd1wiLFwidHN4XCIsXCJ0c3lcIixcInRzelwiLFwidHRhXCIsXCJ0dGJcIixcInR0Y1wiLFwidHRkXCIsXCJ0dGVcIixcInR0ZlwiLFwidHRnXCIsXCJ0dGhcIixcInR0aVwiLFwidHRqXCIsXCJ0dGtcIixcInR0bFwiLFwidHRtXCIsXCJ0dG5cIixcInR0b1wiLFwidHRwXCIsXCJ0dHFcIixcInR0clwiLFwidHRzXCIsXCJ0dHRcIixcInR0dVwiLFwidHR2XCIsXCJ0dHdcIixcInR0eVwiLFwidHR6XCIsXCJ0dWFcIixcInR1YlwiLFwidHVjXCIsXCJ0dWRcIixcInR1ZVwiLFwidHVmXCIsXCJ0dWdcIixcInR1aFwiLFwidHVpXCIsXCJ0dWpcIixcInR1bFwiLFwidHVtXCIsXCJ0dW5cIixcInR1b1wiLFwidHVwXCIsXCJ0dXFcIixcInR1c1wiLFwidHV0XCIsXCJ0dXVcIixcInR1dlwiLFwidHV3XCIsXCJ0dXhcIixcInR1eVwiLFwidHV6XCIsXCJ0dmFcIixcInR2ZFwiLFwidHZlXCIsXCJ0dmtcIixcInR2bFwiLFwidHZtXCIsXCJ0dm5cIixcInR2b1wiLFwidHZzXCIsXCJ0dnRcIixcInR2dVwiLFwidHZ3XCIsXCJ0dnhcIixcInR2eVwiLFwidHdhXCIsXCJ0d2JcIixcInR3Y1wiLFwidHdkXCIsXCJ0d2VcIixcInR3ZlwiLFwidHdnXCIsXCJ0d2hcIixcInR3bFwiLFwidHdtXCIsXCJ0d25cIixcInR3b1wiLFwidHdwXCIsXCJ0d3FcIixcInR3clwiLFwidHd0XCIsXCJ0d3VcIixcInR3d1wiLFwidHd4XCIsXCJ0d3lcIixcInR4YVwiLFwidHhiXCIsXCJ0eGNcIixcInR4ZVwiLFwidHhnXCIsXCJ0eGhcIixcInR4aVwiLFwidHhqXCIsXCJ0eG1cIixcInR4blwiLFwidHhvXCIsXCJ0eHFcIixcInR4clwiLFwidHhzXCIsXCJ0eHRcIixcInR4dVwiLFwidHh4XCIsXCJ0eHlcIixcInR5YVwiLFwidHllXCIsXCJ0eWhcIixcInR5aVwiLFwidHlqXCIsXCJ0eWxcIixcInR5blwiLFwidHlwXCIsXCJ0eXJcIixcInR5c1wiLFwidHl0XCIsXCJ0eXVcIixcInR5dlwiLFwidHl4XCIsXCJ0eXlcIixcInR5elwiLFwidHphXCIsXCJ0emhcIixcInR6alwiLFwidHpsXCIsXCJ0em1cIixcInR6blwiLFwidHpvXCIsXCJ0enhcIl1cbixbIFwidWdcIixcInVrXCIsXCJ1clwiLFwidXpcIixcInVhbVwiLFwidWFuXCIsXCJ1YXJcIixcInViYVwiLFwidWJpXCIsXCJ1YmxcIixcInViclwiLFwidWJ1XCIsXCJ1YnlcIixcInVkYVwiLFwidWRlXCIsXCJ1ZGdcIixcInVkaVwiLFwidWRqXCIsXCJ1ZGxcIixcInVkbVwiLFwidWR1XCIsXCJ1ZXNcIixcInVmaVwiLFwidWdhXCIsXCJ1Z2JcIixcInVnZVwiLFwidWduXCIsXCJ1Z29cIixcInVneVwiLFwidWhhXCIsXCJ1aG5cIixcInVpc1wiLFwidWl2XCIsXCJ1amlcIixcInVrYVwiLFwidWtnXCIsXCJ1a2hcIixcInVraVwiLFwidWtrXCIsXCJ1a2xcIixcInVrcFwiLFwidWtxXCIsXCJ1a3NcIixcInVrdVwiLFwidWt2XCIsXCJ1a3dcIixcInVreVwiLFwidWxhXCIsXCJ1bGJcIixcInVsY1wiLFwidWxlXCIsXCJ1bGZcIixcInVsaVwiLFwidWxrXCIsXCJ1bGxcIixcInVsbVwiLFwidWxuXCIsXCJ1bHVcIixcInVsd1wiLFwidW1hXCIsXCJ1bWJcIixcInVtY1wiLFwidW1kXCIsXCJ1bWdcIixcInVtaVwiLFwidW1tXCIsXCJ1bW5cIixcInVtb1wiLFwidW1wXCIsXCJ1bXJcIixcInVtc1wiLFwidW11XCIsXCJ1bmFcIixcInVuZFwiLFwidW5lXCIsXCJ1bmdcIixcInVuaVwiLFwidW5rXCIsXCJ1bm1cIixcInVublwiLFwidW5wXCIsXCJ1bnJcIixcInVudVwiLFwidW54XCIsXCJ1bnpcIixcInVva1wiLFwidXBpXCIsXCJ1cHZcIixcInVyYVwiLFwidXJiXCIsXCJ1cmNcIixcInVyZVwiLFwidXJmXCIsXCJ1cmdcIixcInVyaFwiLFwidXJpXCIsXCJ1cmpcIixcInVya1wiLFwidXJsXCIsXCJ1cm1cIixcInVyblwiLFwidXJvXCIsXCJ1cnBcIixcInVyclwiLFwidXJ0XCIsXCJ1cnVcIixcInVydlwiLFwidXJ3XCIsXCJ1cnhcIixcInVyeVwiLFwidXJ6XCIsXCJ1c2FcIixcInVzaFwiLFwidXNpXCIsXCJ1c2tcIixcInVzcFwiLFwidXNzXCIsXCJ1c3VcIixcInV0YVwiLFwidXRlXCIsXCJ1dGhcIixcInV0cFwiLFwidXRyXCIsXCJ1dHVcIixcInV1bVwiLFwidXVuXCIsXCJ1dXJcIixcInV1dVwiLFwidXZlXCIsXCJ1dmhcIixcInV2bFwiLFwidXdhXCIsXCJ1eWFcIixcInV6blwiLFwidXpzXCJdXG4sWyBcInZlXCIsXCJ2aVwiLFwidm9cIixcInZhYVwiLFwidmFlXCIsXCJ2YWZcIixcInZhZ1wiLFwidmFoXCIsXCJ2YWlcIixcInZhalwiLFwidmFsXCIsXCJ2YW1cIixcInZhblwiLFwidmFvXCIsXCJ2YXBcIixcInZhclwiLFwidmFzXCIsXCJ2YXVcIixcInZhdlwiLFwidmF5XCIsXCJ2YmJcIixcInZia1wiLFwidmVjXCIsXCJ2ZWRcIixcInZlbFwiLFwidmVtXCIsXCJ2ZW9cIixcInZlcFwiLFwidmVyXCIsXCJ2Z3JcIixcInZndFwiLFwidmljXCIsXCJ2aWRcIixcInZpZlwiLFwidmlnXCIsXCJ2aWxcIixcInZpblwiLFwidmlzXCIsXCJ2aXRcIixcInZpdlwiLFwidmthXCIsXCJ2a2lcIixcInZralwiLFwidmtrXCIsXCJ2a2xcIixcInZrbVwiLFwidmtuXCIsXCJ2a29cIixcInZrcFwiLFwidmt0XCIsXCJ2a3VcIixcInZrelwiLFwidmxwXCIsXCJ2bHNcIixcInZtYVwiLFwidm1iXCIsXCJ2bWNcIixcInZtZFwiLFwidm1lXCIsXCJ2bWZcIixcInZtZ1wiLFwidm1oXCIsXCJ2bWlcIixcInZtalwiLFwidm1rXCIsXCJ2bWxcIixcInZtbVwiLFwidm1wXCIsXCJ2bXFcIixcInZtclwiLFwidm1zXCIsXCJ2bXVcIixcInZtdlwiLFwidm13XCIsXCJ2bXhcIixcInZteVwiLFwidm16XCIsXCJ2bmtcIixcInZubVwiLFwidm5wXCIsXCJ2b3JcIixcInZvdFwiLFwidnJhXCIsXCJ2cm9cIixcInZyc1wiLFwidnJ0XCIsXCJ2c2lcIixcInZzbFwiLFwidnN2XCIsXCJ2dG9cIixcInZ1bVwiLFwidnVuXCIsXCJ2dXRcIixcInZ3YVwiXVxuLFsgXCJ3YVwiLFwid29cIixcIndhYVwiLFwid2FiXCIsXCJ3YWNcIixcIndhZFwiLFwid2FlXCIsXCJ3YWZcIixcIndhZ1wiLFwid2FoXCIsXCJ3YWlcIixcIndhalwiLFwid2FrXCIsXCJ3YWxcIixcIndhbVwiLFwid2FuXCIsXCJ3YW9cIixcIndhcFwiLFwid2FxXCIsXCJ3YXJcIixcIndhc1wiLFwid2F0XCIsXCJ3YXVcIixcIndhdlwiLFwid2F3XCIsXCJ3YXhcIixcIndheVwiLFwid2F6XCIsXCJ3YmFcIixcIndiYlwiLFwid2JlXCIsXCJ3YmZcIixcIndiaFwiLFwid2JpXCIsXCJ3YmpcIixcIndia1wiLFwid2JsXCIsXCJ3Ym1cIixcIndicFwiLFwid2JxXCIsXCJ3YnJcIixcIndic1wiLFwid2J0XCIsXCJ3YnZcIixcIndid1wiLFwid2NhXCIsXCJ3Y2lcIixcIndkZFwiLFwid2RnXCIsXCJ3ZGpcIixcIndka1wiLFwid2R1XCIsXCJ3ZHlcIixcIndlYVwiLFwid2VjXCIsXCJ3ZWRcIixcIndlZ1wiLFwid2VoXCIsXCJ3ZWlcIixcIndlbVwiLFwid2VuXCIsXCJ3ZW9cIixcIndlcFwiLFwid2VyXCIsXCJ3ZXNcIixcIndldFwiLFwid2V1XCIsXCJ3ZXdcIixcIndmZ1wiLFwid2dhXCIsXCJ3Z2JcIixcIndnZ1wiLFwid2dpXCIsXCJ3Z29cIixcIndndVwiLFwid2d3XCIsXCJ3Z3lcIixcIndoYVwiLFwid2hnXCIsXCJ3aGtcIixcIndodVwiLFwid2liXCIsXCJ3aWNcIixcIndpZVwiLFwid2lmXCIsXCJ3aWdcIixcIndpaFwiLFwid2lpXCIsXCJ3aWpcIixcIndpa1wiLFwid2lsXCIsXCJ3aW1cIixcIndpblwiLFwid2lyXCIsXCJ3aXRcIixcIndpdVwiLFwid2l2XCIsXCJ3aXdcIixcIndpeVwiLFwid2phXCIsXCJ3amlcIixcIndrYVwiLFwid2tiXCIsXCJ3a2RcIixcIndrbFwiLFwid2tyXCIsXCJ3a3VcIixcIndrd1wiLFwid2t5XCIsXCJ3bGFcIixcIndsY1wiLFwid2xlXCIsXCJ3bGdcIixcIndsaFwiLFwid2xpXCIsXCJ3bGtcIixcIndsbFwiLFwid2xtXCIsXCJ3bG9cIixcIndsclwiLFwid2xzXCIsXCJ3bHVcIixcIndsdlwiLFwid2x3XCIsXCJ3bHhcIixcIndseVwiLFwid21hXCIsXCJ3bWJcIixcIndtY1wiLFwid21kXCIsXCJ3bWVcIixcIndtZ1wiLFwid21oXCIsXCJ3bWlcIixcIndtbVwiLFwid21uXCIsXCJ3bW9cIixcIndtc1wiLFwid210XCIsXCJ3bXdcIixcIndteFwiLFwid25iXCIsXCJ3bmNcIixcInduZFwiLFwid25lXCIsXCJ3bmdcIixcInduaVwiLFwid25rXCIsXCJ3bm1cIixcIndublwiLFwid25vXCIsXCJ3bnBcIixcIndudVwiLFwid253XCIsXCJ3bnlcIixcIndvYVwiLFwid29iXCIsXCJ3b2NcIixcIndvZFwiLFwid29lXCIsXCJ3b2ZcIixcIndvZ1wiLFwid29pXCIsXCJ3b2tcIixcIndvbVwiLFwid29uXCIsXCJ3b29cIixcIndvclwiLFwid29zXCIsXCJ3b3dcIixcIndveVwiLFwid3BjXCIsXCJ3cmFcIixcIndyYlwiLFwid3JkXCIsXCJ3cmdcIixcIndyaFwiLFwid3JpXCIsXCJ3cmtcIixcIndybFwiLFwid3JtXCIsXCJ3cm5cIixcIndyb1wiLFwid3JwXCIsXCJ3cnJcIixcIndyc1wiLFwid3J1XCIsXCJ3cnZcIixcIndyd1wiLFwid3J4XCIsXCJ3cnlcIixcIndyelwiLFwid3NhXCIsXCJ3c2dcIixcIndzaVwiLFwid3NrXCIsXCJ3c3JcIixcIndzc1wiLFwid3N1XCIsXCJ3c3ZcIixcInd0ZlwiLFwid3RoXCIsXCJ3dGlcIixcInd0a1wiLFwid3RtXCIsXCJ3dHdcIixcInd1YVwiLFwid3ViXCIsXCJ3dWRcIixcInd1aFwiLFwid3VsXCIsXCJ3dW1cIixcInd1blwiLFwid3VyXCIsXCJ3dXRcIixcInd1dVwiLFwid3V2XCIsXCJ3dXhcIixcInd1eVwiLFwid3dhXCIsXCJ3d2JcIixcInd3b1wiLFwid3dyXCIsXCJ3d3dcIixcInd4YVwiLFwid3h3XCIsXCJ3eWFcIixcInd5YlwiLFwid3lpXCIsXCJ3eW1cIixcInd5clwiLFwid3l5XCJdXG4sWyBcInhoXCIsXCJ4YWFcIixcInhhYlwiLFwieGFjXCIsXCJ4YWRcIixcInhhZVwiLFwieGFnXCIsXCJ4YWlcIixcInhhalwiLFwieGFrXCIsXCJ4YWxcIixcInhhbVwiLFwieGFuXCIsXCJ4YW9cIixcInhhcFwiLFwieGFxXCIsXCJ4YXJcIixcInhhc1wiLFwieGF0XCIsXCJ4YXVcIixcInhhdlwiLFwieGF3XCIsXCJ4YXlcIixcInhiYVwiLFwieGJiXCIsXCJ4YmNcIixcInhiZFwiLFwieGJlXCIsXCJ4YmdcIixcInhiaVwiLFwieGJqXCIsXCJ4Ym1cIixcInhiblwiLFwieGJvXCIsXCJ4YnBcIixcInhiclwiLFwieGJ3XCIsXCJ4YnhcIixcInhieVwiLFwieGNiXCIsXCJ4Y2NcIixcInhjZVwiLFwieGNnXCIsXCJ4Y2hcIixcInhjbFwiLFwieGNtXCIsXCJ4Y25cIixcInhjb1wiLFwieGNyXCIsXCJ4Y3RcIixcInhjdVwiLFwieGN2XCIsXCJ4Y3dcIixcInhjeVwiLFwieGRhXCIsXCJ4ZGNcIixcInhka1wiLFwieGRtXCIsXCJ4ZG9cIixcInhkeVwiLFwieGViXCIsXCJ4ZWRcIixcInhlZ1wiLFwieGVsXCIsXCJ4ZW1cIixcInhlcFwiLFwieGVyXCIsXCJ4ZXNcIixcInhldFwiLFwieGV1XCIsXCJ4ZmFcIixcInhnYVwiLFwieGdiXCIsXCJ4Z2RcIixcInhnZlwiLFwieGdnXCIsXCJ4Z2lcIixcInhnbFwiLFwieGdtXCIsXCJ4Z25cIixcInhnclwiLFwieGd1XCIsXCJ4Z3dcIixcInhoYVwiLFwieGhjXCIsXCJ4aGRcIixcInhoZVwiLFwieGhyXCIsXCJ4aHRcIixcInhodVwiLFwieGh2XCIsXCJ4aWFcIixcInhpYlwiLFwieGlpXCIsXCJ4aWxcIixcInhpblwiLFwieGlwXCIsXCJ4aXJcIixcInhpc1wiLFwieGl2XCIsXCJ4aXlcIixcInhqYlwiLFwieGp0XCIsXCJ4a2FcIixcInhrYlwiLFwieGtjXCIsXCJ4a2RcIixcInhrZVwiLFwieGtmXCIsXCJ4a2dcIixcInhraFwiLFwieGtpXCIsXCJ4a2pcIixcInhra1wiLFwieGtsXCIsXCJ4a25cIixcInhrb1wiLFwieGtwXCIsXCJ4a3FcIixcInhrclwiLFwieGtzXCIsXCJ4a3RcIixcInhrdVwiLFwieGt2XCIsXCJ4a3dcIixcInhreFwiLFwieGt5XCIsXCJ4a3pcIixcInhsYVwiLFwieGxiXCIsXCJ4bGNcIixcInhsZFwiLFwieGxlXCIsXCJ4bGdcIixcInhsaVwiLFwieGxuXCIsXCJ4bG9cIixcInhscFwiLFwieGxzXCIsXCJ4bHVcIixcInhseVwiLFwieG1hXCIsXCJ4bWJcIixcInhtY1wiLFwieG1kXCIsXCJ4bWVcIixcInhtZlwiLFwieG1nXCIsXCJ4bWhcIixcInhtalwiLFwieG1rXCIsXCJ4bWxcIixcInhtbVwiLFwieG1uXCIsXCJ4bW9cIixcInhtcFwiLFwieG1xXCIsXCJ4bXJcIixcInhtc1wiLFwieG10XCIsXCJ4bXVcIixcInhtdlwiLFwieG13XCIsXCJ4bXhcIixcInhteVwiLFwieG16XCIsXCJ4bmFcIixcInhuYlwiLFwieG5kXCIsXCJ4bmdcIixcInhuaFwiLFwieG5pXCIsXCJ4bmpcIixcInhua1wiLFwieG5tXCIsXCJ4bm5cIixcInhub1wiLFwieG5xXCIsXCJ4bnJcIixcInhuc1wiLFwieG50XCIsXCJ4bnVcIixcInhueVwiLFwieG56XCIsXCJ4b2NcIixcInhvZFwiLFwieG9nXCIsXCJ4b2lcIixcInhva1wiLFwieG9tXCIsXCJ4b25cIixcInhvb1wiLFwieG9wXCIsXCJ4b3JcIixcInhvd1wiLFwieHBhXCIsXCJ4cGJcIixcInhwY1wiLFwieHBkXCIsXCJ4cGVcIixcInhwZlwiLFwieHBnXCIsXCJ4cGhcIixcInhwaVwiLFwieHBqXCIsXCJ4cGtcIixcInhwbFwiLFwieHBtXCIsXCJ4cG5cIixcInhwb1wiLFwieHBwXCIsXCJ4cHFcIixcInhwclwiLFwieHBzXCIsXCJ4cHRcIixcInhwdVwiLFwieHB2XCIsXCJ4cHdcIixcInhweFwiLFwieHB5XCIsXCJ4cHpcIixcInhxYVwiLFwieHF0XCIsXCJ4cmFcIixcInhyYlwiLFwieHJkXCIsXCJ4cmVcIixcInhyZ1wiLFwieHJpXCIsXCJ4cm1cIixcInhyblwiLFwieHJxXCIsXCJ4cnJcIixcInhydFwiLFwieHJ1XCIsXCJ4cndcIixcInhzYVwiLFwieHNiXCIsXCJ4c2NcIixcInhzZFwiLFwieHNlXCIsXCJ4c2hcIixcInhzaVwiLFwieHNqXCIsXCJ4c2xcIixcInhzbVwiLFwieHNuXCIsXCJ4c29cIixcInhzcFwiLFwieHNxXCIsXCJ4c3JcIixcInhzc1wiLFwieHN1XCIsXCJ4c3ZcIixcInhzeVwiLFwieHRhXCIsXCJ4dGJcIixcInh0Y1wiLFwieHRkXCIsXCJ4dGVcIixcInh0Z1wiLFwieHRoXCIsXCJ4dGlcIixcInh0alwiLFwieHRsXCIsXCJ4dG1cIixcInh0blwiLFwieHRvXCIsXCJ4dHBcIixcInh0cVwiLFwieHRyXCIsXCJ4dHNcIixcInh0dFwiLFwieHR1XCIsXCJ4dHZcIixcInh0d1wiLFwieHR5XCIsXCJ4dHpcIixcInh1YVwiLFwieHViXCIsXCJ4dWRcIixcInh1Z1wiLFwieHVqXCIsXCJ4dWxcIixcInh1bVwiLFwieHVuXCIsXCJ4dW9cIixcInh1cFwiLFwieHVyXCIsXCJ4dXRcIixcInh1dVwiLFwieHZlXCIsXCJ4dmlcIixcInh2blwiLFwieHZvXCIsXCJ4dnNcIixcInh3YVwiLFwieHdjXCIsXCJ4d2RcIixcInh3ZVwiLFwieHdnXCIsXCJ4d2pcIixcInh3a1wiLFwieHdsXCIsXCJ4d29cIixcInh3clwiLFwieHd0XCIsXCJ4d3dcIixcInh4YlwiLFwieHhrXCIsXCJ4eG1cIixcInh4clwiLFwieHh0XCIsXCJ4eWFcIixcInh5YlwiLFwieHlqXCIsXCJ4eWtcIixcInh5bFwiLFwieHl0XCIsXCJ4eXlcIixcInh6aFwiLFwieHptXCIsXCJ4enBcIl1cbixbIFwieWlcIixcInlvXCIsXCJ5YWFcIixcInlhYlwiLFwieWFjXCIsXCJ5YWRcIixcInlhZVwiLFwieWFmXCIsXCJ5YWdcIixcInlhaFwiLFwieWFpXCIsXCJ5YWpcIixcInlha1wiLFwieWFsXCIsXCJ5YW1cIixcInlhblwiLFwieWFvXCIsXCJ5YXBcIixcInlhcVwiLFwieWFyXCIsXCJ5YXNcIixcInlhdFwiLFwieWF1XCIsXCJ5YXZcIixcInlhd1wiLFwieWF4XCIsXCJ5YXlcIixcInlhelwiLFwieWJhXCIsXCJ5YmJcIixcInliZFwiLFwieWJlXCIsXCJ5YmhcIixcInliaVwiLFwieWJqXCIsXCJ5YmtcIixcInlibFwiLFwieWJtXCIsXCJ5Ym5cIixcInlib1wiLFwieWJ4XCIsXCJ5YnlcIixcInljaFwiLFwieWNsXCIsXCJ5Y25cIixcInljcFwiLFwieWRhXCIsXCJ5ZGRcIixcInlkZVwiLFwieWRnXCIsXCJ5ZGtcIixcInlkc1wiLFwieWVhXCIsXCJ5ZWNcIixcInllZVwiLFwieWVpXCIsXCJ5ZWpcIixcInllbFwiLFwieWVuXCIsXCJ5ZXJcIixcInllc1wiLFwieWV0XCIsXCJ5ZXVcIixcInlldlwiLFwieWV5XCIsXCJ5Z2FcIixcInlnaVwiLFwieWdsXCIsXCJ5Z21cIixcInlncFwiLFwieWdyXCIsXCJ5Z3NcIixcInlndVwiLFwieWd3XCIsXCJ5aGFcIixcInloZFwiLFwieWhsXCIsXCJ5aHNcIixcInlpYVwiLFwieWlmXCIsXCJ5aWdcIixcInlpaFwiLFwieWlpXCIsXCJ5aWpcIixcInlpa1wiLFwieWlsXCIsXCJ5aW1cIixcInlpblwiLFwieWlwXCIsXCJ5aXFcIixcInlpclwiLFwieWlzXCIsXCJ5aXRcIixcInlpdVwiLFwieWl2XCIsXCJ5aXhcIixcInlpeVwiLFwieWl6XCIsXCJ5a2FcIixcInlrZ1wiLFwieWtpXCIsXCJ5a2tcIixcInlrbFwiLFwieWttXCIsXCJ5a25cIixcInlrb1wiLFwieWtyXCIsXCJ5a3RcIixcInlrdVwiLFwieWt5XCIsXCJ5bGFcIixcInlsYlwiLFwieWxlXCIsXCJ5bGdcIixcInlsaVwiLFwieWxsXCIsXCJ5bG1cIixcInlsblwiLFwieWxvXCIsXCJ5bHJcIixcInlsdVwiLFwieWx5XCIsXCJ5bWFcIixcInltYlwiLFwieW1jXCIsXCJ5bWRcIixcInltZVwiLFwieW1nXCIsXCJ5bWhcIixcInltaVwiLFwieW1rXCIsXCJ5bWxcIixcInltbVwiLFwieW1uXCIsXCJ5bW9cIixcInltcFwiLFwieW1xXCIsXCJ5bXJcIixcInltc1wiLFwieW10XCIsXCJ5bXhcIixcInltelwiLFwieW5hXCIsXCJ5bmRcIixcInluZVwiLFwieW5nXCIsXCJ5bmhcIixcInlua1wiLFwieW5sXCIsXCJ5bm5cIixcInlub1wiLFwieW5xXCIsXCJ5bnNcIixcInludVwiLFwieW9iXCIsXCJ5b2dcIixcInlvaVwiLFwieW9rXCIsXCJ5b2xcIixcInlvbVwiLFwieW9uXCIsXCJ5b3NcIixcInlvdFwiLFwieW94XCIsXCJ5b3lcIixcInlwYVwiLFwieXBiXCIsXCJ5cGdcIixcInlwaFwiLFwieXBrXCIsXCJ5cG1cIixcInlwblwiLFwieXBvXCIsXCJ5cHBcIixcInlwelwiLFwieXJhXCIsXCJ5cmJcIixcInlyZVwiLFwieXJpXCIsXCJ5cmtcIixcInlybFwiLFwieXJtXCIsXCJ5cm5cIixcInlyb1wiLFwieXJzXCIsXCJ5cndcIixcInlyeVwiLFwieXNjXCIsXCJ5c2RcIixcInlzZ1wiLFwieXNsXCIsXCJ5c21cIixcInlzblwiLFwieXNvXCIsXCJ5c3BcIixcInlzclwiLFwieXNzXCIsXCJ5c3lcIixcInl0YVwiLFwieXRsXCIsXCJ5dHBcIixcInl0d1wiLFwieXR5XCIsXCJ5dWFcIixcInl1YlwiLFwieXVjXCIsXCJ5dWRcIixcInl1ZVwiLFwieXVmXCIsXCJ5dWdcIixcInl1aVwiLFwieXVqXCIsXCJ5dWtcIixcInl1bFwiLFwieXVtXCIsXCJ5dW5cIixcInl1cFwiLFwieXVxXCIsXCJ5dXJcIixcInl1dFwiLFwieXV1XCIsXCJ5dXdcIixcInl1eFwiLFwieXV5XCIsXCJ5dXpcIixcInl2YVwiLFwieXZ0XCIsXCJ5d2FcIixcInl3Z1wiLFwieXdsXCIsXCJ5d25cIixcInl3cVwiLFwieXdyXCIsXCJ5d3RcIixcInl3dVwiLFwieXd3XCIsXCJ5eGFcIixcInl4Z1wiLFwieXhsXCIsXCJ5eG1cIixcInl4dVwiLFwieXh5XCIsXCJ5eXJcIixcInl5dVwiLFwieXl6XCIsXCJ5emdcIixcInl6a1wiXVxuLFsgXCJ6YVwiLFwiemhcIixcInp1XCIsXCJ6YWFcIixcInphYlwiLFwiemFjXCIsXCJ6YWRcIixcInphZVwiLFwiemFmXCIsXCJ6YWdcIixcInphaFwiLFwiemFpXCIsXCJ6YWpcIixcInpha1wiLFwiemFsXCIsXCJ6YW1cIixcInphb1wiLFwiemFwXCIsXCJ6YXFcIixcInphclwiLFwiemFzXCIsXCJ6YXRcIixcInphdVwiLFwiemF2XCIsXCJ6YXdcIixcInpheFwiLFwiemF5XCIsXCJ6YXpcIixcInpiYVwiLFwiemJjXCIsXCJ6YmVcIixcInpibFwiLFwiemJ0XCIsXCJ6YnVcIixcInpid1wiLFwiemNhXCIsXCJ6Y2hcIixcInpkalwiLFwiemVhXCIsXCJ6ZWdcIixcInplaFwiLFwiemVuXCIsXCJ6Z2FcIixcInpnYlwiLFwiemdoXCIsXCJ6Z21cIixcInpnblwiLFwiemdyXCIsXCJ6aGJcIixcInpoZFwiLFwiemhpXCIsXCJ6aG5cIixcInpod1wiLFwiemh4XCIsXCJ6aWFcIixcInppYlwiLFwiemlrXCIsXCJ6aWxcIixcInppbVwiLFwiemluXCIsXCJ6aXJcIixcInppd1wiLFwieml6XCIsXCJ6a2FcIixcInprYlwiLFwiemtkXCIsXCJ6a2dcIixcInpraFwiLFwiemtrXCIsXCJ6a25cIixcInprb1wiLFwiemtwXCIsXCJ6a3JcIixcInprdFwiLFwiemt1XCIsXCJ6a3ZcIixcInprelwiLFwiemxhXCIsXCJ6bGVcIixcInpsalwiLFwiemxtXCIsXCJ6bG5cIixcInpscVwiLFwiemxzXCIsXCJ6bHdcIixcInptYVwiLFwiem1iXCIsXCJ6bWNcIixcInptZFwiLFwiem1lXCIsXCJ6bWZcIixcInptZ1wiLFwiem1oXCIsXCJ6bWlcIixcInptalwiLFwiem1rXCIsXCJ6bWxcIixcInptbVwiLFwiem1uXCIsXCJ6bW9cIixcInptcFwiLFwiem1xXCIsXCJ6bXJcIixcInptc1wiLFwiem10XCIsXCJ6bXVcIixcInptdlwiLFwiem13XCIsXCJ6bXhcIixcInpteVwiLFwiem16XCIsXCJ6bmFcIixcInpuZFwiLFwiem5lXCIsXCJ6bmdcIixcInpua1wiLFwiem5zXCIsXCJ6b2NcIixcInpvaFwiLFwiem9tXCIsXCJ6b29cIixcInpvcVwiLFwiem9yXCIsXCJ6b3NcIixcInpwYVwiLFwienBiXCIsXCJ6cGNcIixcInpwZFwiLFwienBlXCIsXCJ6cGZcIixcInpwZ1wiLFwienBoXCIsXCJ6cGlcIixcInpwalwiLFwienBrXCIsXCJ6cGxcIixcInpwbVwiLFwienBuXCIsXCJ6cG9cIixcInpwcFwiLFwienBxXCIsXCJ6cHJcIixcInpwc1wiLFwienB0XCIsXCJ6cHVcIixcInpwdlwiLFwienB3XCIsXCJ6cHhcIixcInpweVwiLFwienB6XCIsXCJ6cWVcIixcInpyYVwiLFwienJnXCIsXCJ6cm5cIixcInpyb1wiLFwienJwXCIsXCJ6cnNcIixcInpzYVwiLFwienNrXCIsXCJ6c2xcIixcInpzbVwiLFwienNyXCIsXCJ6c3VcIixcInp0ZVwiLFwienRnXCIsXCJ6dGxcIixcInp0bVwiLFwienRuXCIsXCJ6dHBcIixcInp0cVwiLFwienRzXCIsXCJ6dHRcIixcInp0dVwiLFwienR4XCIsXCJ6dHlcIixcInp1YVwiLFwienVoXCIsXCJ6dW1cIixcInp1blwiLFwienV5XCIsXCJ6d2FcIixcInp4eFwiLFwienliXCIsXCJ6eWdcIixcInp5alwiLFwienluXCIsXCJ6eXBcIixcInp6YVwiLFwienpqXCJdXG5dO1xuXG5cbmV4cG9ydCBjbGFzcyBMYW5nVXRpbCB7XG5cbiAgICAvKiBEZXRlcm1pbmUgaWYgZ2l2ZW4gc3RyaW5nIGlzIGEgdmFsaWQgQkNQIDQ3IHN0cmluZyAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNCY3A0NyhsYW5nU3RyOiBzdHJpbmcpIDogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAvXigoW2EtekEtWl17MiwzfSgtW2EtekEtWl0oLVthLXpBLVpdezN9KXswLDJ9KT98W2EtekEtWl17NH18W2EtekEtWl17NSw4fSkoLVthLXpBLVpdezR9KT8oLShbYS16QS1aXXsyfXxbMC05XXszfSkpPygtKFswLTlhLXpBLVpdezUsOH18WzAtOV1bYS16QS1aXXszfSkpKigtWzAtOWEtd3ktekEtV1ktWl0oLVthLXpBLVowLTldezIsOH0pKykqKC14KC1bYS16QS1aMC05XXsxLDh9KSspP3x4KC1bYS16QS1aMC05XXsxLDh9KSt8KGVuLUdCLW9lZHxpLWFtaXxpLWJubnxpLWRlZmF1bHR8aS1lbm9jaGlhbnxpLWhha3xpLWtsaW5nb258aS1sdXh8aS1taW5nb3xpLW5hdmFqb3xpLXB3bnxpLXRhb3xpLXRheXxpLXRzdXxzZ24tQkUtRlJ8c2duLUJFLU5MfHNnbi1DSC1ERXxhcnQtbG9qYmFufGNlbC1nYXVsaXNofG5vLWJva3xuby1ueW58emgtZ3VveXV8emgtaGFra2F8emgtbWlufHpoLW1pbi1uYW58emgteGlhbmcpKSQvLnRlc3QobGFuZ1N0cilcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHZhbGlkUHJpbWFyeUxhbmcobGFuZ1N0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBwcmltYXJ5ID0gbGFuZ1N0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAocHJpbWFyeS5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICAgIHByaW1hcnkgPSBwcmltYXJ5LnNwbGl0KFwiLVwiKVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcHJpbWFyeS5tYXRjaCgvW2Etel17MiwzfS8pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gcWFhLi5xdHpcbiAgICAgICAgaWYgKHByaW1hcnkubGVuZ3RoID09PSAzIFxuICAgICAgICAgICAgJiYgcHJpbWFyeS5jaGFyQXQoMCkgPT09IFwicVwiXG4gICAgICAgICAgICAmJiBwcmltYXJ5LmNoYXJDb2RlQXQoMSkgPj0gOTcgJiYgcHJpbWFyeS5jaGFyQ29kZUF0KDEpIDw9IDExNlxuICAgICAgICAgICAgJiYgcHJpbWFyeS5jaGFyQ29kZUF0KDIpID49IDk3ICYmIHByaW1hcnkuY2hhckNvZGVBdCgyKSA8PSAxMjIpIHtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsaWRQcmltYXJ5TGFuZ3NbcHJpbWFyeS5jaGFyQ29kZUF0KDApLTk3XS5pbmNsdWRlcyhwcmltYXJ5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG1hdGNoUHJpbWFyeUxhbmcobGFuZzE6IHN0cmluZywgbGFuZzI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcHJpbWFyeTEgPSBsYW5nMTtcbiAgICAgICAgaWYgKHByaW1hcnkxLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgICAgcHJpbWFyeTEgPSBwcmltYXJ5MS5zcGxpdChcIi1cIilbMF07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHJpbWFyeTIgPSBsYW5nMjtcbiAgICAgICAgaWYgKHByaW1hcnkyLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgICAgcHJpbWFyeTIgPSBwcmltYXJ5Mi5zcGxpdChcIi1cIilbMF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJpbWFyeTEudG9Mb3dlckNhc2UoKSA9PT0gcHJpbWFyeTIudG9Mb3dlckNhc2UoKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucywgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCB9IGZyb20gXCIuLi8uLi8uLi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi8uLi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi8uLi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi9mcmFnbWVudFwiO1xuaW1wb3J0IHsgZ2V0RGVmaW5lZFN0eWxlcyB9IGZyb20gXCIuLi8uLi8uLi8uLi92NC91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vLi4vZG9tL0RPTVV0aWxcIjtcblxuZXhwb3J0IGNsYXNzIFJQVFV0aWwge1xuXG5cbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRhZ3Mgd2hpY2ggaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIHNpbmNlIHdlIGhhdmUgcnVsZXMgdHJpZ2dlcmluZ1xuICAgIHB1YmxpYyBzdGF0aWMgbmF2TGlua0tleXdvcmRzID0gWydzdGFydCcsICduZXh0JywgJ3ByZXYnLCAncHJldmlvdXMnLCAnY29udGVudHMnLCAnaW5kZXgnXVxuXG4gICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBydWxlIGlkcyBmb3IgdGhlIHJ1bGVzIHRoYXQgaGF2ZSB0byBjaGVjayBmb3IgaGlkZGVuIGNvbnRlbnQgcmVnYXJkbGVzcyBvZiB0aGUgQ2hlY2sgSGlkZGVuXG4gICAgLy8gQ29udGVudCBTZXR0aW5nLiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGUgZW5naW5lIGlzIGFjdHVhbGx5IGRldGVybWluZSB3aGljaCBlbGVtZW50cyB0byBtYXNzIHRvIHRoZSBydWxlcywgaXQgd2lsbCBhbHdheXNcbiAgICAvLyBwYXNzIHRoZXNlcyBydWxlcyBubyBtYXR0ZXIgd2hhdCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZyBpcy5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVzVGhhdEhhdmVUb0NoZWNrSGlkZGVuID0gWydSUFRfRWxlbV9VbmlxdWVJZCddXG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGVBdEluZGV4KGVsZSwgaW5kZXgpIHtcbiAgICAgICAgbGV0IGF0dHJOYW1lID0gZWxlLmF0dHJpYnV0ZXNbaW5kZXhdLm5hbWU7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUoZWxlLCBhdHRyTmFtZSk7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMS8jaW50cm9zdGF0ZXNcbiAgICBwdWJsaWMgc3RhdGljIGFyaWFBdHRyaWJ1dGVSb2xlRGVmYXVsdHMgPSB7XG4gICAgICAgIFwiYWxlcnRcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJhc3NlcnRpdmVcIixcbiAgICAgICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJ0cnVlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb21ib2JveFwiOiB7XG4gICAgICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjogXCJsaXN0Ym94XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJsaXN0Ym94XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJsb2dcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJwb2xpdGVcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1lbnVcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwidmVydGljYWxcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1lbnViYXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibWV0ZXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJvcHRpb25cIjoge1xuICAgICAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IFwiZmFsc2VcIlxuICAgICAgICB9LFxuICAgICAgICBcInByb2dyZXNzYmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiBcIjBcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiBcIjEwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2Nyb2xsYmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNlcGFyYXRvclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNsaWRlclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNwaW5idXR0b25cIjoge1xuICAgICAgICAgICAgLy8gTm90IHN1cmUgaG93IHRvIGVuY29kZSBtaW4vbWF4IChvciBub3cgaW4gMS4yIC0gXCJoYXMgbm8gdmFsdWVcIilcbiAgICAgICAgICAgIC8vXCJhcmlhLXZhbHVlbm93XCI6IFwiMFwiIFRPRE86IGF0IHJpc2s6IG1heWJlIGRlbGV0ZSBhZnRlciBBUklBIDEuMiByZWFjaGVzIHByb3Bvc2VkIHJlY1xuICAgICAgICAgICAgLy8gUHJvYmFibHkganVzdCBkZWxldGUgc3BpbmJ1dHRvbiBmcm9tIHRoaXMgbGlzdCBjb21wbGV0ZWx5IGFuZCBsZXQgdXNlciBhZ2VudHMgaGFuZGxlIFwiZGVmYXVsdHNcIlxuICAgICAgICB9LFxuICAgICAgICBcInN0YXR1c1wiOiB7XG4gICAgICAgICAgICBcImFyaWEtbGl2ZVwiOiBcInBvbGl0ZVwiLFxuICAgICAgICAgICAgXCJhcmlhLWF0b21pY1wiOiBcInRydWVcIlxuICAgICAgICB9LFxuICAgICAgICBcInRhYlwiOiB7XG4gICAgICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjogXCJmYWxzZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGFibGlzdFwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0b29sYmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcImhvcml6b250YWxcIlxuICAgICAgICB9LFxuICAgICAgICBcInRyZWVcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwidmVydGljYWxcIlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMS8jYXJpYS1hdG9taWNcbiAgICBwdWJsaWMgc3RhdGljIGFyaWFBdHRyaWJ1dGVHbG9iYWxEZWZhdWx0cyA9IHtcbiAgICAgICAgXCJhcmlhLWF0b21pY1wiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjogXCJub25lXCIsXG4gICAgICAgIFwiYXJpYS1idXN5XCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtY3VycmVudFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1kaXNhYmxlZFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1kcm9wZWZmZWN0XCI6IFwibm9uZVwiLFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtZ3JhYmJlZFwiOiB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1oaWRkZW5cIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtaW52YWxpZFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1saXZlXCI6IFwib2ZmXCIsXG4gICAgICAgIFwiYXJpYS1tb2RhbFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1tdWx0aWxpbmVcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXByZXNzZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtcmVhZG9ubHlcIjogXCJmYWxzZVwiLFxuICAgICAgICAvL1wiYXJpYS1yZWxldmFudFwiOiBcImFkZGl0aW9ucyB0ZXh0XCIsIFRPRE86IGFyZSBtdWx0aXBsZSB2YWx1ZXMgc3VwcG9ydGVkP1xuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtc29ydFwiOiBcIm5vbmVcIlxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFhbS0xLjAvI2h0bWwtYXR0cmlidXRlLXN0YXRlLWFuZC1wcm9wZXJ0eS1tYXBwaW5nc1xuICAgIHB1YmxpYyBzdGF0aWMgYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3MgPSB7XG4gICAgICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgXCJmb3JtXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2ZmXCIgPT09IGUuZ2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIpID8gXCJub25lXCIgOiBcImJvdGhcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2ZmXCIgPT09IGUuZ2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIpID8gXCJub25lXCIgOiBcImJvdGhcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHtcbiAgICAgICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJpbmRldGVybWluYXRlXCIpKSByZXR1cm4gXCJtaXhlZFwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiICsgZS5oYXNBdHRyaWJ1dGUoXCJjaGVja2VkXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibWVudWl0ZW1cIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJpbmRldGVybWluYXRlXCIpKSByZXR1cm4gXCJtaXhlZFwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiICsgZS5oYXNBdHRyaWJ1dGUoXCJjaGVja2VkXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiKlwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmhhc0F0dHJpYnV0ZShcImluZGV0ZXJtaW5hdGVcIikpIHJldHVybiBcIm1peGVkXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjoge1xuICAgICAgICAgICAgXCJidXR0b25cIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmaWVsZHNldFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3B0Z3JvdXBcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvcHRpb25cIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IHtcbiAgICAgICAgICAgIFwiZGV0YWlsc1wiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcIm9wZW5cIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRpYWxvZ1wiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcIm9wZW5cIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiB7XG4gICAgICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmhhc0F0dHJpYnV0ZShcIm11bHRpcGxlXCIpKSByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcGxhY2Vob2xkZXJcIjoge1xuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZXF1aXJlZFwiOiB7XG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0QXR0cmlidXRlKFwicmVxdWlyZWRcIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInJlcXVpcmVkXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInJlcXVpcmVkXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHVzZXItZGVmaW5lZCBhcmlhIGF0dHJpYnV0ZSBuYW1lIGZyb20gZG9tXG4gICAgICogQHBhcmFtIGVsZSAgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHVzZXIgZGVmaW5lZCBhcmlhIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMoZWxlbSkge1xuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgbGV0IGRvbUF0dHJpYnV0ZXMgPSBlbGVtLmF0dHJpYnV0ZXM7XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZXMucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUgZnJvbSBkb21cbiAgICAgKiBAcGFyYW0gZWxlICBlbGVtZW50XG4gICAgICogQHJldHVybnMgdXNlciBkZWZpbmVkIGh0bWwgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRIdG1sQXR0cmlidXRlcyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTsgXG4gICAgICAgICAgICAgICAgbGV0IGlzQXJpYSA9IGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJztcbiAgICAgICAgICAgICAgICBpZiAoIWlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZXMucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0bWxBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGFyaWEgYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpciBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKSB7XG4gICAgICAgIGxldCBhcmlhQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZXMucHVzaCh7bmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWV9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJpYUF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgaHRtbCBhdHRyaWJ1dGUgbmFtZS12YWx1ZSBwYWlyIGZyb20gZG9tXG4gICAgICogQHBhcmFtIGVsZSAgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHVzZXIgZGVmaW5lZCBodG1sIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFVzZXJEZWZpbmVkSHRtbEF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXJzKGVsZW0pIHtcbiAgICAgICAgbGV0IGh0bWxBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpOyBcbiAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FyaWEpXG4gICAgICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVzLnB1c2goe25hbWU6IGF0dHJOYW1lLCB2YWx1ZTogYXR0clZhbHVlfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0bWxBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgaW1wbGljaXQgYXJpYSBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGUsIGFuIGlucHV0IHdpdGggY2hlY2tlZCBpcyBlcXVpdmFsZW50IHRvIGFyaWEtY2hlY2tlZD1cInRydWVcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXJpYUF0dHJpYnV0ZShlbGUsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLCBpdCB0YWtlcyBwcmVjZWRlbmNlXG4gICAgICAgIGxldCByZXRWYWwgPSBlbGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICAgIGlmIChlbGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpICYmIHJldFZhbC50cmltKCkgPT09IFwiXCIpIHsgLy9cIlwiIGlzIHRyZWF0ZWQgYXMgZmFsc2UsIHNvIHdlIG5lZWQgcmV0dXJuIGl0IGJlZm9yZSB0aGUgYmVsb3cgY2hlY2tcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlbiBkZXRlcm1pbmUgaW1wbGljaXQgdmFsdWVzIGZyb20gb3RoZXIgYXR0cmlidXRlc1xuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IHRhZyA9IGVsZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gUlBUVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5ncykge1xuICAgICAgICAgICAgICAgIGlmICh0YWcgaW4gUlBUVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5nc1thdHRyaWJ1dGVOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBSUFRVdGlsLmFyaWFBdHRyaWJ1dGVJbXBsaWNpdE1hcHBpbmdzW2F0dHJpYnV0ZU5hbWVdW3RhZ107XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFwiKlwiIGluIFJQVFV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gUlBUVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5nc1thdHRyaWJ1dGVOYW1lXVtcIipcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayByb2xlLWJhc2VkIGRlZmF1bHRzXG4gICAgICAgIGlmICghcmV0VmFsKSB7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShlbGUpO1xuICAgICAgICAgICAgaWYgKHJvbGUgaW4gUlBUVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzICYmIGF0dHJpYnV0ZU5hbWUgaW4gUlBUVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gUlBUVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzW3JvbGVdW2F0dHJpYnV0ZU5hbWVdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGlsbCBub3QgZGVmaW5lZD8gQ2hlY2sgZ2xvYmFsIGRlZmF1bHRzXG4gICAgICAgIGlmICghcmV0VmFsICYmIGF0dHJpYnV0ZU5hbWUgaW4gUlBUVXRpbC5hcmlhQXR0cmlidXRlR2xvYmFsRGVmYXVsdHMpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IFJQVFV0aWwuYXJpYUF0dHJpYnV0ZUdsb2JhbERlZmF1bHRzW2F0dHJpYnV0ZU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0YWJUYWdNYXAgPSB7XG4gICAgICAgIFwiYnV0dG9uXCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwiaWZyYW1lXCI6IHRydWUsXG4gICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikgIT09IFwiaGlkZGVuXCIgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dGFyZWFcIjogdHJ1ZSxcbiAgICAgICAgXCJkaXZcIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJhXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAvLyB4bGluazpocmVmPz8gc2VlIHN2Z1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmVhXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcImF1ZGlvXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJjb250cm9sc1wiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJ2aWRlb1wiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udHJvbHNcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwic3VtbWFyeVwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgLy8gZmlyc3Qgc3VtbWFyeSBjaGlsZCBvZiBhIGRldGFpbHMgZWxlbWVudCBpcyBhdXRvbWF0aWNhbGx5IGZvY3VzYWJsZSBcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkZXRhaWxzJyBcbiAgICAgICAgICAgICAgICAgICAmJiBET01VdGlsLnNhbWVOb2RlKFsuLi5lbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtPT5lbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdW1tYXJ5JylbMF0sIGVsZW1lbnQpO1xuICAgICAgICB9LFxuICAgICAgICBcImRldGFpbHNcIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vZGV0YWlscyBlbGVtZW50IHdpdGhvdXQgYSBkaXJlY3Qgc3VtbWFyeSBjaGlsZCBpcyBhdXRvbWF0aWNhbGx5IGZvY3VzYWJsZVxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hpbGRyZW4gJiYgWy4uLmVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtPT5lbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdW1tYXJ5JykubGVuZ3RoID09PSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB3b3JkQ291bnQoc3RyKSA6IG51bWJlciB7XG4gICAgICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHN0ci5zcGxpdCgvXFxzKy9nKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90ZSB0aGF0IHRoaXMgb25seSBkZXRlY3RzIGlmIHRoZSBlbGVtZW50IGl0c2VsZiBpcyBpbiB0aGUgdGFiIG9yZGVyLlxuICAgICAqIEhvd2V2ZXIsIHRoaXMgZWxlbWVudCBtYXkgZGVsZWdhdGUgZm9jdXMgdG8gYW5vdGhlciBlbGVtZW50IHZpYSBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgKiBBbHNvLCBmb2N1cyB2YXJpZXMgYnkgYnJvd3Nlci4uLiAgc3RpY2tpbmcgdG8gdGhpbmdzIHRoYXQgYXJlIGZvY3VzYWJsZSBvbiBjaHJvbWUgYW5kIGZpcmVmb3hcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFiYmFibGUoZWxlbWVudCkge1xuICAgICAgICAvLyBVc2luZyBodHRwczovL2FsbHlqcy5pby9kYXRhLXRhYmxlcy9mb2N1c2FibGUuaHRtbFxuICAgICAgICAvLyBIYW5kbGUgdGhlIGV4cGxpY2l0IGNhc2VzIGZpcnN0XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPj0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeHBsaWNpdCBjYXNlcyBoYW5kbGVkIC0gbm93IHRoZSBpbXBsaWNpdFxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSBpbiBSUFRVdGlsLnRhYlRhZ01hcCkge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IFJQVFV0aWwudGFiVGFnTWFwW25vZGVOYW1lXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRhYkluZGV4TEVaZXJvKGVsZW0pIHtcbiAgICAgICAgaWYgKFJQVFV0aWwuaGFzQXR0cmlidXRlKGVsZW0sIFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpLm1hdGNoKC9eLT9cXGQrJC8pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhYmluZGV4VmFsdWUgPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFiaW5kZXhWYWx1ZSA9PT0gMCB8fCB0YWJpbmRleFZhbHVlID09PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IG51bWJlciBvZiB0YWJiYWJsZSBjaGlsZHJlblxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VGFiYmFibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgfHwgZWxlbWVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09IDEgJiYgIW53LmJFbmRUYWcgJiYgUlBUVXRpbC5pc1RhYmJhYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG5cbiAgICAvL1RPRE86IGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBlcXVpdmFsZW50cyBmb3Igcm9sZXM6IHJvdywgbGluaywgaGVhZGVyLCBidXR0b25cbiAgICAvLyBCdXQgaXQgbWF5IG5vdCBoYXZlIHRvLiAgQnVnIHJlcG9ydHMgaGF2ZSBiZWVuIGFib3V0IHJhZGlvIGJ1dHRvbnMgYW5kIGNoZWNrYm94ZXMuXG4gICAgcHVibGljIHN0YXRpYyBpc0h0bWxFcXVpdihub2RlLCBodG1sRXF1aXYpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChodG1sRXF1aXYuaW5kZXhPZihcImNoZWNrYm94XCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSB0eXBlID09PSBcImNoZWNrYm94XCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaHRtbEVxdWl2LmluZGV4T2YoXCJyYWRpb1wiKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gdHlwZSA9PT0gXCJyYWRpb1wiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpIHtcbiAgICAgICAgbGV0IGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJykge1xuICAgICAgICAgICAgLy8gVXNlciBhZ2VudHMgU0hPVUxEIHRyZWF0IHN0YXRlIGFuZCBwcm9wZXJ0eSBhdHRyaWJ1dGVzIHdpdGggYSB2YWx1ZSBvZiBcIlwiIHRoZSBzYW1lIGFzIHRoZXkgdHJlYXQgYW4gYWJzZW50IGF0dHJpYnV0ZS5cbiAgICAgICAgICAgIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpICYmIGVsZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBub3JtYWxpemVTcGFjaW5nKHMpIHtcbiAgICAgICAgcmV0dXJuIHMudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcbiAgICB9O1xuXG4gICAgcHVibGljIHN0YXRpYyBub25FeGlzdGFudElEcyhub2RlLCB0YXJnZXRpZHMpIHtcbiAgICAgICAgbGV0IHJldHVybm5vdGZvdW5kaWRzID0gJyc7XG4gICAgICAgIGlmIChSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGFyZ2V0aWRzKS5sZW5ndGggPCAxKSByZXR1cm4gcmV0dXJubm90Zm91bmRpZHM7XG5cbiAgICAgICAgbGV0IHRhcmdldEFycmF5ID0gdGFyZ2V0aWRzLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgbGV0IGRvYyA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHhwID0gXCIvLypbQGlkPSdcIiArIHRhcmdldEFycmF5W2ldICsgXCInXVwiO1xuICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0ID0gZG9jLmV2YWx1YXRlKHhwLCBub2RlLCBkb2MuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgbGV0IHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpO1xuICAgICAgICAgICAgaWYgKCFyKSByZXR1cm5ub3Rmb3VuZGlkcyArPSB0YXJnZXRBcnJheVtpXSArICcsICc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhyZXR1cm5ub3Rmb3VuZGlkcykubGVuZ3RoID49IDIpXG4gICAgICAgICAgICByZXR1cm5ub3Rmb3VuZGlkcyA9IHJldHVybm5vdGZvdW5kaWRzLnN1YnN0cmluZygwLCByZXR1cm5ub3Rmb3VuZGlkcy5sZW5ndGggLSAyKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJubm90Zm91bmRpZHMgPSAnJztcbiAgICAgICAgcmV0dXJuIHJldHVybm5vdGZvdW5kaWRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RG9jRWxlbWVudHNCeVRhZyhlbGVtLCB0YWdOYW1lKSB7XG4gICAgICAgIGxldCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChlbGVtKSBhcyBhbnk7XG4gICAgICAgIHRhZ05hbWUgPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBjYWNoZSA9IGdldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCB7fSk7XG4gICAgICAgIGlmICghKHRhZ05hbWUgaW4gY2FjaGUpKSB7XG4gICAgICAgICAgICBjYWNoZVt0YWdOYW1lXSA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHRhZ05hbWUpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoZG9jLCBcIlJQVF9ET0NFTEVNU0JZVEFHXCIsIGNhY2hlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FjaGVbdGFnTmFtZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIGNoaWxkIGVsZW1udHMgd2hpY2ggbWF0Y2ggdGhlIHRhZ1xuICAgICAqIG5hbWUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogUlBUVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gcGFyZW50RWxlbSAtIFRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHRhZ05hbWUgLSBUaGUgdGFnIHRvIHNlYXJjaCBmb3IgdW5kZXIgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggdGhlIHRhZyBzaG91bGQgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgdGFnIHVuZGVyIHRoZSBwYXJlbnQgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENoaWxkQnlUYWcocGFyZW50RWxlbSwgdGFnTmFtZSkge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIGNoaWxkIGVsZW1udHMgd2hpY2ggbWF0Y2ggdGhlIHRhZ1xuICAgICAqIG5hbWUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gcGFyZW50RWxlbSAtIFRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHRhZ05hbWUgLSBUaGUgdGFnIHRvIHNlYXJjaCBmb3IgdW5kZXIgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggdGhlIHRhZyBzaG91bGQgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgdGFnIHVuZGVyIHRoZSBwYXJlbnQgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENoaWxkQnlUYWdIaWRkZW4ocGFyZW50RWxlbSwgdGFnTmFtZSwgaWdub3JlSGlkZGVuLCBjb25zaWRlckhpZGRlblNldHRpbmcpIHtcbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICBsZXQgY2hpbGQgPSBwYXJlbnRFbGVtLmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHBhcmVudCB0byBidWlsZCBhIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB0aGF0XG4gICAgICAgIC8vIG1hdGNoIHRoZSB0YWdOYW1lIHByb3ZpZGVkXG4gICAgICAgIHdoaWxlIChjaGlsZCAhPSBudWxsKSB7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgaW5jbHVkZSB0aGUgY2hpbGRyZW4gaW50byB0aGUgcmV0dXJuIGFycmF5IGlmIHRoZXkgbWF0Y2ggd2l0aCB0YWduYW1lLlxuICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHRhZ05hbWUpIHtcblxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgaWdub3JlaGlkZGVuIHdhcyBzZXQgdG8gdHJ1ZSwgdGhlbiBwZXJmb3JtIGEgaXNOb2RlVmlzaWJsZSBjaGVja1xuICAgICAgICAgICAgICAgIC8vIGFuZCBpbiB0aGUgY2FzZSB0aGUgbm9kZSBpcyBub3QgdmlzaWxibGUgd2UgbW9yZSB0byB0aGVzZXMgdGhlbiBtb3ZlIHRvIHRoZSBuZXh0IG5vZGUuXG4gICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBhIGNvdXBsZSBvZiBjaGVja3MgdG8gZGV0ZXJtaW5lIGlmIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgaWdub3JlZCBvciBub3QuXG4gICAgICAgICAgICAgICAgLy8gIDEuIFdoZW4gaWdub3JlSGlkZGVuIGlzIHNldCB0byB0cnVlIHVwZnJvbnQsIHRoZW4gcGVyZm9ybSBhIGlzTm9kZVZpc2libGVcbiAgICAgICAgICAgICAgICAvLyAgMi4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgIC8vICAyLjEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgIC8vICAgICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICBpZiAoKGlnbm9yZUhpZGRlbiB8fCAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmICFSUFRVdGlsLnNob3VsZENoZWNrSGlkZGVuQ29udGVudChjaGlsZCkpKSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcblxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBQdXNoIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudFxuICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgYSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgbWF0Y2ggZ2l2ZW4gcm9sZXMocykuXG4gICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIENoZWNrIEhpZGRlbiBTZXR0aW5nIGF0IGFsbC5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGJ5IGRlZmF1bHkgd2lsbCBub3QgY29uc2lkZXIgaW1wbGljaXQgcm9sZXMuXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtkb2N1bWVudH0gZG9jIC0gVGhlIGRvY3VtZW50IG5vZGVcbiAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gcmV0dXJuIGVsZW1lbnRzIGJhc2VkIG9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcmV0VmFsIC0gbGlzdCBvZiBhbGwgdGhlIGVsZW1lbnRzIHdoaWNoIG1hdGNoZWQgdGhlIHJvbGUocykgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRzQnlSb2xlKGRvYywgcm9sZXMpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbGlzdCBvZiBlbGVtZW50cyB0aGF0IG1hdGNoIGdpdmVuIHJvbGVzKHMpLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byByZXR1cm4gZWxlbWVudHMgYmFzZWQgb24uXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSByb2xlKHMpIHRoYXQgd2VyZSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFbGVtZW50c0J5Um9sZUhpZGRlbihkb2MsIHJvbGVzLCBjb25zaWRlckhpZGRlblNldHRpbmcsIGNvbnNpZGVySW1wbGljaXRSb2xlcz8pIHtcbiAgICAgICAgXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlIHJvbGUgdG8gZWxlbWVudCBhc3NvaWNhdGlvbiBpcyBhbHJlYWR5IG1hZGUsIGFuZCBhdmFpbGFibGUgaW4gdGhlIGdsb2JhbCBoYXNBdHRyaWJ1dGVcbiAgICAgICAgLy8gd2UgY2FuIGp1c3QgdXNlIHRoYXQgb25lIGluc3RlYWQgb2YgYnVpbGRpbmcgYSBuZXcgb25lLlxuICAgICAgICBsZXQgcm9sZVRvRWxlbXMgPSBudWxsO1xuICAgICAgICBpZiAoY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICByb2xlVG9FbGVtcyA9IGdldENhY2hlKGRvYywgXCJSUFRVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvbGVUb0VsZW1zID0gZ2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfR0VURUxFTUVOVFNCWV9ST0xFXCIsIG51bGwpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyBCdWlsZCB0aGUgbmV3IHJvbGUgdG8gZWxlbWVudCwgdGhpcyBpcyB3aGVyZSB3ZSBsb29wIHRocm91Z2ggYWxsIHRoZSBlbGVtZW50cyBhbmQgZXh0cmFjdCBhbGwgdGhlXG4gICAgICAgIC8vIGVsZW1lbnRzIGJzYWVkIG9uIHJvbGVzLlxuICAgICAgICBpZiAocm9sZVRvRWxlbXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFJlLWluaXRpYWxpemUgdGhlIHJvbGVUb0VsZW1zIGhhc2hcbiAgICAgICAgICAgIHJvbGVUb0VsZW1zID0ge307XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgYm9keSBvZiB0aGUgZG9jXG4gICAgICAgICAgICBsZXQgcm9vdCA9IGRvYy5ib2R5O1xuXG4gICAgICAgICAgICAvLyBLZWVwIGxvb3BpbmcgdW50aWwgd2UgYXJlIGF0IHRoZSB2ZXJ5IHBhcmVudCBub2RlIG9mIHRoZSBlbnRpcmUgcGFnZSwgc28gdGhhdCB3ZSBjYW4gbG9vcCB0aHJvdWdoXG4gICAgICAgICAgICAvLyBhbGwgdGhlIG5vZGVzLlxuICAgICAgICAgICAgd2hpbGUgKERPTVdhbGtlci5wYXJlbnROb2RlKHJvb3QpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnROb2RlXG4gICAgICAgICAgICAgICAgcm9vdCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHJvb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQnVpbGQgYSBub2Rld2FsdGVyIGJhc2VkIG9mIHRoZSByb290IG5vZGUsIHRoaXMgbm9kZSB3YWx0ZXIgd2lsbCBiZSB1c2UgbG9vcCBvdmVyIGFsbCB0aGUgbm9kZXNcbiAgICAgICAgICAgIC8vIGFuZCBidWlsZCB0aGUgcm9sZXMgdG8gRWxlbWVudCBjb3JhbGF0aW9uXG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihyb290KTtcblxuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIHRoZSBlbnRpcmUgZG9jL2xpc3Qgb2Ygbm9kZXMgdG8gYnVpbGQgdGhlIHJvbGUgdG8gZWxlbWVudCBtYXBcbiAgICAgICAgICAgIC8vIE5vdGU6IFRoaXMgd2lsbCBidWlsZCBhbiByb2xlVG9FbGVtcyBoYXNoIHdoaWNoIGlzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0LlxuICAgICAgICAgICAgLy8gcm9sZVRvRWxlbXMgPSB7XG4gICAgICAgICAgICAvLyAgICBkb2N1bWVudDogW3tkaXZ9LHthYmJyfSx7dmFyfV0sXG4gICAgICAgICAgICAvLyAgICBtYWluOiBbe2Rpdn1dLFxuICAgICAgICAgICAgLy8gICAgbmF2aWdhdGlvbjogW3tkaXZ9XVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW53LmVsZW0oKSkgY29udGludWU7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIE9ubHkgY2hlY2sgdGhlIGVsZW1lbnRzIHdoaWNoIGhhdmUgdGhlIHJvbGUgYXR0cmlidXRlIGFzc2ljaWF0ZWQgdG8gdGhlbVxuICAgICAgICAgICAgICAgIGlmICghbncuYkVuZFRhZykge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB3Um9sZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiB0aGUgbm9kZSBoYXMgcm9sZSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAgIGlmIChudy5lbGVtKCkgJiYgbncuZWxlbSgpLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgYWxsIHRoZSByb2xlcyB0aGF0IGFyZSBhc3NpZ25lZCB0byB0aGlzIGVsZW1lbnQsIGNhbiBoYXZlIG11bHRpcGxlIHJvbGVzIG9uIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCBzcGxpdCBieSBzcGFjZSwgc28gd2UgbmVlZCB0byBleHRyYWN0IGFsbCBvZiB0aGVtIGludG8gYW4gYXJyYXkuXG4gICAgICAgICAgICAgICAgICAgICAgICB3Um9sZXMgPSBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAobncuZWxlbSgpICYmIHdSb2xlcy5sZW5ndGggPT09IDAgJiYgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShudy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBsaWNpdFJvbGUgIT09IG51bGwgJiYgaW1wbGljaXRSb2xlLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd1JvbGVzID0gaW1wbGljaXRSb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHdSb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gIDEuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiBSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4obncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgcm9sZXMgYW5kIGFzc2lnbmVkIHRoaXMgbm9kZSB0byBhbGwgdGhlcyByb2xlc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB0aGUgcm9sZSBrZXkgaXMgbm90IGFscmVhZHkgaW4gdGhlIHJvbGVUb0VsZW1zIGhhc2gsIGNvbnN0cnVjdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUga2V5IGFuZCBhc3NpZ24gZW1wdHkgYXJyYXkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh3Um9sZXNbaV0gaW4gcm9sZVRvRWxlbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZVRvRWxlbXNbd1JvbGVzW2ldXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGFycmF5IGZvciB0aGUgcm9sZVxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZVRvRWxlbXNbd1JvbGVzW2ldXS5wdXNoKG53Lm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHJvbGVUb0VsZW1zIGhhc2ggbWFwIGFzIGEgZ2xvYmFsIHZhcmlhYmxlXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICAgICAgc2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfR0VURUxFTUVOVFNCWV9ST0xFX0lNUExJQ0lUXCIsIHJvbGVUb0VsZW1zKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfR0VURUxFTUVOVFNCWV9ST0xFXCIsIHJvbGVUb0VsZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlsaXplIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgdGhlIHByb3ZpZGVkIHJvbGUgaXMgYSBzdHJpbmcgYW5kIG5vdCBhbiBhcnJheSxcbiAgICAgICAgLy8gZm9yIHRoaXMgY2FzZSB3ZSB0YWtlIHRoZSBzdHJpbmcgYW5kIHB1dCBpdCBpbnRvIGFuIGFycmF5XG4gICAgICAgIGlmICh0eXBlb2YgKHJvbGVzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSByb2xlcztcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICByb2xlcy5wdXNoKHJvbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSByb2xlcyB0aGF0IHdlcmUgcHJvdmlkZWQgYW5kIGZpbmQgdGhlIGxpc3Qgb2YgZWxlbWVudHMgZm9yIHRoaXMgcm9sZXNcbiAgICAgICAgLy8gYW5kIGFkZCB0aGVtIHRvIHRoZSByZXR1cm4gdmFsdWUuXG4gICAgICAgIGlmIChyb2xlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBhbGwgdGhlIHJvbGVzXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgcm9sZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIGxldCBuZXh0Um9sZSA9IHJvbGVzW2ldO1xuICAgICAgICAgICAgICAgIC8vIEZldGNoIHRoZSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgZm9yIHRoaXMgcm9sZVxuICAgICAgICAgICAgICAgIGxldCBjb3B5Um9sZXMgPSByb2xlVG9FbGVtc1tuZXh0Um9sZV07XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgZWxlbWVudHMgdG8gY29weSB0byBhbm90aGVyIGFycmF5LCB0aGVuIHBlcmZvcm0gdGhlIGNvcHlcbiAgICAgICAgICAgICAgICBpZiAoY29weVJvbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGVsZW1lbnRzIHdoaWNoIGFyZSB0byBiZSBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3B5Um9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIGVsZW1lbnQgdG8gdGhlIHJldHVybiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNvcHlSb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgdXNlciBkZWZpbmVkIGVsZW1lbnQncyByb2xlcyBmcm9tIGRvbS5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJvbGVzIC0gbGlzdCBvZiB1c2VyIGRlZmluZWQgcm9sZXMgaW4gdGhlIGVsZW1lbnQgcm9sZSBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRSb2xlcyhlbGU6IEVsZW1lbnQpIDogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5nZXRSb2xlcyhlbGUsIGZhbHNlKTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmV0cmlldmluZyBlbGVtZW50J3Mgcm9sZXMuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGZpbmRzIGltcGxpY2l0IHJvbGVzLlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByb2xlcyAtIGxpc3Qgb2YgYXR0cmlidXRlIHJvbGVzIGFuZCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSb2xlcyhlbGU6IEVsZW1lbnQsIGNvbnNpZGVySW1wbGljaXRSb2xlczogYm9vbGVhbikgOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCByb2xlcyA6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChlbGUgJiYgZWxlLmhhc0F0dHJpYnV0ZSAmJiBlbGUuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJSb2xlcyA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcm9sZXMucHVzaChhdHRyUm9sZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShlbGUpO1xuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vYWRkIGltcGxpY2l0IHJvbGVzIHRvIHRoZSBhdHRyaWJ1dGVzIHJvbGVzLlxuICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChpbXBsaWNpdFJvbGUsIHJvbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVtZW50XG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoZSBpbXBsaWNpdCByb2xlIG9yIFtdIGlmIGRvZXNuJ3QgZXhpc3RcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbXBsaWNpdFJvbGUoZWxlKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgaWYgKCFlbGUgfHwgZWxlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gW107XG4gICAgICAgIGxldCBpbXBsaWNpdFJvbGVzIDogc3RyaW5nW10gPSBnZXRDYWNoZShlbGUsIFwiUlBUVXRpbF9JbXBsaWNpdFJvbGVcIiwgbnVsbCk7XG4gICAgICAgIGlmICghaW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gUlBUVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KGVsZSk7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgJiYgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhcImdlbmVyaWNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlICdnZW5lcmljJyByb2xlIGlzIG9ubHkgYWxsb3dlZCBpZiBhIHZhbGlkIGFyaWEgYXR0cmlidXRlIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvbUFyaWFBdHRyaWJ1dGVzID0gUlBUVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21BcmlhQXR0cmlidXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENhY2hlKGVsZSwgXCJSUFRVdGlsX0ltcGxpY2l0Um9sZVwiLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0dGVybiA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1snZ2VuZXJpYyddO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5yZXFQcm9wcyAmJiBwYXR0ZXJuLnJlcVByb3BzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocGF0dGVybi5yZXFQcm9wcywgcm9sZUF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5Lmdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoQVJJQURlZmluaXRpb25zLmdsb2JhbFByb3BlcnRpZXMsIHJvbGVBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcyAmJiBwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHBhdHRlcm4uZGVwcmVjYXRlZFByb3BzLCByb2xlQXR0cmlidXRlcyk7IFxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSAnZ2VuZXJpYycgcm9sZSBpZiByb2xlQXR0cmlidXRlcyBkb2Vzbid0IGNvbnRhaW4gYW55IG9mIGRvbUFyaWFBdHRyaWJ1dGVzIFxuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZUF0dHJpYnV0ZXMubGVuZ3RoID4gMCAmJiAhcm9sZUF0dHJpYnV0ZXMuc29tZShhdHRyPT4gZG9tQXJpYUF0dHJpYnV0ZXMuaW5jbHVkZXMoYXR0cikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXQgPSBSUFRVdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QoWydnZW5lcmljJ10sIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDYWNoZShlbGUsIFwiUlBUVXRpbF9JbXBsaWNpdFJvbGVcIiwgaW1wbGljaXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltcGxpY2l0O1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXRDYWNoZShlbGUsIFwiUlBUVXRpbF9JbXBsaWNpdFJvbGVcIiwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlOyAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0Q2FjaGUoZWxlLCBcIlJQVFV0aWxfSW1wbGljaXRSb2xlXCIsIFtdKTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSAgICBcbiAgICAgICAgcmV0dXJuIGltcGxpY2l0Um9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVxdWlyZWQgcHJvcGVydGllcyBvZiB0aGUgcm9sZVxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGUgLSB0aGUgcm9sZVxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcHJvcGVydGllcyAtIGxpc3Qgb2YgcHJvcGVydGllcyB0aGF0IGFyZSByZXF1aXJlZCBieSB0aGUgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZSwgZWxlKSB7XG4gICAgICAgIGlmIChyb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0pIHtcbiAgICAgICAgICAgIGxldCByZXF1aXJlZEF0dHJpYnV0ZXMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ucmVxUHJvcHM7XG4gICAgICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIHNlcGFyYXRvclxuICAgICAgICAgICAgaWYgKHJvbGUudG9Mb3dlckNhc2UoKSA9PT0gXCJzZXBhcmF0b3JcIiAmJiBlbGUgJiYgUlBUVXRpbC5pc0ZvY3VzYWJsZShlbGUpKSB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWRBdHRyaWJ1dGVzID0gUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KFtcImFyaWEtdmFsdWVub3dcIl0sIHJlcXVpcmVkQXR0cmlidXRlcyB8fCBbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVxdWlyZWRBdHRyaWJ1dGVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHRoZSBlbGUgbm9kZSBpcyBmb2N1c2FibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRm9jdXNhYmxlKGVsZSkge1xuICAgICAgICBpZiAoZWxlID09PSBcInVuZGVmaW5lZFwiIHx8IGVsZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmlzVGFiYmFibGUoZWxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGlmIGEgZWxlbWVudCBoYXMgZ2l2ZW4gcm9sZS5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgaWYgZWxlbWVudCBoYXMgZ2l2ZW4gcm9sZXMgYXMgaW1wbGljaXQgcm9sZS5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gZmluZCBpZiBlbGVtZW50IGhhcyB0aGVzZSByb2xlcy5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcmV0VmFsIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiB0aCBlbGVtZW50IGhhcyB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqXG4gICAgICogQ29uc2lkZXIgdG8gdXNlIGhhc1JvbGVJblNlbWFudGljcygpIGluc3RlYWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNSb2xlKGVsZSwgcm9sZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykgeyAgLy9Db25zaWRlciB0byB1c2UgaGFzUm9sZUluU2VtYW50aWNzKCkgaW5zdGVhZC5cbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vaWYgbm9uZSBvZiB0aGUgdGhlIGF0dHJpYnV0ZSByb2xlcyBtYXRjaGVkIHdpdGggZ2l2ZW4gcm9sZVxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIG1hdGNoZXMuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB3Um9sZXMgPSBbXTtcbiAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZSA9IFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZSk7XG4gICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlICE9PSBudWxsICYmIGltcGxpY2l0Um9sZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KGltcGxpY2l0Um9sZSwgd1JvbGVzKTtcbiAgICAgICAgICAgICAgICAvL2lmIHJvbGUgaXMgYXJyYXkgbG9vcCB0aHJ1IGFuZCBzZWUgaWYgYW55ICBvZiB0aGUgaW1wbGljaXQgcm9sZSBwcmVzZW50IGluIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHdSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gd1JvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgd1JvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSB3Um9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGVsZW1lbnQgaGFzIHRoZSByb2xlLCBpbmNsdWRpbmcgdGhlIGltcGxpZWQgcm9sZSBpZiByb2xlIGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVwbGFjaW5nIHRoZSBoYXNSb2xlIGZ1bmN0aW9uXG4gICAgICpcbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gZmluZCBpZiBlbGVtZW50IGhhcyB0aGVzZSByb2xlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgdGhlIGVsZW1lbnQgaGFzIHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNSb2xlSW5TZW1hbnRpY3MoZWxlLCByb2xlKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJvbGVTcGVjaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZSAmJiBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZVNwZWNpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByb2xlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvbGVTcGVjaWZpZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIG1hdGNoZXMuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICAvL2NoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgbGV0IGltcFJvbGVzID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgaWYgKGltcFJvbGVzICE9PSBudWxsICYmIGltcFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vaWYgcm9sZSBpcyBhcnJheSBsb29wIHRocnUgYW5kIHNlZSBpZiBhbnkgIG9mIHRoZSBpbXBsaWNpdCByb2xlIHByZXNlbnQgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IGltcFJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGltcFJvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgaW1wUm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gaW1wUm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBpZiBhIGVsZW1lbnQgaGFzIGdpdmVuIHJvbGUuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNoZWNrcyBpZiBlbGVtZW50IGhhcyBnaXZlbiByb2xlcyBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbH0gcmV0VmFsIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIHNwZWNpZmllZCByb2xlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc0FueVJvbGUoZWxlLCBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIGV4aXN0LlxuICAgICAgICAvL05vdGU6IGVsZW1lbnQgY2FuIGhhdmUgbXVsdGlwbGUgaW1wbGljaXQgcm9sZXNcbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICAvL2NoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICAgIGxldCBpbXBSb2xlcyA9IFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZSk7XG4gICAgICAgICAgICBpZiAoaW1wUm9sZXMgIT09IG51bGwgJiYgaW1wUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXRWYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0RhdGFUYWJsZSh0YWJsZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuICEoUlBUVXRpbC5oYXNSb2xlKHRhYmxlTm9kZSwgXCJub25lXCIpIHx8IFJQVFV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwicHJlc2VudGF0aW9uXCIpKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgY29tcGxleCBkYXRhIHRhYmxlIGlzIGEgZGF0YSB0YWJsZSB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczpcbiAgICAgKlxuICAgICAqIGEgdGhlYWQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzXG4gICAgICogYSB0YWJsZSB3aXRoIG1vcmUgdGhhbiBvbmUgdGhlYWQgZWxlbWVudFxuICAgICAqIGEgdGFibGUgd2l0aCB0d28gb3IgbW9yZSB0ciBlbGVtZW50cyB0aGF0IGNvbnRhaW4gb25seSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGggb3IgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAqIGEgdHIgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB0ZCBlbGVtZW50IGFuZCB0d28gb3IgbW9yZSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGFibGUgd2l0aCBoZWFkZXJzIG5vdCBsb2NhdGVkIGluIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uXG4gICAgICogYSB0ZCBlbGVtZW50IHdpdGggYSBoZWFkZXJzIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGNvbnRhaW5zIG1vcmUgdGhhbiB0d28gSURSRUZzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NvbXBsZXhEYXRhVGFibGUodGFibGUpIHtcblxuICAgICAgICBpZiAoXCJSUFRVdGlsX2lzQ29tcGxleERhdGFUYWJsZVwiIGluIHRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gISF0YWJsZS5SUFRVdGlsX2lzQ29tcGxleERhdGFUYWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc0NvbXBsZXhUYWJsZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0YWJsZSAmJiBSUFRVdGlsLmlzRGF0YVRhYmxlKHRhYmxlKSkge1xuXG4gICAgICAgICAgICBsZXQgdGhOb2RlcyA9IG51bGwsXG4gICAgICAgICAgICAgICAgdGROb2RlcyA9IG51bGw7XG4gICAgICAgICAgICBsZXQgdHJOb2RlcyA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJcIik7XG4gICAgICAgICAgICBsZXQgdHJOb2RlQ291bnQgPSB0ck5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCB0ZE5vZGVDb3VudCA9IDAsXG4gICAgICAgICAgICAgICAgdGhOb2RlQ291bnQgPSAwLFxuICAgICAgICAgICAgICAgIHRyTm9kZXNIYXZpbmdPbmx5VGhOb2RlcyA9IDA7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhaXNDb21wbGV4VGFibGUgJiYgaSA8IHRyTm9kZUNvdW50OyArK2kpIHtcblxuICAgICAgICAgICAgICAgIHRoTm9kZXMgPSB0ck5vZGVzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhcIik7XG4gICAgICAgICAgICAgICAgdGROb2RlcyA9IHRyTm9kZXNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0ZFwiKTtcbiAgICAgICAgICAgICAgICB0aE5vZGVDb3VudCA9IHRoTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRkTm9kZUNvdW50ID0gdGROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGROb2RlQ291bnQgIT09IDApIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRyIGVsZW1lbnQgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgdGQgZWxlbWVudCBhbmQgdHdvIG9yIG1vcmUgdGggZWxlbWVudHM7XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhOb2RlQ291bnQgPiAxO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGggZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgIWlzQ29tcGxleFRhYmxlICYmIGogPCB0aE5vZGVDb3VudDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9ICgodGhOb2Rlc1tqXS5oYXNBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhOb2Rlc1tqXS5oYXNBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuZ2V0QW5jZXN0b3IodGhOb2Rlc1tqXSwgXCJ0YWJsZVwiKSA9PT0gdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0ZCBlbGVtZW50IHdpdGggYSByb3dzcGFuIG9yIGNvbHNwYW4gYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGQgZWxlbWVudCB3aXRoIGEgaGVhZGVycyBhdHRyaWJ1dGUgdmFsdWUgdGhhdCBjb250YWlucyBtb3JlIHRoYW4gdHdvIElEUkVGc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgIWlzQ29tcGxleFRhYmxlICYmIGsgPCB0ZE5vZGVDb3VudDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9ICgodGROb2Rlc1trXS5oYXNBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGROb2Rlc1trXS5oYXNBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSAmJiBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGROb2Rlc1trXS5nZXRBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpKS5zcGxpdChcIiBcIikubGVuZ3RoID4gMikpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5nZXRBbmNlc3Rvcih0ZE5vZGVzW2tdLCBcInRhYmxlXCIpID09PSB0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdHdvIG9yIG1vcmUgdHIgZWxlbWVudHMgdGhhdCBjb250YWluIG9ubHkgdGggZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoTm9kZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgKyt0ck5vZGVzSGF2aW5nT25seVRoTm9kZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0ck5vZGVzSGF2aW5nT25seVRoTm9kZXMgPT09IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWlzQ29tcGxleFRhYmxlKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgdGhlYWROb2RlcyA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhlYWRcIik7XG4gICAgICAgICAgICAgICAgbGV0IHRoZWFkTm9kZXNMZW5ndGggPSB0aGVhZE5vZGVzLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGVhZE5vZGVzTGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGhhcyBtb3JlIHRoYW4gb25lIHRoZWFkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0aGVhZE5vZGVzTGVuZ3RoID4gMTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRoZWFkIGVsZW1lbnQgdGhhdCBjb250YWlucyB0d28gb3IgbW9yZSB0ciBlbGVtZW50c1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ29tcGxleFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9IHRoZWFkTm9kZXNbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0clwiKS5sZW5ndGggPiAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSAmJiB0ck5vZGVDb3VudCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGEgdGFibGUgd2l0aCBoZWFkZXJzIG5vdCBsb2NhdGVkIGluIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uXG4gICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0aE5vZGVDb3VudCA+IDAgJiYgIVJQVFV0aWwudGFibGVIZWFkZXJFeGlzdHModGFibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRhYmxlLlJQVFV0aWxfaXNDb21wbGV4RGF0YVRhYmxlID0gaXNDb21wbGV4VGFibGU7XG5cbiAgICAgICAgcmV0dXJuIGlzQ29tcGxleFRhYmxlO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIGEgdGFibGUgY2VsbCBpcyBoaWRkZW4gb3IgY29udGFpbiBubyBkYXRhOiA8dGQ+PC90ZD5cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVDZWxsRW1wdHkoY2VsbCkge1xuICAgICAgICBpZiAoIWNlbGwgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjZWxsKSB8fCBjZWxsLmlubmVySFRNTC5yZXBsYWNlKC8mbmJzcDsvZywnICcpLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhIHRhYmxlIHJvdyBpcyBoaWRkZW4gb3IgY29udGFpbiBubyBkYXRhOiA8dHIgLz4gb3IgPHRyPjx0ZD48L3RkPjx0ZD48L3RkPjwvdHI+IFxuICAgIHB1YmxpYyBzdGF0aWMgaXNUYWJsZVJvd0VtcHR5KHJvdykge1xuICAgICAgICBpZiAoIXJvdyB8fCAhcm93LmNlbGxzIHx8IHJvdy5jZWxscy5sZW5ndGggPT09IDAgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShyb3cpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTsgLy9lbXB0eVxuICAgICAgICBmb3IgKGxldCBjPTA7IHBhc3NlZCAmJiBjIDwgcm93LmNlbGxzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICBsZXQgY2VsbCA9IHJvdy5jZWxsc1tjXTtcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKTsgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBwYXNzZWQ7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYSB0YWJsZSdzIGhlYWRlciBpcyBpbiB0aGUgZmlyc3Qgcm93IG9yIGNvbHVtblxuICAgIHB1YmxpYyBzdGF0aWMgdGFibGVIZWFkZXJFeGlzdHMocnVsZUNvbnRleHQpIHtcblxuICAgICAgICBsZXQgcm93cyA9IHJ1bGVDb250ZXh0LnJvd3M7XG4gICAgICAgIGlmICghcm93cyB8fCByb3dzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIG5vdGUgdGhhdCB0YWJsZS5yb3dzIHJldHVybiBhbGwgYWxsIHRoZSByb3dzIGluIHRoZSB0YWJsZSwgXG4gICAgICAgIC8vIGluY2x1ZGluZyB0aGUgcm93cyBjb250YWluZWQgd2l0aGluIDx0aGVhZD4sIDx0Zm9vdD4sIGFuZCA8dGJvZHk+IGVsZW1lbnRzLiAgICBcbiAgICAgICAgXG4gICAgICAgIC8vY2FzZSAxOiBoZWFkZXJzIGFyZSBpbiB0aGUgdmVyeSBmaXJzdCByb3cgd2l0aCBkYXRhIGluIHRib2R5IG9yIHRoZWFkLCBidXQgbm90IGluIHRmb290ICAgXG4gICAgICAgIC8vZ2V0IHRoZSBmaXJzdCByb3cgd2l0aCBkYXRhLCBpZ25vcmluZyB0aGUgcm93cyB3aXRoIG5vIGRhdGFcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmaXJzdFJvdyA9IHJvd3NbMF07XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBmaXJzdFJvdyA9IHJvd3Nbcl07XG4gICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHJvd3MgZnJvbSB0Zm9vdFxuICAgICAgICAgICAgaWYgKGZpcnN0Um93LnBhcmVudE5vZGUgJiYgZmlyc3RSb3cucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGZvb3QnKSBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5pc1RhYmxlUm93RW1wdHkoZmlyc3RSb3cpOyAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy90YWJsZSBjb250YWluIG5vIGRhdGE6ICA8dGFibGU+PHRyPjx0ZD48L3RkPjx0ZD48L3RkPjwvdHI+PC90YWJsZT4gXG4gICAgICAgIGlmIChwYXNzZWQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjZWxscyB3aXRoIGRhdGEgaW4gdGhlIGZpcnN0IGRhdGEgcm93IGFyZSBhbGwgVEgnc1xuICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCByPTA7IHBhc3NlZCAmJiByIDwgZmlyc3RSb3cuY2VsbHMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgIGxldCBjZWxsID0gZmlyc3RSb3cuY2VsbHNbcl07XG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmlzVGFibGVDZWxsRW1wdHkoY2VsbCkgfHwgY2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGgnOyAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHBhc3NlZClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIENhc2UgMjogaGVhZGVycyBhcmUgaW4gdGhlIGZpcnN0IGNvbHVtbiB3aXRoIGRhdGFcbiAgICAgICAgLy8gQXNzdW1lIHRoYXQgdGhlIGZpcnN0IGNvbHVtbiBoYXMgYWxsIFRIJ3Mgb3IgYSBURCB3aXRob3V0IGRhdGEgaW4gdGhlIGZpcnN0IGNvbHVtbi5cbiAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgcm93cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgLy8gaWdub3JlIHRoZSByb3dzIGZyb20gdGZvb3RcbiAgICAgICAgICAgIGlmIChyb3dzW2ldLnBhcmVudE5vZGUgJiYgcm93c1tpXS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0Zm9vdCcpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBJZiBubyBjZWxscyBpbiB0aGlzIHJvdywgb3Igbm8gZGF0YSBhdCBhbGwsIHRoYXQncyBva2F5IHRvby5cbiAgICAgICAgICAgIHBhc3NlZCA9ICFyb3dzW2ldLmNlbGxzIHx8XG4gICAgICAgICAgICAgICAgcm93c1tpXS5jZWxscy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgICAgICByb3dzW2ldLmNlbGxzWzBdLmlubmVySFRNTC50cmltKCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgcm93c1tpXS5jZWxsc1swXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9IFwidGRcIjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHBhc3NlZClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgXG4gICAgICAgIC8vY2FzZSAzOiBhbGwgdGQgZGF0YSBjZWxscyBoYXZlIGhlYWRlcnMgYXR0cmlidXRlcyB0aGF0IHBvaW50IHRvIHRoZSBpZCBvZiBhIHRoIGVsZW1lbnQgaW4gdGhlIHNhbWUgdGFibGUuIFxuICAgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS90YWJsZXMuaHRtbCNhdHRyaWJ1dGVzLWNvbW1vbi10by10ZC1hbmQtdGgtZWxlbWVudHNcbiAgICAgICAgcGFzc2VkID0gdHJ1ZTsgXG4gICAgICAgIGxldCB0aElkcyA9IFtdO1xuICAgICAgICBsZXQgdGRIZWFkZXJzID0gW107XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBsZXQgcm93ID0gcm93c1tyXTsgXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY2VsbHMgd2l0aCBkYXRhIGluIHRoZSBsYXN0IGRhdGEgcm93IGFyZSBhbGwgVEgnc1xuICAgICAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgcm93LmNlbGxzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNlbGwgPSByb3cuY2VsbHNbY107XG4gICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKSkgY29udGludWU7IFxuICAgICAgICAgICAgICAgIGlmIChjZWxsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0ZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsLmdldEF0dHJpYnV0ZSgnaGVhZGVycycpIHx8IGNlbGwuZ2V0QXR0cmlidXRlKCdoZWFkZXJzJykudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoY2VsbC5nZXRBdHRyaWJ1dGUoJ2hlYWRlcnMnKS50cmltKCkuc3BsaXQoXCIgXCIpLCB0ZEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGgnICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oY2VsbC5nZXRBdHRyaWJ1dGUoJ2lkJykudHJpbSgpLCB0aElkcyk7ICAgIFxuICAgICAgICAgICAgfSAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocGFzc2VkKSB7IC8vIGFsbCB0ZCBlbGVtZW50cyBoYXZlIGhlYWRlcnMsIHRvIGV4YW0gaWYgdGhlIGhlYWRlcnMgcG9pbnQgdG8gYSB0aCBpZFxuICAgICAgICAgICAgaWYgKHRoSWRzLmxlbmd0aCA+IDAgJiYgdGRIZWFkZXJzLmV2ZXJ5KGhlYWRlciA9PiB0aElkcy5pbmNsdWRlcyhoZWFkZXIpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTm9kZUluR3JpZChub2RlKSB7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUobm9kZSwgXCJncmlkXCIpICE9IG51bGw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNMYXlvdXRUYWJsZSh0YWJsZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwicHJlc2VudGF0aW9uXCIpIHx8IFJQVFV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwibm9uZVwiKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRGaWxlRXh0KHVybCkge1xuICAgICAgICBsZXQgbSA9IHVybC5tYXRjaCgvXFwuKChbXjs/I1xcLl18XiQpKykoWzs/I118JCkvKTtcbiAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIuXCIgKyBtWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEZpbGVBbmNob3IodXJsKSB7XG4gICAgICAgIGxldCBtID0gdXJsLm1hdGNoKC8jKChbXjs/XFwuXXxeJCkrKShbOz9dfCQpLyk7XG4gICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgcmV0dXJuIG1bMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tPYmpFbWJlZChub2RlLCBleHRUZXN0LCBtaW1lVGVzdCkge1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lICE9IFwib2JqZWN0XCIgJiYgbm9kZU5hbWUgIT0gXCJlbWJlZFwiICYmXG4gICAgICAgICAgICBub2RlTmFtZSAhPSBcImFcIiAmJiBub2RlTmFtZSAhPSBcImFyZWFcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIC8vIENoZWNrIG1pbWUgdHlwZVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCBtaW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcImNvZGV0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgbWltZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiY29kZXR5cGVcIik7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoZSBmaWxlbmFtZVxuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJlbWJlZFwiKSB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiYVwiIHx8IG5vZGVOYW1lID09PSBcImFyZWFcIikge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmhhc0F0dHJpYnV0ZShcImRhdGFcIikpIHtcbiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlbmFtZSA9PT0gbnVsbCkgZmlsZW5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IGV4dCA9IFJQVFV0aWwuZ2V0RmlsZUV4dChmaWxlbmFtZSk7XG4gICAgICAgICAgICByZXRWYWwgPSBleHRUZXN0KGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgZmlsZW5hbWVzIGluIHRoZSBwYXJhbXNcbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgbm9kZU5hbWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgQ2hlY2sgSGlkZGVuIE9wdGlvbiBpcyBzZXQgdGhlbiBjb21wbHkgd2l0aCB0aGF0IHNldHRpbmdcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSBSUFRVdGlsLmdldENoaWxkQnlUYWdIaWRkZW4obm9kZSwgXCJwYXJhbVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBwYXJhbXMgIT0gbnVsbCAmJiBpIDwgcGFyYW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gcGFyYW1zW2ldLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIGV4dFRlc3QoUlBUVXRpbC5nZXRGaWxlRXh0KHBhcmFtc1tpXS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNBdWRpb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgUlBUVXRpbC5pc0F1ZGlvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImF1ZGlvXCIpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzQXVkaW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCBhdWRpb19leHRlbnNpb25zID0gW1wiLmFpZlwiLCBcIi5haWZjXCIsIFwiLmFpZmZcIiwgXCIuYWlyXCIsIFwiLmFzZlwiLCBcIi5hdVwiLCBcIi5jZGFcIixcbiAgICAgICAgICAgIFwiLmRzbVwiLCBcIi5kc3NcIiwgXCIuZHdkXCIsIFwiLmlmZlwiLCBcIi5rYXJcIiwgXCIubTFhXCIsIFwiLm1lZFwiLFxuICAgICAgICAgICAgXCIubXAyXCIsIFwiLm1wM1wiLCBcIi5tcGFcIiwgXCIucGNtXCIsIFwiLnJhXCIsIFwiLnJhbVwiLCBcIi5ybVwiLFxuICAgICAgICAgICAgXCIuc2FtXCIsIFwiLnNmXCIsIFwiLnNmMlwiLCBcIi5zbXBcIiwgXCIuc25kXCIsIFwiLnN2eFwiLCBcIi51bFwiLFxuICAgICAgICAgICAgXCIudm9jXCIsIFwiLndhdlwiLCBcIi53bWFcIiwgXCIud3ZlXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwudmFsSW5BcnJheShleHQudG9Mb3dlckNhc2UoKSwgYXVkaW9fZXh0ZW5zaW9ucyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNWaWRlb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgUlBUVXRpbC5pc1ZpZGVvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcInZpZGVvXCIpIHx8XG4gICAgICAgICAgICAgICAgbWltZS5zdGFydHNXaXRoKFwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2hcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzVmlkZW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCB2aWRlb19leHRlbnNpb25zID0gW1wiLmFzZlwiLCBcIi5hdmlcIiwgXCIuZGl2eFwiLCBcIi5kdlwiLCBcIi5tMXZcIiwgXCIubTJwXCIsIFwiLm0ydlwiLCBcIi5tb292XCIsXG4gICAgICAgICAgICBcIi5tb3ZcIiwgXCIubXA0XCIsIFwiLm1wZWdcIiwgXCIubXBnXCIsIFwiLm1wdlwiLCBcIi5vZ21cIiwgXCIub21mXCIsIFwiLnF0XCIsXG4gICAgICAgICAgICBcIi5ybVwiLCBcIi5ydlwiLCBcIi5zbWlcIiwgXCIuc21pbFwiLCBcIi5zd2ZcIiwgXCIudm9iXCIsIFwiLndtdlwiLCBcIi5ybXZiXCIsXG4gICAgICAgICAgICBcIi5tdmJcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gUlBUVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCB2aWRlb19leHRlbnNpb25zKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0ltYWdlT2JqRW1iZWRMaW5rKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuY2hlY2tPYmpFbWJlZChub2RlLCBSUFRVdGlsLmlzSW1nRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImltYWdlXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0ltZ0V4dChleHQpIHtcbiAgICAgICAgbGV0IGltYWdlX2V4dGVuc2lvbnMgPSBbXCIuYm1wXCIsIFwiLmdpZlwiLCBcIi5qcGdcIiwgXCIuanBlZ1wiLCBcIi5wY3hcIiwgXCIucG5nXCJdO1xuICAgICAgICByZXR1cm4gUlBUVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBpbWFnZV9leHRlbnNpb25zKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0h0bWxFeHQoZXh0KSB7XG4gICAgICAgIGxldCBodG1sX2V4dGVuc2lvbnMgPSBbXCIuYXNwXCIsIFwiLmFzcHhcIiwgXCIuY2ZtXCIsIFwiLmNmbWxcIiwgXCIuY2dpXCIsIFwiLmh0bVwiLCBcIi5odG1sXCIsIFwiLnNodG1cIixcbiAgICAgICAgICAgIFwiLnNodG1sXCIsIFwiLnBocFwiLCBcIi5wbFwiLCBcIi5weVwiLCBcIi5zaHRtXCIsIFwiLnNodG1sXCIsIFwiLnhodG1sXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwudmFsSW5BcnJheShleHQudG9Mb3dlckNhc2UoKSwgaHRtbF9leHRlbnNpb25zKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc1ByZXNlbnRhdGlvbmFsRWxlbWVudChub2RlKSB7XG4gICAgICAgIC8vIEVsZW1lbnRzIGV4dHJhY3RlZCBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0hUTUwvRWxlbWVudCNJbmxpbmVfdGV4dF9zZW1hbnRpY3MsXG4gICAgICAgIC8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L2h0bWwtYXV0aG9yLyN0ZXh0LWxldmVsLXNlbWFudGljcyBhbmQgaHR0cHM6Ly93aWtpLndoYXR3Zy5vcmcvd2lraS9QcmVzZW50YXRpb25hbF9lbGVtZW50c19hbmRfYXR0cmlidXRlc1xuICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxFbGVtZW50cyA9IFtcImFiYnJcIiwgXCJiXCIsIFwiYmRpXCIsIFwiYmRvXCIsIFwiYnJcIiwgXCJjaXRlXCIsIFwiY29kZVwiLCBcImRhdGFcIiwgXCJkZm5cIixcbiAgICAgICAgICAgIFwiZW1cIiwgXCJpXCIsIFwia2JkXCIsIFwibWFya1wiLCBcInFcIiwgXCJycFwiLCBcInJ0XCIsIFwicnRjXCIsIFwicnVieVwiLCBcInNcIixcbiAgICAgICAgICAgIFwic2FtcFwiLCBcInNtYWxsXCIsIFwic3BhblwiLCBcInN0cm9uZ1wiLCBcInN1YlwiLCBcInN1cFwiLCBcInRpbWVcIiwgXCJ1XCIsXG4gICAgICAgICAgICBcInZhclwiLCBcIndiclwiLCBcImFcIiwgXCJwcm9ncmVzc1wiLCBcIm1ldGVyXCIsIFwiYmFzZWZvbnRcIiwgXCJiaWdcIiwgXCJjZW50ZXJcIixcbiAgICAgICAgICAgIFwic3RyaWtlXCIsIFwidHRcIiwgXCJmb250XCIsIFwiYmxpbmtcIiwgXCJoMVwiLCBcImgyXCIsIFwiaDNcIiwgXCJoNFwiLCBcImg1XCIsIFwiaDZcIixcbiAgICAgICAgICAgIFwiaHJcIiwgXCJibG9ja3F1b3RlXCIsIFwicFwiXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiBSUFRVdGlsLnZhbEluQXJyYXkobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBwcmVzZW50YXRpb25hbEVsZW1lbnRzKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBoYXNUcmlnZ2VyZWQoZG9jLCBpZCkge1xuICAgICAgICByZXR1cm4gZ2V0Q2FjaGUoZG9jLCBpZCwgZmFsc2UpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHRyaWdnZXJPbmNlKGRvYywgaWQsIHBhc3NlZCkge1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IHRyaWdnZXJlZCA9IGdldENhY2hlKGRvYywgaWQsIGZhbHNlKTtcbiAgICAgICAgc2V0Q2FjaGUoZG9jLCBpZCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0cmlnZ2VyZWQ7XG4gICAgfVxuXG4gICAgLyogZGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiB2YWx1ZSBleGlzdHMgaW4gdGhlIGdpdmVuIGFycmF5ICovXG4gICAgcHVibGljIHN0YXRpYyB2YWxJbkFycmF5KHZhbHVlLCBhcnIpIHtcbiAgICAgICAgZm9yIChsZXQgaWR4IGluIGFycikge1xuICAgICAgICAgICAgaWYgKGFycltpZHhdID09PSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgYW5jZXN0b3Igb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gdGFnTmFtZXMgc3RyaW5nLCBhcnJheSwgb3IgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSB0YWdzIHRvIHNlYXJjaCBmb3JcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yKGVsZW1lbnQsIHRhZ05hbWVzKSB7XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IGVsZW1lbnQ7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRoaXNUYWcgPSB3YWxrTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodGFnTmFtZXMpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNUYWcgPT09IHRhZ05hbWVzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0YWdOYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpZHggaW4gdGFnTmFtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ05hbWVzW2lkeF0gPT09IHRoaXNUYWcpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2Fsa05vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzVGFnIGluIHRhZ05hbWVzKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2Fsa05vZGU7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIHRydWUgaWYgZWxlbWVudDEgYW5kIGVsZW1lbnQyIGFyZSBzaWJsaW5nc1xuICAgIHB1YmxpYyBzdGF0aWMgaXNTaWJsaW5nKGVsZW1lbnQxLCBlbGVtZW50Mikge1xuICAgICAgICBpZiAoZWxlbWVudDEgJiYgZWxlbWVudDIpIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50MSkgJiYgRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudDEpLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudDEpLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT09IGVsZW1lbnQyKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQgcm9sZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIFRoZSByb2xlIHRvIHNlYXJjaCBmb3Igb24gYW4gZWxlbWVudCB1bmRlciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSB3YWxrTm9kZSAtIEEgcGFyZW50IG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcldpdGhSb2xlKGVsZW1lbnQsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGUod2Fsa05vZGUsIHJvbGVOYW1lLCBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZSh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgIH0gICBcbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIHdpdGggdGhlIGdpdmVuIHN0eWxlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHtbc3RyaW5nXX0gc3R5bGVQcm9wcyAtIFRoZSBzdHlsZSBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgb2YgdGhlIHBhcmVudCB0byBzZWFyY2ggZm9yLlxuICAgICAqICAgICAgICAgc3VjaCBhcyB7XCJvdmVyZmxvd1wiOlsnYXV0bycsICdzY3JvbGwnXSwgXCJvdmVyZmxvdy14XCI6WydhdXRvJywgJ3Njcm9sbCddfVxuICAgICAqICAgICAgICAgIG9yIHtcIm92ZXJmbG93XCI6WycqJ10sIFwib3ZlcmZsb3cteFwiOlsnKiddfSwgVGhlICcqJyBmb3IgYW55IHZhbHVlIHRvIGNoZWNrIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHN0eWxlIHByb3AuXG4gICAgICogQHBhcm0ge2Jvb2x9IGV4Y2x1ZGVkVmFsdWVzIC0gc3R5bGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQuXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHBhcmVudCBub2RlIG9mIHRoZSBlbGVtZW50LCB3aGljaCBoYXMgdGhlIHN0eWxlIHByb3BlcnRpZXNcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFN0eWxlcyhlbGVtLCBzdHlsZVByb3BzLCBleGNsdWRlZFZhbHVlcyA9W10pIHtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbTtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gZ2V0Q2FjaGUod2Fsa05vZGUsIFwiUlBUVXRpbF9BbmNlc3RvcldpdGhTdHlsZXNcIiwgbnVsbCk7XG4gICAgICAgICAgICBpZiAobm9kZSAhPT0gbnVsbCkgcmV0dXJuIG5vZGU7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IGdldERlZmluZWRTdHlsZXMod2Fsa05vZGUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdHlsZSBpbiBzdHlsZVByb3BzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gc3R5bGVzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zcGxpdChcIiBcIilbMF07IC8vZ2V0IHJpZCBvZiAhaW1wb3J0YW50XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhjbHVkZWRWYWx1ZXMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVQcm9wc1tzdHlsZV0uaW5jbHVkZXMoJyonKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhY2hlKHdhbGtOb2RlLCBcIlJQVFV0aWxfQW5jZXN0b3JXaXRoU3R5bGVzXCIsIHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2Fsa05vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlUHJvcHNbc3R5bGVdLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhY2hlKHdhbGtOb2RlLCBcIlJQVFV0aWxfQW5jZXN0b3JXaXRoU3R5bGVzXCIsIHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2Fsa05vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgIH0gIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q2FjaGUoZWxlbSwgXCJSUFRVdGlsX0FuY2VzdG9yV2l0aFN0eWxlc1wiLCB1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbm9kZSB3aGljaCBtYXRjaGVzIHRoZSByb2xlIGFuZCBpcyBhIHNpYmxpbmcgb2YgdGhlXG4gICAgICogcHJvdmlkZWQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYnkgZGVmYXVsdCB3aWxsIG5vdCBjb25zaWRlciBDaGVjayBIaWRkZW4gU2V0dGluZyBhdCBhbGwuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogUlBUVXRpbC5nZXRTaWJsaW5nV2l0aFJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHNpYmxpbmcgbm9kZVxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGUgLSBUaGUgcm9sZSB0byBzZWFyY2ggZm9yIG9uIGFuIGVsZW1lbnQgdW5kZXIgdGhlIHByb3ZpZGVkIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IHdhbGtOb2RlIC0gQSBzaWJsaW5nIG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaWJsaW5nV2l0aFJvbGUoZWxlbWVudCwgcm9sZSkge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5nZXRTaWJsaW5nV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgYSBub2RlIHdoaWNoIG1hdGNoZXMgdGhlIHJvbGUgYW5kIGlzIGEgc2libGluZyBvZiB0aGVcbiAgICAgKiBwcm92aWRlZCBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNvbnNpZGVycyBpbXBsaWNpdCByb2xlcyBmb3IgdGhlIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gY29uc2lkZXIgZWxlbWVudHMgdGhhdCBhcmUgaGlkZGVuIGJhc2VkIG9uIHRoZSBpZiB0aGUgQ2hlY2tcbiAgICAgKiBIaWRkZW4gQ29udGVudCBzZXR0aW5ncyBzaG91bGQgYmUgY29uc2lkZXJlZCBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBzaWJsaW5nIG5vZGVcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlIC0gVGhlIHJvbGUgdG8gc2VhcmNoIGZvciBvbiBhbiBlbGVtZW50IHVuZGVyIHRoZSBwcm92aWRlZCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXQgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIEltcGxpY2l0IHJvbGVzIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHNpYmxpbmcgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFNpYmxpbmdXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlLCBjb25zaWRlckhpZGRlblNldHRpbmcsIGNvbnNpZGVySW1wbGljaXRSb2xlPykge1xuXG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xhcmF0aW9uXG4gICAgICAgIGxldCB3YWxrTm9kZSA9IG51bGw7XG4gICAgICAgIGxldCBoYXNSb2xlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gT25seSBwZXJmb3JtIHRoZSBjaGVjayBpZiBlbGVtZW50IGFuZCByb2xlIGFyZSBib3RoIHByb3ZpZGVkXG4gICAgICAgIGlmIChlbGVtZW50ICYmIHJvbGUpIHtcbiAgICAgICAgICAgIC8vIEZldGNoIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudFxuICAgICAgICAgICAgd2Fsa05vZGUgPSBlbGVtZW50Lm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICAvLyBLZWVwIGxvb3Bpbmcgb3ZlciB0aGUgbmV4dCBzaWJsaW5ncyB0byBmaW5kIGVsZW1lbnQgd2hpY2ggbWF0Y2hlc1xuICAgICAgICAgICAgLy8gdGhlIHByb3ZpZGVkIHJvbGUuXG4gICAgICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwgJiYgIWhhc1JvbGUpIHtcblxuICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiBSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4od2Fsa05vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgb24gdG8gdGhlIG5leHQgbm9kZVxuICAgICAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgdGhhdCB3ZSBuZWVkIHRvIGNoZWNrIGV4aXN0c1xuICAgICAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNSb2xlID0gUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBSUFRVdGlsLmhhc1JvbGUod2Fsa05vZGUsIHJvbGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB3ZSBzdGlsbCBoYXZlIG5vdCBmb3VuZCBhIG5vZGUgdGhhdCBtYXRjaGVzIHRoZSByb2xlLCBzdGFydCBhIHJldmVyc2UgbG9vayB1cFxuICAgICAgICAgICAgaWYgKCF3YWxrTm9kZSkge1xuICAgICAgICAgICAgICAgIC8vIEZldGNoIHRoZSBwcmV2aW91cyBTaWJsaW5nIG9mIHRoaXMgZWxlbWVudFxuICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gZWxlbWVudC5wcmV2aW91c1NpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAvLyBLZWVwIGxvb3Bpbmcgb3ZlciBhbGwgdGhlIHByZXZpb3VzIHNpYmxpbmdzIHRvIHNlYXJjaCBmb3IgYW4gZWxlbWVudCB3aGljaFxuICAgICAgICAgICAgICAgIC8vIG1hdGNoZXMgdGhlIHByb3ZpZGVkIHJvbGUuXG4gICAgICAgICAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsICYmICFoYXNSb2xlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gIDEuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiBSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4od2Fsa05vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUucHJldmlvdXNTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgdGhhdCB3ZSBuZWVkIHRvIGNoZWNrIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICBoYXNSb2xlID0gUlBUVXRpbC5oYXNSb2xlKHdhbGtOb2RlLCByb2xlLCBjb25zaWRlckltcGxpY2l0Um9sZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRGVzY2VuZGFudChwYXJlbnQsIGNoaWxkKSB7XG4gICAgICAgIGxldCBub2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoY2hpbGQpO1xuICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobm9kZSA9PT0gcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vY2hlY2sgaWYgdGhlIGZpcnN0IGZvcm0gY29udHJvbCBjaGlsZCBpcyBkaXNhYmxlZFxuICAgIHB1YmxpYyBzdGF0aWMgaXNEaXNhYmxlZEJ5Rmlyc3RDaGlsZEZvcm1FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGZvcm1FbGVtZW50cyA9IFtcImlucHV0XCIsIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJrZXlnZW5cIiwgXCJwcm9ncmVzc1wiLCBcIm1ldGVyXCIsIFwib3V0cHV0XCJdO1xuICAgICAgICBpZiAoZWxlbWVudC5maXJzdENoaWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZm9ybUVsZW1lbnRzLmluY2x1ZGVzKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQobncubm9kZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0Rpc2FibGVkQnlSZWZlcnJpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgbGV0IGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgbGV0IHJvb3QgPSBkb2MuYm9keTtcbiAgICAgICAgd2hpbGUgKERPTVdhbGtlci5wYXJlbnROb2RlKHJvb3QpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgIHJvb3QgPSBET01XYWxrZXIucGFyZW50Tm9kZShyb290KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihyb290KTtcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBlbGVtZW50IHdob3NlICdhcmlhLWRlc2NyaWJlZGJ5JyBlcXVhbHMgdG8gdGhlIGlkXG4gICAgICAgICAgICBpZiAobncubm9kZSAmJiBudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIG53LmVsZW0oKSkge1xuICAgICAgICAgICAgICAgIGxldCBBcmlhRGVzY3JpYmVkYnlJREFycmF5ID0gKG53LmVsZW0oKS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpIHx8IFwiXCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYURlc2NyaWJlZGJ5SURBcnJheS5pbmNsdWRlcyhpZCkgJiYgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIGEgZGVzY2VuZGFudCBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCByb2xlLCB1bmRlclxuICAgICAqIHRoZSBlbGVtZW50IHRoYXQgd2FzIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogTm90ZSBieSBkZWZhdWx0IHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgY29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogUlBUVXRpbC5nZXREZXNjZW5kYW50V2l0aFJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gcGFyZW50IGVsZW1lbnQgZm9yIHdoaWNoIHdlIHdpbGwgYmUgY2hlY2tpbmcgZGVzY2VuZGFudHMgZm9yXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgZGVzY2VuZGFudHMgZWxlbWVudHNcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRlc2NlbmRhbnQgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHJvbGUgc3BlY2lmaWVkIChvbmx5IG9uZSlcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXNjZW5kYW50V2l0aFJvbGUoZWxlbWVudCwgcm9sZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuZ2V0RGVzY2VuZGFudFdpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGVOYW1lLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhIGRlc2NlbmRhbnQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcm9sZSwgdW5kZXJcbiAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwcm92aWRlZC4gVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGVsZW1lbnRzIHdpdGggaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGRlc2NlbmRhbnRzIGZvclxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGRlc2NlbmRhbnRzIGVsZW1lbnRzXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRlc2NlbmRhbnQgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHJvbGUgc3BlY2lmaWVkIChvbmx5IG9uZSlcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXNjZW5kYW50V2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykge1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgZGVzY2VuZGFudCA9IG51bGw7XG4gICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKGVsZW1lbnQpO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgZWxlbWVudCBwcm92aWRlZCBhbmQgY2hlY2sgaWYgdGhlIHJvbGVuYW1lIHByb3ZpZGVkIGV4aXN0c1xuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQgJiYgbncubm9kZSAhPSBlbGVtZW50Lm5leHRTaWJsaW5nKSB7XG5cbiAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgLy8gIDEuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSByb2xlIHNwZWNpZmllZCwgaWYgaXQgZG9lcyB0aGVuIHNldCB0aGlzIGFzIHRoZSBkZXNjZW5kYW50IGFuZCBzdG9wIGNoZWNraW5nIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSBpbXBsaWNpdCByb2xlcywgaWYgaXQgZG9lcyB0aGVuIHNldCB0aGlzIGFzIHRoZSBkZXNjZW5kYW50IGFuZCBzdG9wIGNoZWNraW5nIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJJbXBsaWNpdFJvbGVzID8gUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mobncubm9kZSwgcm9sZU5hbWUpIDogUlBUVXRpbC5oYXNSb2xlKG53Lm5vZGUsIHJvbGVOYW1lLCBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICBkZXNjZW5kYW50ID0gbncubm9kZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjZW5kYW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkZXNjZW5kYW50IGVsZW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCByb2xlLCB1bmRlclxuICAgICAqIHRoZSBlbGVtZW50IHRoYXQgd2FzIHByb3ZpZGVkLiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgZWxlbWVudHMgd2l0aCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gcGFyZW50IGVsZW1lbnQgZm9yIHdoaWNoIHdlIHdpbGwgYmUgY2hlY2tpbmcgZGVzY2VuZGFudHMgZm9yXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgZGVzY2VuZGFudHMgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZGVzY2VuZGFudCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgcm9sZSBzcGVjaWZpZWQgKG9ubHkgb25lKVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFsbERlc2NlbmRhbnRzV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50cyA9IFtdO1xuICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcblxuICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBjaGlsZHJlbnMgb2YgdGhlIGVsZW1lbnQgcHJvdmlkZWQgYW5kIGNoZWNrIGlmIHRoZSByb2xlbmFtZSBwcm92aWRlZCBleGlzdHNcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50ICYmIG53Lm5vZGUgIT0gZWxlbWVudC5uZXh0U2libGluZykge1xuICAgICAgICAgICAgaWYgKG53LmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgLy8gIDEuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSByb2xlIHNwZWNpZmllZCwgaWYgaXQgZG9lcyB0aGVuIHNldCB0aGlzIGFzIHRoZSBkZXNjZW5kYW50IGFuZCBzdG9wIGNoZWNraW5nIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSBpbXBsaWNpdCByb2xlcywgaWYgaXQgZG9lcyB0aGVuIHNldCB0aGlzIGFzIHRoZSBkZXNjZW5kYW50IGFuZCBzdG9wIGNoZWNraW5nIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlKG53Lm5vZGUsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXMpKSB7XG4gICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChudy5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkaXJlY3QgY2hpbGRyZW4gaW4gQVQgdHJlZSB3aXRoIGEgcm9sZSAoZXhjbHVkZSBub25lIGFuZCBwcmVzZW50YXRpb24pXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGNoaWxkcmVuIGZvclxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRpcmVjdCBjaGlsZCBlbGVtZW50cyBpbiBBVCB0cmVlIHRoYXQgaGFzIGEgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICAgcHVibGljIHN0YXRpYyBnZXREaXJlY3RBVENoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlcyA9IFJQVFV0aWwuZ2V0UmVxdWlyZWRDaGlsZFJvbGVzKGVsZW1lbnQsIHRydWUpO1xuICAgICAgICBsZXQgZGlyZWN0OiBBcnJheTxIVE1MRWxlbWVudD4gPSBbXTtcbiAgICAgICAgUlBUVXRpbC5yZXRyaWV2ZURpcmVjdEFUQ2hpbGRyZW4oZWxlbWVudCwgcmVxdWlyZWRDaGlsZFJvbGVzLCBkaXJlY3QpO1xuICAgICAgICByZXR1cm4gZGlyZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJlY3Vyc2l2ZWx5IGFueSBjaGlsZCBwYXRoIHRpbGwgZWl0aGVyIG5vIGNoaWxkIG9yIGEgY2hpbGQgd2l0aCBhIHJvbGUgaXMgZm91bmQgKGV4Y2x1ZGUgbm9uZSBhbmQgcHJlc2VudGF0aW9uKVxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBwYXJlbnQgZWxlbWVudCBmb3Igd2hpY2ggd2Ugd2lsbCBiZSBjaGVja2luZyBjaGlsZHJlbiBmb3JcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkaXJlY3QgY2hpbGQgZWxlbWVudHMgaW4gQVQgdHJlZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICAgcHVibGljIHN0YXRpYyByZXRyaWV2ZURpcmVjdEFUQ2hpbGRyZW4oZWxlbWVudCwgcmVxdWlyZWRDaGlsZFJvbGVzLCBkaXJlY3Q6IEFycmF5PEhUTUxFbGVtZW50Pikge1xuICAgICAgICBsZXQgY2hpbGRyZW4gOiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgICAgIGlmIChlbGVtZW50LmNoaWxkcmVuICE9PSBudWxsICYmIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goZWxlbWVudC5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgXCJhcmlhLW93blwiIGF0dHJpYnV0ZSwgdGhlbiB0aGUgYXJpYS1vd25lZCBjaGlsZHJlbiBuZWVkIHRvIGJlIGluY2x1ZGVkIHRvb1xuICAgICAgICBsZXQgb3duZWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKTtcbiAgICAgICAgaWYgKG93bmVkKSB7XG4gICAgICAgICAgICBsZXQgZG9jID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICAgIGxldCBvd25lZElkcyA9IG93bmVkLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBvd25lZElkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWRFbGVtID0gZG9jLmdldEVsZW1lbnRCeUlkKG93bmVkSWRzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChvd25lZEVsZW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvL2lnbm9yZSBoaWRkZW4gYW5kIGludmlzaWJsZSBjaGlsZFxuICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChjaGlsZHJlbltpXSkgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZHJlbltpXSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMoY2hpbGRyZW5baV0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZXMgPT09IG51bGwgfHwgcm9sZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGVzID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUoY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyb2xlcyAmJiByb2xlcyAhPT0gbnVsbCAmJiByb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vcmVtb3ZlICdub25lJyBhbmQgJ3ByZXNlbnRhdGlvbidcbiAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSByb2xlcy5maWx0ZXIoZnVuY3Rpb24ocm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGUgIT09IFwibm9uZVwiICYmIHJvbGUgIT09IFwicHJlc2VudGF0aW9uXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSAnZ3JvdXAnIHJvbGUgaXMgYWxsb3dlZCBidXQgbm90IHJlcXVpcmVkIGZvciBzb21lIGVsZW1lbnRzIHNvIHJlbW92ZSBpdCBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVzLmluY2x1ZGVzKFwiZ3JvdXBcIikgJiYgcmVxdWlyZWRDaGlsZFJvbGVzICYmIHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmNsdWRlcygnZ3JvdXAnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSByb2xlcy5maWx0ZXIoZnVuY3Rpb24ocm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByb2xlICE9PSAnZ3JvdXAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzICE9PSBudWxsICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0LnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZSB1bnRpbCBnZXQgYSByZXR1cm4gdmFsdWUsIFxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLnJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihjaGlsZHJlbltpXSwgcmVxdWlyZWRDaGlsZFJvbGVzLCBkaXJlY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBvciByZXF1aXJlZCBjaGlsZCByb2xlcyBmb3IgYSBnaXZlbiBlbGVtZW50IHdpdGggb25lIG1vcmUgcm9sZXMsXG4gICAgICogcmV0dXJuIG51bGwgaWYgdGhlIHJvbGUgaXMgJ25vbmUnIG9yICdwcmVzZW50YXRpb24nXG4gICAgICogQHBhcmFtIGVsZW1lbnQgXG4gICAgICogQHBhcmFtIGluY2x1ZGVJbXBsaWNpdCBpbmNsdWRlIGltcGxpY2l0IHJvbGVzIGlmIG5vIHJvbGUgaXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVxdWlyZWRDaGlsZFJvbGVzKGVsZW1lbnQsIGluY2x1ZGVJbXBsaWNpdDogYm9vbGVhbikgOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCByb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICgoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgJiYgaW5jbHVkZUltcGxpY2l0KSB7XG4gICAgICAgICAgICByb2xlcyA9IFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvKiogIFxuICAgICAgICAgKiBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlXG4gICAgICAgICovXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLyoqICBcbiAgICAgICAgICogaWdub3JlIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb3IgcHJlc2VudGF0aW9uIHJvbGVcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IHByZXNlbnRhdGlvblJvbGVzID0gW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXTtcbiAgICAgICAgY29uc3QgZm91bmQgPSByb2xlcy5zb21lKHIgPT4gcHJlc2VudGF0aW9uUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlczogc3RyaW5nW10gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0ucmVxQ2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZENoaWxkUm9sZXMgPSBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLnJlcUNoaWxkcmVuLCByZXF1aXJlZENoaWxkUm9sZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1aXJlZENoaWxkUm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhbiBlbGVtZW50IHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgdGhlXG4gICAgICogcm9sZSB0aGF0IHdhcyBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIGJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZy5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBSUFRVdGlsLmdldEFyaWFPd25zV2l0aFJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBjaGVjayBmb3IgYXJpYS1vd25zXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgYXJpYS1vd25zIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGVsZW1lbnQgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGFyaWEtb3ducyBhbmQgaGFzIHJvbGUgc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFyaWFPd25zV2l0aFJvbGUoZWxlbWVudCwgcm9sZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuZ2V0QXJpYU93bnNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYW4gZWxlbWVudCByZWZlcmVuY2VkIGJ5IGFyaWEtb3ducyBhbmQgaGFzIHRoZVxuICAgICAqIHJvbGUgdGhhdCB3YXMgc3BlY2lmaWVkLiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgZWxlbWVudHMgd2l0aCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBjaGVjayBmb3IgYXJpYS1vd25zXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgYXJpYS1vd25zIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZWxlbWVudCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgcm9sZSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXJpYU93bnNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCByZWZlcmVuY2VkRWxlbWVudCA9IG51bGw7XG4gICAgICAgIGxldCByZWZlcmVuY2VkRWxlbUhhc1JvbGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSBhcmlhLW93bnMgaXMgbm90IG9uIHRoZSBlbGVtZW50IGp1c3QgYnJlYWsgb3V0IG9mIHRoaXMgZnVuY3Rpb24gd2l0aCBudWxsXG4gICAgICAgIGlmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYXJpYS1vd25zXCIpKSB7XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgcmVmZXJlbmNlIElEXG4gICAgICAgICAgICBsZXQgcmVmZXJlbmNlSUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKTtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBlbGVtZW50IGZvciB0aGUgcmVmZXJlbmNlIElEXG4gICAgICAgICAgICByZWZlcmVuY2VkRWxlbWVudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnQsIHJlZmVyZW5jZUlEKTtcbiAgICAgICAgICAgIC8vaWdub3JlIGlmIHRoZSBhcmlhLW93bnMgcG9pbnQgdG8gdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgICAgICAgICBpZiAoRE9NVXRpbC5zYW1lTm9kZShlbGVtZW50LCByZWZlcmVuY2VkRWxlbWVudCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgLy8gIDEuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgcmVmZXJlbmNlZEVsZW1lbnQgIT0gbnVsbCAmJiBSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocmVmZXJlbmNlZEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1IYXNSb2xlID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1IYXNSb2xlID0gUlBUVXRpbC5oYXNSb2xlKHJlZmVyZW5jZWRFbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmZXJlbmNlZEVsZW1IYXNSb2xlID8gcmVmZXJlbmNlZEVsZW1lbnQgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKiBnZXQgZWxlbWVudCBjb250YWluaW5nIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQgYmVjYXVzZSB0aGUgZnVuY3Rpb24gbmFtZSBpcyBtaXNsZWFkaW5nLiBVc2UgZ2V0TGFiZWxGb3JFbGVtZW50KGVsZW1lbnQpIGluc3RlYWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldElucHV0TGFiZWwoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5nZXRMYWJlbEZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyB0aGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBsYWJlbCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogUlBUVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZWxlbWVudCBmb3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtlbGVtZW50fSBlbGVtZW50IC0gcmV0dXJuIHRoZSBlbGVtZW50IGZvciB0aGUgbGFiZWwsIG90aGVyd2lzZSBudWxsXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TGFiZWxGb3JFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKGVsZW1lbnQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgY29udGFpbmluZyBsYWJsZSBlbGVtZW50IGlzIGhpZGRlbiwgd2hlbiB0aGUgaWdub3JlSGlkZGVuIG9wdGlvblxuICAgICAqIGlzIHNldCB0byB0cnVlLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBsYWJlbCBlbGVtZW50IGZvci5cbiAgICAgKiBAcGFybSB7Ym9vbGVhbn0gaWdub3JlSGlkZGVuIC0gdHJ1ZSBpZiBoaWRkZW4gZWxlbWVudHMgd2l0aCBsYWJlbCBzaG91bGQgYmUgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtlbGVtZW50fSBlbGVtZW50IC0gcmV0dXJuIHRoZSBlbGVtZW50IGZvciB0aGUgbGFiZWwsIG90aGVyd2lzZSBudWxsXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKGVsZW1lbnQ6IEVsZW1lbnQsIGlnbm9yZUhpZGRlbikge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgZ2xvYmFsIFJQVFV0aWxfTEFCRUxTIGhhc2ggaXMgYXZhaWxhYmxlLCBhcyB0aGlzIHdpbGwgY29udGFpbiB0aGUgbGFiZWwgbm9kZXMgYmFzZWQgb25cbiAgICAgICAgLy8gZm9yIGF0dHJpYnV0ZS5cbiAgICAgICAgLy9pZiAoIWdldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCxcIlJQVFV0aWxfTEFCRUxTXCIsIG51bGwpKSB7XG4gICAgICAgIGxldCByb290ID0gZWxlbWVudC5nZXRSb290Tm9kZSgpO1xuICAgICAgICBpZiAoIWdldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSk/IDxTaGFkb3dSb290PnJvb3QgOiA8RG9jdW1lbnQ+cm9vdCwgXCJSUFRVdGlsX0xBQkVMU1wiLCBudWxsKSkge1xuICAgICAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgICAgIGxldCBpZFRvTGFiZWwgPSB7fVxuXG4gICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSBsYWJlbCBlbGVtZW50cyBpbiB0aGUgZW50aXJlIGRvY1xuICAgICAgICAgICAgbGV0IGxhYmVsTm9kZXMgPSBSUFRVdGlsLmdldERvY0VsZW1lbnRzQnlUYWcoZWxlbWVudCwgXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGxhYmVsIG5vZGVzLCBpbiB0aGUgY2FzZSB0aGUgbGFiZWwgbm9kZSBoYXMgYSBmb3IgYXR0cmlidXRlLFxuICAgICAgICAgICAgLy8gZXh0cmFjdCB0aGF0IGF0dHJpYnV0ZSBhbmQgYWRkIHRoaXMgbm9kZSB0byB0aGUgaGFzaCBpZiBpdCBpcyB2aXNpYmxlLlxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYWJlbE5vZGVzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAobGFiZWxOb2Rlc1tpXS5oYXNBdHRyaWJ1dGUoXCJmb3JcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaWdub3JlIGhpZGRlbiBpcyBzcGVjaWZpZWQgYW5kIHRoZSBub2RlIGlzIG5vdCB2aXNpYmxlIHdlIGRvIG5vdCBhZGQgaXQgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGxhYmVsTm9kZXMgaGFzaC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlnbm9yZUhpZGRlbiAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGxhYmVsTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlkVG9MYWJlbFtsYWJlbE5vZGVzW2ldLmdldEF0dHJpYnV0ZShcImZvclwiKV0gPSBsYWJlbE5vZGVzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBidWlsdCBoYXNoIHRvIHRoZSBvd25lckRvY3VtZW50IChkb2N1bWVudCksIHRvIGJlIHVzZWQgbGF0ZXIgdG8gZmFzdCByZXRyaXZhbFxuICAgICAgICAgICAgLy9zZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiUlBUVXRpbF9MQUJFTFNcIiwgaWRUb0xhYmVsKTtcbiAgICAgICAgICAgIHNldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSk/IDxTaGFkb3dSb290PnJvb3QgOiA8RG9jdW1lbnQ+cm9vdCwgXCJSUFRVdGlsX0xBQkVMU1wiLCBpZFRvTGFiZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhpcyBlbGVtZW50IGhhcyBhbiBpZCBhdHRyaWJ1dGUsIGdldCB0aGUgY29yb3Nwb25kaW5nIGxhYmVsIGVsZW1lbnRcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICAgICAgICAgIC8vIEZldGNoIHRoZSBpZCBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGxldCBjdHJsSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBjb3Jvc3BvbmRpbmcgbGFiZWwgZWxlbWVudC5cbiAgICAgICAgICAgIC8vIE5vdGU6IGluIHRoZSBjYXNlIHRoYXQgdGhlIHRoZSBpZCBpcyBub3QgZm91bmQgaW4gdGhlIGhhc2ggdGhhdCBtZWFucywgaXQgZG9lcyBub3QgZXhpc3RzIG9yIGlzIGhpZGRlblxuICAgICAgICAgICAgaWYgKGN0cmxJZC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vcmV0dXJuIGdldENhY2hlKGVsZW1lbnQuZ2V0Um9vdE5vZGUoKS5vd25lckRvY3VtZW50LFwiUlBUVXRpbF9MQUJFTFNcIix7fSlbY3RybElkXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2FjaGUoKHJvb3Qubm9kZVR5cGUgPT09IDExKT8gPFNoYWRvd1Jvb3Q+cm9vdCA6IDxEb2N1bWVudD5yb290LCBcIlJQVFV0aWxfTEFCRUxTXCIse30pW2N0cmxJZF07XG4gICAgICAgICAgICB9IFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qIFJldHVybiBzcGVjaWZpZWQgZWxlbWVudCBhdHRyaWJ1dGUgaWYgcHJlc2VudCBlbHNlIHJldHVybiBudWxsICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFbGVtZW50QXR0cmlidXRlKGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgICAgLy9yZXR1cm4gKGVsZW1lbnQgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cikpID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cikgOiBudWxsO1xuICAgICAgICBpZiAoIWF0dHIgfHwgIWVsZW1lbnQgfHwgIWVsZW1lbnQuaGFzQXR0cmlidXRlIHx8ICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGF0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cilcbiAgICAgICAgaWYgKCFBUklBRGVmaW5pdGlvbnMucmVmZXJlbmNlUHJvcGVydGllcy5pbmNsdWRlcyhhdHRyKSlcbiAgICAgICAgICAgIHJldHVybiBhdHJWYWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vYXR0ciBpcyBhIHJlZmVyZW5jZSB0byBvdGhlciBlbGVtZW50cyhzKVxuICAgICAgICBjb25zdCB2YWx1ZXMgPSBhdHJWYWx1ZS5zcGxpdCgvICsvZyk7XG4gICAgICAgIC8vaWdub3JlIGlmIG5vbmUgb2YgdGhlIHJlZmVycmVkIGVsZW1lbnQocykgZXhpc3Qgb3IgYWxsIHBvaW50IHRvIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgICAgICBsZXQgZXhpc3QgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaWQ9MDsgdmFsdWVzIDwgdmFsdWVzLmxlbmd0aDsgKytpZCkge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJyZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2YWx1ZXNbaWRdKTtcbiAgICAgICAgICAgIGlmIChyZWZlcnJlZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShyZWZlcnJlZCwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBleGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4aXN0ID8gYXRyVmFsdWUgOiBudWxsOyAgIFxuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBBUklBIGxhYmVsXG4gICAgcHVibGljIHN0YXRpYyBoYXNBcmlhTGFiZWwoZWxlbWVudCkge1xuXG4gICAgICAgIC8vIFJwdF9BcmlhX1ZhbGlkSWRSZWYgZGV0ZXJtaW5lcyBpZiB0aGUgYXJpYS1sYWJlbGxlZGJ5IGlkIHBvaW50cyB0byBhIHZhbGlkIGVsZW1lbnRcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsXCIpIHx8IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsbGVkYnlcIik7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgZWxlbWVudCBoYXMgdmFsaWQgaW1wbGljaXQgbGFiZWxcbiAgICBwdWJsaWMgc3RhdGljIGhhc0ltcGxpY2l0TGFiZWwoZWxlbWVudCkge1xuICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IFJQVFV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgXCJsYWJlbFwiKTtcbiAgICAgICAgLy8gVGVzdCAgYSkgaWYgdGhlIHBhcmVudCBpcyBhIGxhYmVsIHdoaWNoIGlzIHRoZSBpbXBsaWNpdCBsYWJlbFxuICAgICAgICAvLyAgICAgICBiKSBpZiB0aGUgZm9ybSBlbGVtZW50IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYykgaWYgdGhlIGZvcm0gZWxlbWVudCByZXF1aXJlcyBhbiBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCA6IFwiaW5wdXRcIiwgIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJrZXlnZW5cIiwgXCJwcm9ncmVzc1wiLCBcIm1ldGVyXCIsIFwib3V0cHV0XCJcbiAgICAgICAgLy8gZm9ybSBlbGVtZW50cyB0aGF0IGRvIG5vdCByZXF1aXJlIGltcGxpY2l0IG9yIGV4cGxpY2l0IGxhYmVsIGVsZW1lbnQgYXJlOlxuICAgICAgICAvLyBcIm9wdGdyb3VwXCIsIFwib3B0aW9uXCIsIFwiZGF0YWxpc3RcIihhZGRlZCBsYXRlcikuIFRoZXNlIHdlcmUgaGFuZGxlZCBkaWZmZXJlbnRseSBpbiB0aGUgbWFpbiBydWxlLCBtaWdodCBuZWVkIHRvIHJlZmFjdG9yIHRoZSBjb2RlIGxhdGVyXG5cbiAgICAgICAgaWYgKHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibGFiZWxcIiAmJiBSUFRVdGlsLmlzRmlyc3RGb3JtRWxlbWVudChwYXJlbnROb2RlLCBlbGVtZW50KSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudENsb25lID0gcGFyZW50Tm9kZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAvLyBleGNsdWRlIGFsbCBmb3JtIGVsZW1lbnRzIGZyb20gdGhlIGxhYmVsIHNpbmNlIHRoZXkgbWlnaHQgYWxzbyBoYXZlIGlubmVyIGNvbnRlbnRcbiAgICAgICAgICAgIHBhcmVudENsb25lID0gUlBUVXRpbC5yZW1vdmVBbGxGb3JtRWxlbWVudHNGcm9tTGFiZWwocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgcmV0dXJuIFJQVFV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHBhcmVudENsb25lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNGaXJzdEZvcm1FbGVtZW50KHBhcmVudE5vZGUsIGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGZvcm1FbGVtZW50c1JlcXVpcmluZ0xhYmVsID0gW1wiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiLCBcImtleWdlblwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJvdXRwdXRcIl07XG4gICAgICAgIGlmIChwYXJlbnROb2RlLmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIocGFyZW50Tm9kZSk7XG4gICAgICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGlmIChmb3JtRWxlbWVudHNSZXF1aXJpbmdMYWJlbC5pbmRleE9mKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudy5ub2RlID09PSBlbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYSBzaGFkb3cgaG9zdCBvciBkZXNjZW5kYW50IG9mIGEgc2hhZG93IGhvc3QsIGJ1dCBub3QgYSBkZXNjZWRhbnQgb2YgdGhlIHNoYWRvdyByb290IG9mIHRoZSBob3N0ICh0byBiZSBhc3NpZ25lZCB0byBzaGFkb3cgc2xvdCBvciBpZ25vcmVkKSAgXG4gICAgcHVibGljIHN0YXRpYyBpc1NoYWRvd0hvc3RFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKFJQVFV0aWwuaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQpKSBcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHdhbGtOb2RlIDogRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLnNoYWRvd1Jvb3QpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vY2hlY2sgaWYgYW4gZWxlbWVudCBpcyBpbiBhIHNoYWRvdyB0cmVlXG4gICAgcHVibGljIHN0YXRpYyBpc1NoYWRvd0VsZW1lbnQoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBsZXQgcm9vdCAgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIGlmIChyb290LnRvU3RyaW5nKCkgPT09IFwiW29iamVjdCBTaGFkb3dSb290XVwiKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlbW92ZUFsbEZvcm1FbGVtZW50c0Zyb21MYWJlbChlbGVtZW50KSB7XG4gICAgICAgIGxldCBmb3JtRWxlbWVudHMgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwiYnV0dG9uXCIsIFwiZGF0YWxpc3RcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImtleWdlblwiLCBcIm91dHB1dFwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIl07XG4gICAgICAgIGxldCBjaGlsZE5vZGVzID0gZWxlbWVudC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChmb3JtRWxlbWVudHMuaW5kZXhPZihjaGlsZE5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgQVJJQSBsYWJlbHNcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbHNMb2NhbGx5KGVsZW1lbnRzLCBpc0dsb2JhbCkge1xuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBkb2MgPSBlbGVtZW50c1swXS5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgaGFzRHVwbGljYXRlTGFiZWxzID0gZmFsc2U7XG4gICAgICAgIGxldCB1bmlxdWVBcmlhTGFiZWxzID0gbnVsbDtcblxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIHVuaXF1ZUFyaWFMYWJlbHMgPSBnZXRDYWNoZShkb2MsIFwiUlBUVXRpbF9IQVNfVU5JUVVFX0FSSUFfTEFCRUxTXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmlxdWVBcmlhTGFiZWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgIWhhc0R1cGxpY2F0ZUxhYmVscyAmJiBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgYXJpYUxhYmVsID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IGFyaWFMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW2FyaWFMYWJlbF0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnRzW2ldLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gbGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlbWVudHNbaV0pID8gUlBUVXRpbC5nZXRJbm5lclRleHQobGFiZWxOb2RlKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub3JtYWxpemVkTGFiZWwgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcobGFiZWwpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IG5vcm1hbGl6ZWRMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW25vcm1hbGl6ZWRMYWJlbF0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSGFzIG5vIGxhYmVsIGF0IGFsbFxuICAgICAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIHNldENhY2hlKGRvYywgXCJSUFRVdGlsX0hBU19VTklRVUVfQVJJQV9MQUJFTFNcIiwgdW5pcXVlQXJpYUxhYmVscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFoYXNEdXBsaWNhdGVMYWJlbHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhTGFiZWwoZWxlKSB7XG4gICAgICAgIGlmIChlbGUuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBpZiAoZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gbGFiZWxJRHMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZSwgbGFiZWxJRCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGxhYmVsTm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbE5vZGUsIGVsZSkgPyBSUFRVdGlsLmdldElubmVyVGV4dChsYWJlbE5vZGUpIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZExhYmVsICs9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhsYWJlbCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRMYWJlbC50cmltKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhlbGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgIC8vY29uc3QgbGFiZWwgPSBSUFRVdGlsLmdldExhYmVsRm9yRWxlbWVudChlbGUpO1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBSUFRVdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihlbGUsIHRydWUpO1xuICAgICAgICAgICAgaWYgKCFsYWJlbCkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICByZXR1cm4gKFJQVFV0aWwuZ2V0QXJpYUxhYmVsKGxhYmVsKSB8fCBsYWJlbC5pbm5lclRleHQgfHwgXCJcIikudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqIEBwYXJhbSBpZFN0ciBcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFueSBvbmUgKGlmIG11bHRpcGxlIElkcykgaWQgcG9pbnRzIHRvIGl0c2VsZlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNJZFJlZmVyVG9TZWxmKGVsZW1lbnQsIGlkU3RyOlN0cmluZykge1xuICAgICAgICBpZiAoIWlkU3RyIHx8IGlkU3RyLnRyaW0oKSA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGlkcyA9IGlkU3RyLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgIGZvciAobGV0IGogPSAwLCBsZW5ndGggPSBpZHMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGxldCByZWZlcnJlZE5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtZW50LCBpZHNbal0pO1xuICAgICAgICAgICAgaWYgKHJlZmVycmVkTm9kZSAmJiBET01VdGlsLnNhbWVOb2RlKHJlZmVycmVkTm9kZSwgZWxlbWVudCkpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTsgICBcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZpbmRBcmlhTGFiZWxEdXBlcyhlbGVtZW50cykge1xuICAgICAgICBsZXQgZHVwZU1hcCA9IHt9XG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgZHVwZU1hcFtSUFRVdGlsLmdldEFyaWFMYWJlbChlbGUpXSA9IChkdXBlTWFwW1JQVFV0aWwuZ2V0QXJpYUxhYmVsKGVsZSldIHx8IDApICsgMTtcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGR1cGVNYXA7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVscyBnbG9iYWxseVxuICAgIHB1YmxpYyBzdGF0aWMgaGFzVW5pcXVlQXJpYUxhYmVscyhlbGVtZW50cykge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5oYXNVbmlxdWVBcmlhTGFiZWxzTG9jYWxseShlbGVtZW50cywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVsc1xuICAgIHB1YmxpYyBzdGF0aWMgaGFzRHVwbGljYXRlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIGlzR2xvYmFsKSB7XG4gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGRvYyA9IGVsZW1lbnRzWzBdLm93bmVyRG9jdW1lbnQ7XG5cbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgdW5pcXVlQXJpYUxhYmVsczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSBudWxsO1xuICAgICAgICBsZXQgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXkgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIHVuaXF1ZUFyaWFMYWJlbHMgPSBnZXRDYWNoZShkb2MsIFwiUlBUVXRpbF9IQVNfVU5JUVVFX0FSSUFfTEFCRUxTXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmlxdWVBcmlhTGFiZWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyaWFMYWJlbCA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSBhcmlhTGFiZWwgaW4gdW5pcXVlQXJpYUxhYmVscztcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVsc1thcmlhTGFiZWxdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoYXJpYUxhYmVsIGluIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXlbYXJpYUxhYmVsXSA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5W2FyaWFMYWJlbF0ucHVzaChlbGVtZW50c1tpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsSURzID0gZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub3JtYWxpemVkTGFiZWwgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gbGFiZWxJRHMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbElEID0gbGFiZWxJRHNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxOb2RlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlbWVudHNbaV0sIGxhYmVsSUQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gbGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlbWVudHNbaV0pID8gUlBUVXRpbC5nZXRJbm5lclRleHQobGFiZWxOb2RlKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IG5vcm1hbGl6ZWRMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW25vcm1hbGl6ZWRMYWJlbF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShub3JtYWxpemVkTGFiZWwgaW4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVtub3JtYWxpemVkTGFiZWxdID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXlbbm9ybWFsaXplZExhYmVsXS5wdXNoKGVsZW1lbnRzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIHNldENhY2hlKGRvYywgXCJSUFRVdGlsX0hBU19VTklRVUVfQVJJQV9MQUJFTFNcIiwgdW5pcXVlQXJpYUxhYmVscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5O1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgQVJJQSBsYWJlbHMgZ2xvYmFsbHlcbiAgICBwdWJsaWMgc3RhdGljIGhhc0R1cGxpY2F0ZUFyaWFMYWJlbHMoZWxlbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuaGFzRHVwbGljYXRlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZXNcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbGxlZGJ5KGVsZW1lbnRzKSB7XG5cbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgbGFiZWxSZWZzID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFoYXNEdXBsaWNhdGVMYWJlbHMgJiYgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFSUFRVdGlsLmlzSWRSZWZlclRvU2VsZihlbGVtZW50c1tpXSxlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsUmVmID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSk7XG4gICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gbGFiZWxSZWYgaW4gbGFiZWxSZWZzO1xuICAgICAgICAgICAgICAgIGxhYmVsUmVmc1tsYWJlbFJlZl0gPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhaGFzRHVwbGljYXRlTGFiZWxzO1xuICAgIH1cblxuICAgIC8qIERldGVybWluZSB0aGUgbm9kZSBkZXB0aCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbm9kZURlcHRoKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRlcHRoID0gMDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgICAgIGRlcHRoID0gZGVwdGggKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXB0aDtcbiAgICB9XG5cbiAgICAvKiBjb21wYXJlIG5vZGUgb3JkZXIgb2YgdGhlIDIgZ2l2ZW4gbm9kZXMgKi9cbiAgICAvKiByZXR1cm5zXG4gICAgICogICAwIGlmIHRoZSBub2RlcyBhcmUgZXF1YWxcbiAgICAgKiAgIDEgaWYgbm9kZSBiIGlzIGJlZm9yZSBub2RlIGFcbiAgICAgKiAgLTEgaWYgbm9kZSBhIGlzIGJlZm9yZSBub2RlIGJcbiAgICAgKiAgIDIgaWYgbm9kZSBhIGlzIG5lc3RlZCBpbiBub2RlIGJcbiAgICAgKiAgLTIgaWYgbm9kZSBiIGlzIG5lc3RlZCBpbiBub2RlIGFcbiAgICAgKiAgIG51bGwgaWYgZWl0aGVyIG5vZGUgaXMgbnVsbCBvciB0aGVpciBwYXJlbnQgbm9kZXMgYXJlIG5vdCBlcXVhbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcGFyZU5vZGVPcmRlcihub2RlQSwgbm9kZUIpIHtcbiAgICAgICAgaWYgKG5vZGVBID09PSBub2RlQikgcmV0dXJuIDA7XG5cbiAgICAgICAgbGV0IGFEZXB0aCA9IFJQVFV0aWwubm9kZURlcHRoKG5vZGVBKTtcbiAgICAgICAgbGV0IGJEZXB0aCA9IFJQVFV0aWwubm9kZURlcHRoKG5vZGVCKTtcbiAgICAgICAgaWYgKGJEZXB0aCA+IGFEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiRGVwdGggLSBhRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQiA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVCKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQiBuZXN0ZWQgaW4gTm9kZSBBXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0yO1xuICAgICAgICB9IGVsc2UgaWYgKGFEZXB0aCA+IGJEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhRGVwdGggLSBiRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQSBuZXN0ZWQgaW4gTm9kZSBCXG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG5vZGVBICE9IG51bGwgJiYgbm9kZUIgIT0gbnVsbCAmJiBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSB7XG4gICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIG5vZGVCID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlQSA9PT0gbnVsbCB8fCBub2RlQiA9PT0gbnVsbCB8fCBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGVCICE9IG51bGwgJiYgbm9kZUIgIT0gbm9kZUEpXG4gICAgICAgICAgICBub2RlQiA9IG5vZGVCLnByZXZpb3VzU2libGluZztcbiAgICAgICAgaWYgKG5vZGVCID09PSBudWxsKSAvLyBub2RlQiBiZWZvcmUgbm9kZUFcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICBlbHNlIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIGVsZW1lbnQgaXMgbm90IGVtcHR5XG4gICAgICogIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBhdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBhdHRyU3RyKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyU3RyKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyU3RyKS50cmltKCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBnaXZlbiBmcmFtZSwgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYW1lQnlOYW1lKHJ1bGVDb250ZXh0LGZyYW1lTmFtZSkge1xuICAgICAgICBsZXQgd2luZG93ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAgICAgbGV0IGZyYW1lTGlzdCA9IFt3aW5kb3ddO1xuICAgICAgICBsZXQgaWR4ID0gMDtcbiAgICAgICAgd2hpbGUgKGlkeCA8IGZyYW1lTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lTGlzdFtpZHhdLm5hbWUgPT09IGZyYW1lTmFtZSkgcmV0dXJuIGZyYW1lTGlzdFtpZHhdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnJhbWVMaXN0W2lkeF0uZnJhbWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgaXQncyBhIHJlYWwgZnJhbWUgYW5kIGF2b2lkIHJlY3Vyc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lTGlzdFtpZHhdLmZyYW1lc1tpXSAmJiAhZnJhbWVMaXN0LmluY2x1ZGVzKGZyYW1lTGlzdFtpZHhdLmZyYW1lc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxpc3QucHVzaChmcmFtZUxpc3RbaWR4XS5mcmFtZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICArK2lkeDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHROU1Jlc29sdmVyKHByZWZpeCl7XG4gICAgICAgIGxldCB1cmk7XG4gICAgICAgIHN3aXRjaCAocHJlZml4KSB7XG4gICAgICAgICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gICAgICAgICAgICBjYXNlICd4Mic6XG4gICAgICAgICAgICAgICAgdXJpID0gJ2h0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMic7XG4gICAgICAgICAgICBjYXNlICd4JzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gICAgICAgICAgICBjYXNlICd4aHRtbCc6XG4gICAgICAgICAgICAgICAgdXJpID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB1cmkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmk7XG4gICAgfVxuXG4gICAgLy9jaGVja2luZyBpZiBvbmx5IHRoZSBpbm5lciB0ZXh0IGlzIGVtcHR5IG9yIG5vdFxuICAgIHB1YmxpYyBzdGF0aWMgaXNJbm5lclRleHRPbmx5RW1wdHkoZWxlbWVudCkge1xuICAgICAgICAvLyBHZXQgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudFxuICAgICAgICBsZXQgdGV4dCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuXG4gICAgICAgIGlmICh0ZXh0ID09PSB1bmRlZmluZWQgJiYgZWxlbWVudC50ZXh0Q29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBJbiBoZWFkbGVzcyBtb2RlLCAgaW5uZXJUZXh0IGlzIHNvbWV0aW1lcyAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgLy8gc28gd2UgdHJ5IHRleHRDb250ZW50IGFzIGEgd29ya2Fyb3VuZFxuICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnQudGV4dENvbnRlbnRcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRWYWwgPSAhKHRleHQgIT09IG51bGwgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCk7XG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSAxICYmIGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzbG90XCIpIHtcbiAgICAgICAgICAgIC8vVE9ETzogbmVlZCB0byBjb25zaWRlIGl0cyBvd24gY29udGVudCwgYSBzbG90IG1heSBoYXZlIGl0cyBvd24gY29udGVudCBvciBhc3NpZ25lZCBjb250ZW50XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNsb3RFbGVtIG9mIGVsZW1lbnQuYXNzaWduZWROb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsICYmIFJQVFV0aWwuaXNJbm5lclRleHRFbXB0eShzbG90RWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmltIHRoZSBpbm5lciB0ZXh0IGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyBub3QgZW1wdHkuXG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIHRoZSBpbm5lciB0ZXh0IG9mIHRoZSBnaXZlbiBlbGVtZW50ICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbm5lclRleHQoZWxlbWVudCkge1xuICAgICAgICBsZXQgcmV0VmFsID0gZWxlbWVudC5pbm5lclRleHQ7XG4gICAgICAgIGlmIChyZXRWYWwgPT09IHVuZGVmaW5lZCB8fCByZXRWYWwudHJpbSgpID09PSBcIlwiKVxuICAgICAgICAgICAgcmV0VmFsID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJuIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGdpdmVuIG5vZGUgXG4gICAgICogIHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gaW5uZXJUZXh0IG9yIHRleHRDb250ZW50IHRoYXQgcmV0dXJuIHRleHQgY29udGVudCBvZiBhIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50c1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXROb2RlVGV4dChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IGNoaWxkTm9kZXMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT0gMykge1xuICAgICAgICAgICAgICAgIHRleHQgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgZWxlbWVudHMgaW5uZXIgdGV4dCBpcyBlbXB0eSBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpdCBoYXMgaW5uZXIgdGV4dCBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gdHJ1ZSBpZiBlbGVtZW50IGhhcyBlbXB0eSBpbm5lciB0ZXh0LCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0lubmVyVGV4dEVtcHR5KGVsZW1lbnQpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBpbm5lclRleHQgb2YgdGhlIGVsZW1lbnRcbiAgICAgICAgbGV0IHRleHQgPSBSUFRVdGlsLmdldElubmVyVGV4dChlbGVtZW50KTtcblxuICAgICAgICAvLyBUcmltIHRoZSBpbm5lciB0ZXh0IGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyBub3QgZW1wdHkuXG4gICAgICAgIHJldHVybiAhKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhhc0lubmVyQ29udGVudChlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gUlBUVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIGxldCBoYXNDb250ZW50ID0gKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKTtcblxuICAgICAgICBpZiAoZWxlbWVudC5maXJzdENoaWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJlxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwiYWx0XCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzQ29udGVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmUgaWYgYW4gZWxlbWVudCBoYXMgaW5uZXIgY29udGVudC5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGFsc28gY29uc2lkZXJzIGNhc2VzIHdoZXJlIGlubmVyIHRleHQgaXMgaGlkZGVuLCB3aGljaCBub3cgd2lsbFxuICAgICAqIGJlIGNsYXNzaWZpZWQgYXMgZG9lcyBub3QgaGF2ZSBoaWRkZW4gY29udGVudC5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGl0IGhhcyBpbm5lciB0ZXh0IG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIGVsZW1lbnQgaGFzIGVtcHR5IGlubmVyIHRleHQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbkh5cGVyTGluayhlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzdmdIYXNOYW1lKGVsZW1lbnQ6IFNWR0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsXCIpXG4gICAgICAgICAgICB8fCBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpXG4gICAgICAgICAgICB8fCAhIWVsZW1lbnQucXVlcnlTZWxlY3RvcihcIjpzY29wZSA+IHRpdGxlXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzSW5uZXJDb250ZW50SGlkZGVuSHlwZXJMaW5rKGVsZW1lbnQsIGh5cGVybGlua19mbGFnKSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgY2hpbGRFbGVtZW50ID0gZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgbGV0IGhhc0NvbnRlbnQgPSBmYWxzZTtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGlsZEVsZW1lbnQgaXMgbm90IG51bGwgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIGVhY2ggb2YgdGhlIGVsZW1lbnRzXG4gICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBhcmUgbm90IGFsbCBoaWRkZW4uXG4gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBub2Rld2FsdGVyIG9mIHRoZSBlbGVtZW50IG5vZGUsIHNvIHRoYXQgd2UgY2FuIGxvb3Agb3ZlciBpdCBhbmQgdmVyaWZ5XG4gICAgICAgICAgICAvLyB0aGF0IHRoZSBlbGVtZW50cyB1bmRlciB0aGUgZWxlbWVudCBhcmUgbm90IGNvbXBsZXRseSBoaWRkZW4uXG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcblxuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbm9kZXMgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgbm9kZXMgb3Igd2UgaGF2ZSBkZXRlcm1pbmUgdGhhdCB0aGVyZSBpcyBjb250ZW50IHVuZGVyXG4gICAgICAgICAgICAvLyB0aGlzIHBhcmVudCBlbGVtZW50LlxuICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG53Lm5vZGU7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBhbiBpbWcgZWxlbWVudCBpcyBwcmVzZW50IHdpdGggYWx0IHRoZW4gd2UgY2FuIG1hcmsgdGhpcyBhcyBwYXNzXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGtlZXAgY2hlY2tpbmcgYWxsIHRoZSBvdGhlciBlbGVtZW50cy4gTWFrZSBzdXJlIHRoYXQgdGhpcyBpbWFnZSBlbGVtZW50IGlzIG5vdCBoaWRkZW4uXG4gICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IChcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiXG4gICAgICAgICAgICAgICAgICAgICYmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpIHx8IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpXG4gICAgICAgICAgICAgICAgKSB8fCAoXG4gICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIlxuICAgICAgICAgICAgICAgICAgICAmJiBSUFRVdGlsLnN2Z0hhc05hbWUobm9kZSBhcyBhbnkpXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBjaGVjayBpZiB0aGlzIG5vZGUgaXMgb2YgdHlwZSBlbGVtZW50LCB2aXNpYmxlXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBpbm5lclRleHQgb2YgdGhlIGVsZW1lbnQgaXMgZW1wdHkgb3Igbm90XG4gICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhUlBUVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIGh5cGVybGlua19mbGFnID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxcIikgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShub2RlIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudCAmJiBjU3R5bGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjU3R5bGUuYmFja2dyb3VuZEltYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY1N0eWxlLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZikgfHwgY1N0eWxlLmNvbnRlbnQpICYmIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjYXNlcyB3aGVyZSB0aGVyZSBpcyB0ZXh0IG5vZGUgYWZ0ZXIgYW4gZWxlbWVudCB1bmRlciB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugd2UgZGV0ZWN0IG5vZGV0eXBlIGFzIHRleHQgbm9kZSBhbmQgdGhlIHBhdGVudCBvZiB0aGUgdGV4dCBub2RlIGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgZWxlbWVudCB3ZSBhcmUgY2hlY2tpbmcgaGFzIElubmVyIGNvbnRlbnQgZm9yIHRoZW4gZ2V0IHRoZSBpbm5lciBjb250ZW50IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAvLyB0ZXh0IG5vZGUuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgJiYgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSkgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9ICFSUFRVdGlsLmlzSW5uZXJUZXh0RW1wdHkobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBubyBjaGlsZCBlbGVtZW50cyB0aGVuIHdlIGNhbiBzaW1wbHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIG9ubHkgaW5uZXJ0ZXh0XG4gICAgICAgIC8vIHRoZSBpbWcgd2l0aCBhbHQgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFib3ZlIGlmLCBhcyBpbWcgaXMgY29uc2lkZXJzIGFzIGFuIGVsZW1lbnQuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhUlBUVXRpbC5pc0lubmVyVGV4dEVtcHR5KGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnRPckFsdChlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gUlBUVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIGxldCBoYXNDb250ZW50ID0gKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB8fCBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYWx0XCIpO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJlxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwiYWx0XCIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgJiYgKFJQVFV0aWwuaGFzUm9sZShudy5ub2RlLCBcImJ1dHRvblwiLCB0cnVlKSB8fCBSUFRVdGlsLmhhc1JvbGUobncubm9kZSwgXCJ0ZXh0Ym94XCIpKVxuICAgICAgICAgICAgICAgICAgICAmJiAoUlBUVXRpbC5oYXNBcmlhTGFiZWwobncubm9kZSkgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShudy5ub2RlLCBcInRpdGxlXCIpIHx8IFJQVFV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKG53LmVsZW0oKSwgdHJ1ZSkpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25jYXRVbmlxdWVBcnJheUl0ZW0oaXRlbTogc3RyaW5nLCBhcnI6IHN0cmluZ1tdKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgYXJyLmluZGV4T2YoaXRlbSkgPT09IC0xICYmIGl0ZW0gIT09IG51bGwgPyBhcnIucHVzaChpdGVtKSA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChpdGVtTGlzdDogc3RyaW5nW10sIGFycjogc3RyaW5nW10pIDogc3RyaW5nW10ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaXRlbUxpc3QgIT09IG51bGwgJiYgaSA8IGl0ZW1MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcnIgPSBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbShpdGVtTGlzdFtpXSwgYXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJlbW92ZSBhcnJheSBpdGVtcyBmcm9tIGEgZ2l2ZW4gYXJyYXlcbiAgICAgKiBAcGFyYW0gaXRlbUxpc3QgaXRlbXMgdG8gYmUgcmVtb3ZlZCBmcm9tIGFyclxuICAgICAqIEBwYXJhbSBhcnIgdGhlIGFycmF5XG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyByZWR1Y2VBcnJheUl0ZW1MaXN0KGl0ZW1MaXN0OiBzdHJpbmdbXSwgYXJyOiBzdHJpbmdbXSkgOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmIChhcnIgJiYgYXJyLmxlbmd0aCA+IDAgJiYgaXRlbUxpc3QgJiYgaXRlbUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGFyci5maWx0ZXIoKHZhbHVlKSA9PiAge1xuICAgICAgICAgICAgICAgIHJldHVybiAhaXRlbUxpc3QuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVzb2x2aW5nIEFSSUEgcmVxdWlyZW1lbnRzIGZvciBhbiBIVE1MIGVsZW1lbnQgcGVyIEFSSUEgaW4gSFRNTFxuICAgICAqIEBwYXJhbSBydWxlQ29udGV4dCB0aGUgSFRNTCBlbGVtZW50IHRvIGJlIGV4YW1pbmVkXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KSB7XG4gICAgICAgIGxldCB0YWdQcm9wZXJ0eSA6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgPSBnZXRDYWNoZShydWxlQ29udGV4dCwgXCJSUFRVdGlsX0VsZW1lbnRBcmlhUHJvcGVydHlcIiwgbnVsbCk7XG4gICAgICAgIGlmICghdGFnUHJvcGVydHkpIHtcbiAgICAgICAgICAgIGxldCB0YWdOYW1lID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBuYW1lID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZSkge1xuICAgICAgICAgICAgICAgIHRhZ05hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdGFnUHJvcGVydHkgZXhpc3RzIGluIHRoZSBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgaGFzaC5cbiAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFt0YWdOYW1lXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVGhlIHRhZyBuZWVkcyB0byBjaGVjayBzb21lIHNwZWNpYWwgYXR0cmlidXRlc1xuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ID09PSBudWxsIHx8IHRhZ1Byb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbdGFnTmFtZV07XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0YWdOYW1lKSB7IC8vIHNwZWNpYWwgY2FzZXNcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiaHJlZlwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ3aXRoLWhyZWZcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1ocmVmXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhcmVhXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImhyZWZcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1ocmVmXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIndpdGhvdXQtaHJlZlwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZmlndXJlXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmY3MgPSBSUFRVdGlsLmdldENoaWxkQnlUYWcocnVsZUNvbnRleHQsIFwiZmlnY2FwdGlvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZjcyAhPT0gbnVsbCAmJiBmY3MubGVuZ3RoID4gMCA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGlsZC1maWdjYXB0aW9uXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm5vLWNoaWxkLWZpZ2NhcHRpb25cIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZm9vdGVyXCI6IFxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaGVhZGVyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImFydGljbGVcIiwgdHJ1ZSkgIT09IG51bGwgfHwgUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJuYXZpZ2F0aW9uXCIsIHRydWUpICE9PSBudWxsIHx8IFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJyZWdpb25cIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImFydGljbGVcIiwgXCJhc2lkZVwiLCBcIm1haW5cIiwgXCJuYXZcIiwgXCJzZWN0aW9uXCJdKSAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtc2VjdGlvbi1hcnRpY2xlLWFzaWRlLW1haW4tbmF2XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJvdGhlclwiXTsgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaW1nXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKSA9PT0gXCJcIiA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJpbWctd2l0aC1lbXB0eS1hbHRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGgtYWx0LXRleHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJpbWctd2l0aC1hbHQtdGV4dFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJpbWctd2l0aG91dC1hbHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImlucHV0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbdHlwZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ID09PSBudWxsIHx8IHRhZ1Byb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFyaWEtcHJlc3NlZFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGVja2JveC13aXRoLWFyaWEtcHJlc3NlZFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGVja2JveC13aXRob3V0LWFyaWEtcHJlc3NlZFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbWFpbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJlbWFpbC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZW1haWwtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzZWFyY2hcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wic2VhcmNoLXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJzZWFyY2gtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZWxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGVsLXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZWwtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ1cmxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widXJsLXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ1cmwtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZWZhdWx0LXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZWZhdWx0LW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdHlwZSBpcyB0aGUgc2FtZSBhcyB0eXBlPXRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGV4dC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGV4dC1uby1saXN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbXCJsaVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50ICYmIFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQsIFwibGlzdFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hpbGQtb2YtbGlzdC1yb2xlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJuby1jaGlsZC1vZi1saXN0LXJvbGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNlY3Rpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgIFxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VsZWN0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsVGFnUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1tcInNlbGVjdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwic2l6ZVwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzaXplXCIpID4gMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibXVsdGlwbGUtYXR0ci1zaXplLWd0MVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tbXVsdGlwbGUtYXR0ci1zaXplLWd0MVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3VtbWFyeVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbXCJzdW1tYXJ5XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQgJiYgcnVsZUNvbnRleHQucGFyZW50RWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGV0YWlscycgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgRE9NVXRpbC5zYW1lTm9kZShbLi4ucnVsZUNvbnRleHQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKGVsZW09PmVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKVswXSwgcnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJmaXJzdC1zdW1tYXJ5LW9mLWRldGFpbFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRib2R5XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidHJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidGFibGVcIiwgdHJ1ZSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLXRhYmxlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiZ3JpZFwiLCB0cnVlKSB8fCBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidHJlZWdyaWRcIiwgdHJ1ZSkgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLWdyaWRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0aFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJ0YWJsZVwiLCB0cnVlKSAhPT0gbnVsbCB8fCBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiZ3JpZFwiLCB0cnVlKSAhPT0gbnVsbCB8fCBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidHJlZWdyaWRcIiwgdHJ1ZSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZSA9IFJQVFV0aWwuZ2V0U2NvcGVGb3JUaChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlID09PSAnY29sdW1uJykgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy10YWJsZS1ncmlkLXRyZWVncmlkLWNvbHVtbi1zY29wZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtdGFibGUtZ3JpZC10cmVlZ3JpZC1yb3ctc2NvcGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtb3RoZXJcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkaXZcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcnQgPSBydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJ0ICE9PSBudWxsICYmIHBydC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGwnID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImNoaWxkLWRsXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm5vLWNoaWxkLWRsXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFSSUFEZWZpbml0aW9ucy5kb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1tcImRlZmF1bHRcIl0gYXMgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudDtcbiAgICAgICAgICAgICAgICB9IC8vc3dpdGNoXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUlBUVXRpbF9FbGVtZW50QXJpYVByb3BlcnR5XCIsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuIHRhZ1Byb3BlcnR5IHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRTY29wZUZvclRoKGVsZW1lbnQpIHtcbiAgICAgICAgLyoqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS90YWJ1bGFyLWRhdGEuaHRtbCNoZWFkZXItYW5kLWRhdGEtY2VsbC1zZW1hbnRpY3NcbiAgICAgICAgICogQSBoZWFkZXIgY2VsbCBhbmNob3JlZCBhdCB0aGUgc2xvdCB3aXRoIGNvb3JkaW5hdGUgKHgsIHkpIHdpdGggd2lkdGggd2lkdGggYW5kIGhlaWdodCBoZWlnaHQgaXMgXG4gICAgICAgICAqIHNhaWQgdG8gYmUgYSBjb2x1bW4gaGVhZGVyIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWU6XG4gICAgICAgICAqICogVGhlIGNlbGwncyBzY29wZSBhdHRyaWJ1dGUgaXMgaW4gdGhlIGNvbHVtbiBzdGF0ZSwgb3JcbiAgICAgICAgICogKiBUaGUgY2VsbCdzIHNjb3BlIGF0dHJpYnV0ZSBpcyBpbiB0aGUgYXV0byBzdGF0ZSwgYW5kIHRoZXJlIGFyZSBubyBkYXRhIGNlbGxzIGluIGFueSBvZiBcbiAgICAgICAgICogICB0aGUgY2VsbHMgY292ZXJpbmcgc2xvdHMgd2l0aCB5LWNvb3JkaW5hdGVzIHkgLi4geStoZWlnaHQtMS5cbiAgICAgICAgICogQSBoZWFkZXIgY2VsbCBhbmNob3JlZCBhdCB0aGUgc2xvdCB3aXRoIGNvb3JkaW5hdGUgKHgsIHkpIHdpdGggd2lkdGggd2lkdGggYW5kIGhlaWdodCBoZWlnaHQgaXNcbiAgICAgICAgICogc2FpZCB0byBiZSBhIHJvdyBoZWFkZXIgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgICAgICAgICogKiBUaGUgY2VsbCdzIHNjb3BlIGF0dHJpYnV0ZSBpcyBpbiB0aGUgcm93IHN0YXRlLCBvclxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSBhdXRvIHN0YXRlLCB0aGUgY2VsbCBpcyBub3QgYSBjb2x1bW4gaGVhZGVyLCBhbmQgdGhlcmUgYXJlXG4gICAgICAgICAqICAgbm8gZGF0YSBjZWxscyBpbiBhbnkgb2YgdGhlIGNlbGxzIGNvdmVyaW5nIHNsb3RzIHdpdGggeC1jb29yZGluYXRlcyB4IC4uIHgrd2lkdGgtMS5cbiAgICAgICAgICovXG4gICAgICAgIC8vIE5vdGU6IGF1dG8gaXMgZGVmYXVsdCBzY29wZVxuICAgICAgICBcbiAgICAgICAgLy8gRWFzaWVzdCBhbnN3ZXIgaXMgaWYgc2NvcGUgaXMgc3BlY2lmaWVkXG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpKSB7XG4gICAgICAgICAgICBsZXQgc2NvcGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoc2NvcGUgPT09IFwicm93XCIgfHwgc2NvcGUgPT09ICdyb3dncm91cCcpIHJldHVybiBcInJvd1wiO1xuICAgICAgICAgICAgaWYgKHNjb3BlID09PSBcImNvbFwiIHx8IHNjb3BlID09PSAnY29sZ3JvdXAnKSByZXR1cm4gXCJjb2x1bW5cIjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gc2NvcGUgaXMgYXV0bywgZGVmYXVsdCAod2l0aG91dCBhIHNjb3BlKSBvciBpbnZhbGlkIHZhbHVlLlxuICAgICAgICAvLyBpZiBhbGwgdGhlIHNpYmxpbmcgZWxlbWVudHMgYXJlIHRoLCB0aGVuIHJldHVybiBcImNvbHVtbmhlYWRlclwiIFxuICAgICAgICB2YXIgc2libGluZ3MgPSBlbGVtZW50ID0+IFsuLi5lbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihub2RlPT5ub2RlLm5vZGVUeXBlID09PSAxICYmIG5vZGUudGFnTmFtZSAhPSBcIlRIXCIpO1xuICAgICAgICBpZiAoc2libGluZ3MgPT09IG51bGwgfHwgc2libGluZ3MubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFwiY29sdW1uXCI7IFxuICAgICAgICBlbHNlIHJldHVybiBcInJvd1wiO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsb3dlZEFyaWFSb2xlcyhydWxlQ29udGV4dCwgcHJvcGVydGllczogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCkge1xuICAgICAgICBsZXQgYWxsb3dlZFJvbGVzIDogc3RyaW5nW10gPSBnZXRDYWNoZShydWxlQ29udGV4dCwgXCJSUFRVdGlsX0FsbG93ZWRBcmlhUm9sZXNcIiwgbnVsbCk7XG4gICAgICAgIGlmICghYWxsb3dlZFJvbGVzKSB7XG4gICAgICAgICAgICBhbGxvd2VkUm9sZXMgPSBbXTtcbiAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgIT09IG51bGwgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBwcm9wZXJ0aWVzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IFJQVFV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAhPT0gbnVsbCAmJiB0YWdQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLCBhbGxvd2VkUm9sZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkudmFsaWRSb2xlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QodGFnUHJvcGVydHkudmFsaWRSb2xlcywgYWxsb3dlZFJvbGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZXMgPSBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZXMgJiYgaW1wbGljaXRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdCh0YWdQcm9wZXJ0eS52YWxpZFJvbGVzLCBhbGxvd2VkUm9sZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJQVFV0aWxfQWxsb3dlZEFyaWFSb2xlc1wiLCBhbGxvd2VkUm9sZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGxvd2VkUm9sZXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxvd2VkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQsIHJvbGVzLCBwcm9wZXJ0aWVzKSB7XG4gICAgICAgIGxldCBhbGxvd2VkQXR0cmlidXRlcyA6IHN0cmluZ1tdID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUlBUVXRpbF9BbGxvd2VkQXJpYUF0dHJpYnV0ZXNcIiwgbnVsbCk7XG4gICAgICAgIGlmICghYWxsb3dlZEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gW107XG4gICAgICAgICAgICBsZXQgcGVybWl0dGVkUm9sZXMgPSBbLi4ucm9sZXNdO1xuICAgICAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBwcm9oaWJpdGVkQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgLy8gRWxlbWVudCB3aXRoIGEgZGlzYWJsZWQgYXR0cmlidXRlICBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZGlzYWJsZWQtZWxlbWVudHMuaHRtbFxuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWREaXNhYmxlZC5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtZGlzYWJsZWQgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLWRpc2FibGVkXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVsZW1lbnQgd2l0aCBhIHJlcXVpcmVkIGF0dHJpYnV0ZSBodHRwOi8vd3d3LnRoZS1hcnQtb2Ytd2ViLmNvbS9odG1sL2h0bWw1LWZvcm0tdmFsaWRhdGlvbi9cbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZWxlbWVudHNBbGxvd2VkUmVxdWlyZWQuaW5kZXhPZih0YWdOYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBhcmlhLXJlcXVpcmVkIGF0dHJpYnV0ZSBvbiBhbnkgZWxlbWVudCB0aGF0IGlzIGFsbG93ZWQgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSBpbiBIVE1MNS5cbiAgICAgICAgICAgICAgICBhbGxvd2VkQXR0cmlidXRlcyA9IFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtKFwiYXJpYS1yZXF1aXJlZFwiLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZWxlbWVudHNBbGxvd2VkUmVhZE9ubHkuaW5kZXhPZih0YWdOYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBhcmlhLXJlYWRvbmx5IGF0dHJpYnV0ZSBvbiBhbnkgZWxlbWVudCB0aGF0IGlzIGFsbG93ZWQgdGhlIHJlYWRvbmx5IGF0dHJpYnV0ZSBpbiBIVE1MNS5cbiAgICAgICAgICAgICAgICBhbGxvd2VkQXR0cmlidXRlcyA9IFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtKFwiYXJpYS1yZWFkb25seVwiLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IG51bGw7XG4gICAgICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHByb3BlcnRpZXM7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBSUFRVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgIT09IG51bGwgJiYgdGFnUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgaW1wbGljaXQgcm9sZSBhbGxvd2VkIGF0dHJpYnV0ZXMgdG8gdGhlIGFsbG93ZWQgcm9sZSBsaXN0IGlmIHRoZXJlIGlzIG5vIHNwZWNpZmllZCByb2xlXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgYWxsb3cgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgaW1wbGljaXQgcm9sZXNcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIChwZXJtaXR0ZWRSb2xlcyA9PT0gbnVsbCB8fCBwZXJtaXR0ZWRSb2xlcyA9PT0gdW5kZWZpbmVkIHx8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZVByb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3RhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnR5ICE9PSBudWxsICYmIHJvbGVQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydHkucHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gUlBUVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwcm9wZXJ0aWVzLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb2hpYml0ZWRQcm9wcyA9IHJvbGVQcm9wZXJ0eS5wcm9oaWJpdGVkUHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2hpYml0ZWRQcm9wcyAmJiBwcm9oaWJpdGVkUHJvcHMubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwcm9oaWJpdGVkUHJvcHMsIHByb2hpYml0ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2Ugb2Ygc2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXSA9PT0gXCJzZXBhcmF0b3JcIiAmJiBSUFRVdGlsLmlzRm9jdXNhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtdmFsdWVub3dcIiwgXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEFkZGluZyB0aGUgZ2xvYmFsIHByb3BlcnRpZXMgdG8gdGhlIHZhbGlkIGF0dHJpYnV0ZSBsaXN0XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5Lmdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZ2xvYmFsUHJvcGVydGllczsgLy8gZ2xvYmFsIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBvdGhlciByb2xlIHRvIHRoZSBhbGxvd2VkIHJvbGVzIGZvciB0aGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ICYmIHRhZ1Byb3BlcnR5Lm90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzICYmIHRhZ1Byb3BlcnR5Lm90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5Lm90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzLCBwZXJtaXR0ZWRSb2xlcyk7ICAgICAgIFxuICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBzcGVjaWZpZWQgcm9sZSBwcm9wZXJ0aWVzIHRvIHRoZSBhbGxvd2VkIGF0dHJpYnV0ZSBsaXN0XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGVybWl0dGVkUm9sZXMgIT09IG51bGwgJiYgaSA8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3Blcm1pdHRlZFJvbGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnRpZXMgIT09IG51bGwgJiYgcm9sZVByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHByb3BlcnRpZXMgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBhbGxvdyBhdHRyaWJ1dGVzIGZyb20gdGhlIGltcGxpY2l0IHJvbGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdQcm9wZXJ0eSB8fCB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgPT09IG51bGwgfHwgIXRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgfHwgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydGllcy5wcm9wczsgLy8gYWxsb3dlZCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IFJQVFV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhwZXJtaXR0ZWRSb2xlc1tpXSwgcnVsZUNvbnRleHQpOyAvLyByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9oaWJpdGVkUHJvcHMgPSByb2xlUHJvcGVydGllcy5wcm9oaWJpdGVkUHJvcHM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkUHJvcHMgJiYgcHJvaGliaXRlZFByb3BzLmxlbmd0aD4wKVxuICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb2hpYml0ZWRQcm9wcywgcHJvaGliaXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICBpZiAocGVybWl0dGVkUm9sZXNbaV0gPT09IFwic2VwYXJhdG9yXCIgJiYgUlBUVXRpbC5pc0ZvY3VzYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBpZ25vcmUgYXJpYS1sZXZlbCwgYXJpYS1zZXRzaXplIG9yIGFyaWEtcG9zaW5zZXQgaWYgXCJyb3dcIiBpcyBub3QgaW4gdHJlZWdyaWRcbiAgICAgICAgICAgIGlmIChwZXJtaXR0ZWRSb2xlcy5pbmNsdWRlcyhcInJvd1wiKSAmJiBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidHJlZWdyaWRcIiwgdHJ1ZSkgPT0gbnVsbCApIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtbGV2ZWxcIikpID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtc2V0c2l6ZVwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPSBhbGxvd2VkQXR0cmlidXRlcy5pbmRleE9mKFwiYXJpYS1wb3NpbnNldFwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIGFsbG93ZWQgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcyAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgYXR0cmlidXRlLXZhbHVlIHBhaXIgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgbGV0IGFsbG93ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwPTA7IHAgPCB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyID0gdGFnUHJvcGVydHkub3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXNbcF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IGF0dHIuc3BsaXQoXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShwYWlyWzBdKSA9PT0gcGFpclsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkLnB1c2gocGFpclswXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZC5wdXNoKGF0dHIpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgaWYgKGFsbG93ZWQubGVuZ3RoID4gMCkgICAgXG4gICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChhbGxvd2VkLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIHByb2hpYml0dGVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50XG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGF0dHJpYnV0ZS12YWx1ZSBwYWlyIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgIGxldCBkaXNhbGxvd2VkID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcD0wOyBwIDwgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0ciA9IHRhZ1Byb3BlcnR5Lm90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzW3BdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ci5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBhdHRyLnNwbGl0KFwiPVwiKTsgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKHBhaXJbMF0pID09PSBwYWlyWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FsbG93ZWQucHVzaChwYWlyWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvd2VkLnB1c2goYXR0cik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaXNhbGxvd2VkLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChkaXNhbGxvd2VkLCBwcm9oaWJpdGVkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2V4Y2x1ZGUgdGhlIHByb2hpYml0ZWRBdHRyaWJ1dGVzIGZyb20gdGhlIGFsbG93ZWRBdHRyaWJ1dGVzXG4gICAgICAgICAgICBhbGxvd2VkQXR0cmlidXRlcyA9IFJQVFV0aWwucmVkdWNlQXJyYXlJdGVtTGlzdChwcm9oaWJpdGVkQXR0cmlidXRlcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICAvL2V4Y2x1ZGUgYXJpYSBhdHRyaWJ1dGUgZm9yIGVsZW1lbnRzIHdpdGhvdXQgaW1wbGljaXQgcm9sZSBhbmQgd2l0aCAnTmFtaW5nIFByb2hpYml0ZWQnXG4gICAgICAgICAgICBpZiAoKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApICYmIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSA9PT0gbnVsbCAmJiB0YWdQcm9wZXJ0eS5wcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGUpXG4gICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBSUFRVdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QodGFnUHJvcGVydHkucHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJQVFV0aWxfQWxsb3dlZEFyaWFBdHRyaWJ1dGVzXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsb3dlZEF0dHJpYnV0ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhcmlhQXR0ciBcbiAgICAgKiBAcGFyYW0gaHRtbEF0dHJzIFxuICAgICAqIEB0eXBlOiBjb25mbGljdCBvciBvdmVybGFwcGluZ1xuICAgICAqIEByZXR1cm5zIGh0bWxBdHRyTmFtZSwgJ1Bhc3MnIG9yIG51bGxcbiAgICAgKiAgICAgICAgIGh0bWxBdHRyTmFtZSB0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICAnUGFzcycgd2l0aCBubyBjb25mbGljdCB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICBvciBudWxsIHdoZXJlIGFyaWFBdHRyIHdvbid0IGNhdXNlIGNvbmZsaWN0XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb25mbGljdE9yT3ZlcmxhcHBpbmdIdG1sQXR0cmlidXRlKGFyaWFBdHRyLCBodG1sQXR0cnMsIHR5cGUpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICBsZXQgZXhpc3QgPSBBUklBRGVmaW5pdGlvbnMucmVsYXRlZEFyaWFIdG1sQXR0cmlidXRlc1thcmlhQXR0clsnbmFtZSddXTtcbiAgICAgICAgaWYgKGV4aXN0KSB7IFxuICAgICAgICAgICAgbGV0IGV4YW1pbmVkSHRtbEF0ck5hbWVzID0gW107XG4gICAgICAgICAgICBsZXQgYXJpYUF0dHJWYWx1ZSA9ICcnO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdjb25mbGljdCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0LmNvbmZsaWN0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBhcmlhQXR0clZhbHVlID0gZXhpc3QuY29uZmxpY3QuYXJpYUF0dHJpYnV0ZVZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb3ZlcmxhcHBpbmcnKSAge1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3Qub3ZlcmxhcHBpbmcpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyVmFsdWUgPSBleGlzdC5vdmVybGFwcGluZy5hcmlhQXR0cmlidXRlVmFsdWU7IFxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgICAgICAgICAgaWYgKGFyaWFBdHRyVmFsdWUgPT09IG51bGwgfHwgYXJpYUF0dHJWYWx1ZSA9PT0gJ1ZBTFVFJyB8fCBhcmlhQXR0clZhbHVlID09PSBhcmlhQXR0clsndmFsdWUnXSkge1xuICAgICAgICAgICAgICAgIGxldCBodG1sQXR0ck5hbWVzID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGh0bWxBdHRyVmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdjb25mbGljdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgIGh0bWxBdHRyTmFtZXMgPSBleGlzdC5jb25mbGljdC5odG1sQXR0cmlidXRlTmFtZXM7XG4gICAgICAgICAgICAgICAgICAgICBodG1sQXR0clZhbHVlcyA9IGV4aXN0LmNvbmZsaWN0Lmh0bWxBdHRyaWJ1dGVWYWx1ZXM7XG4gICAgICAgICAgICAgICAgfSAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICBodG1sQXR0ck5hbWVzID0gZXhpc3Qub3ZlcmxhcHBpbmcuaHRtbEF0dHJpYnV0ZU5hbWVzO1xuICAgICAgICAgICAgICAgICAgICAgaHRtbEF0dHJWYWx1ZXMgPSBleGlzdC5vdmVybGFwcGluZy5odG1sQXR0cmlidXRlVmFsdWVzO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBodG1sQXR0cnMubGVuZ3RoOyBpKyspIHsgXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGh0bWxBdHRyTmFtZXMuaW5kZXhPZihodG1sQXR0cnNbaV1bJ25hbWUnXSk7IFxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxBdHRyVmFsdWVzID09PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGFyaWFBdHRyVmFsdWUgPT09ICdWQUxVRScgJiYgaHRtbEF0dHJWYWx1ZXNbaW5kZXhdID09PSAnVkFMVUUnICYmIGh0bWxBdHRyc1tpXVsndmFsdWUnXSAhPT0gYXJpYUF0dHJbJ3ZhbHVlJ10pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaHRtbEF0dHJzW2ldWyd2YWx1ZSddID09PSBodG1sQXR0clZhbHVlc1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5wdXNoKHtyZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7cmVzdWx0OiAnUGFzcycsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ119KTtcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBleGFtaW5lZEh0bWxBdHJOYW1lcztcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkoZWxlbSA6IEhUTUxFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKGVsZW0sIGZhbHNlKTtcbiAgICAgICAgLy8gaWYgZXhwbGljaXQgcm9sZSBkb2Vzbid0IGV4aXN0LCBnZXQgdGhlIGltcGxpY2l0IG9uZVxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByb2xlcyA9ICBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShlbGVtKTtcbiAgICAgICAgXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZXhwbGljaXQgb3IgaW1wbGljaXQgcm9sZSwgc2hvdWxkbid0IGhhcHBlblxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgcm9sZXMgIT09IG51bGwgJiYgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcm9sZVByb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbaV1dO1xuICAgICAgICAgICAgaWYgKHJvbGVQcm9wZXJ0aWVzICE9PSBudWxsICYmIHJvbGVQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJlc2VudGlvbmFsID0gcm9sZVByb3BlcnRpZXMucHJlc2VudGF0aW9uYWxDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICBpZiAocHJlc2VudGlvbmFsID09PSB0cnVlKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzaG91bGRCZVByZXNlbnRhdGlvbmFsQ2hpbGQoZWxlbWVudCA6IEhUTUxFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgd2Fsa05vZGUgOiBFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgaWYgKFJQVFV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seSh3YWxrTm9kZSBhcyBIVE1MRWxlbWVudCkpIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAvL2FyaWEtb3duIGNhc2U6IGlmIHRoZSBlbGVtZW50IGlzIHJlZmVycmVkIGJ5IGFuIGFyaWEtd29uXG4gICAgICAgICAgICB3YWxrTm9kZSA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkod2Fsa05vZGUgYXMgSFRNTEVsZW1lbnQpIHx8IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtOb2RlKTsgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvKiogbW92ZWQgdG8gQ1NTVXRpbFxuICAgIHB1YmxpYyBzdGF0aWMgQ1NTKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHN0eWxlVGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChlbGVtZW50ID09PSBudWxsKSByZXR1cm4gW107XG4gICAgICAgIGlmIChlbGVtZW50LklCTV9DU1NfVEhCKSByZXR1cm4gZWxlbWVudC5JQk1fQ1NTX1RIQjtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgc3R5bGVUZXh0ID0gUlBUVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJzdHlsZVwiKSkge1xuICAgICAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICAgICAgfSBlbHNlIHJldHVybiBbXTtcbiAgICAgICAgaWYgKHN0eWxlVGV4dCA9PT0gbnVsbCB8fCBzdHlsZVRleHQudHJpbSgpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgICAvL3JlbW92ZSBjb21tZW50IGJsb2Nrc1xuICAgICAgICBsZXQgcmUgPSAvKFxcL1xcKisoPzooPzooPzpbXlxcKl0pKyl8KD86W1xcKl0rKD8hXFwvKSkpWypdK1xcLyl8XFwvXFwvLiogL2c7XG4gICAgICAgIGxldCBzdWJzdCA9ICcgJztcbiAgICAgICAgc3R5bGVUZXh0ID0gc3R5bGVUZXh0LnJlcGxhY2UocmUsIHN1YnN0KTtcbiAgICAgICAgLy8gRmluZCBhbGwgXCJrZXkgOiB2YWw7XCIgcGFpcnMgd2l0aCB2YXJpb3VzIHdoaXRlc3BhY2UgaW5iZXR3ZWVuXG4gICAgICAgIGxldCByS2V5VmFscyA9IC9cXHMqKFteOlxcc10rKVxccyo6XFxzKihbXjskfV0rKVxccyooO3wkKS9nO1xuICAgICAgICAvLyBGaW5kIGFsbCBcInNlbGVjdG9yIHsgY3Nza2V5dmFscyB9IHdpdGggdmFyaW91cyB3aGl0ZXNwYWNlIGluYmV0d2VlblxuICAgICAgICBsZXQgclNlbGVjdG9ycyA9IC9cXHMqKFtee10qKXsoW159XSopfS9nO1xuICAgICAgICBpZiAoc3R5bGVUZXh0LmluZGV4T2YoXCJ7XCIpID09PSAtMSkge1xuXG4gICAgICAgICAgICBsZXQga2V5VmFscyA9IHt9O1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICB3aGlsZSAoKG0gPSByS2V5VmFscy5leGVjKHN0eWxlVGV4dCkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBrZXlWYWxzW21bMV1dID0gbVsyXS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbHVlczoga2V5VmFsc1xuICAgICAgICAgICAgfV07XG4gICAgICAgICAgICBlbGVtZW50LklCTV9DU1NfVEhCID0gcmV0VmFsO1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgICAgIGxldCBtO1xuICAgICAgICAgICAgbGV0IG0yO1xuICAgICAgICAgICAgd2hpbGUgKChtID0gclNlbGVjdG9ycy5leGVjKHN0eWxlVGV4dCkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQga2V5VmFscyA9IHt9XG4gICAgICAgICAgICAgICAgbGV0IHNlbEtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgbGV0IHNlbFZhbCA9IG1bMl07XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAoKG0yID0gcktleVZhbHMuZXhlYyhzZWxWYWwpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHNbbTJbMV1dID0gbTJbMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbEtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBrZXlWYWxzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50LklCTV9DU1NfVEhCID0gcmV0VmFsO1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAqL1xuICAgIFxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udHJvbE9mTGFiZWwobm9kZTogTm9kZSkge1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGVhc3kgY2FzZSBvZiBsYWJlbCAtPiBmb3JcbiAgICAgICAgbGV0IGxhYmVsQW5jZXN0b3IgPSBSUFRVdGlsLmdldEFuY2VzdG9yKG5vZGUsIFwibGFiZWxcIik7XG4gICAgICAgIGlmIChsYWJlbEFuY2VzdG9yKSB7XG4gICAgICAgICAgICBpZiAobGFiZWxBbmNlc3Rvci5oYXNBdHRyaWJ1dGUoXCJmb3JcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnJhZ21lbnRVdGlsLmdldEJ5SWQobm9kZSwgbGFiZWxBbmNlc3Rvci5nZXRBdHRyaWJ1dGUoXCJmb3JcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGlkcyBvZiBwYXJlbnQgbm9kZXNcbiAgICAgICAgbGV0IGlkRGljdCA9IHt9O1xuICAgICAgICBsZXQgcGFyZW50V2FsayA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChwYXJlbnRXYWxrKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50V2Fsay5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGFyZW50V2FsayBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvci5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZERpY3RbYW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiaWRcIildID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnRXYWxrID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50V2Fsayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggY29udHJvbHMgdGhhdCB1c2UgYXJpYS1sYWJlbGxlZGJ5IGFuZCBzZWUgaWYgYW55IG9mIHRoZW0gcmVmZXJlbmNlIG9uZSBvZiBteSBhbmNlc3RvciBpZHNcbiAgICAgICAgY29uc3QgaW5wdXRzVXNpbmdMYWJlbGxlZEJ5ID0gbm9kZS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2FyaWEtbGFiZWxsZWRieV1cIik7XG4gICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8aW5wdXRzVXNpbmdMYWJlbGxlZEJ5Lmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0VXNpbmdMYWJlbGxlZEJ5ID0gaW5wdXRzVXNpbmdMYWJlbGxlZEJ5W2lkeF07XG4gICAgICAgICAgICBjb25zdCBhcmlhTGFiZWxsZWRCeSA9IGlucHV0VXNpbmdMYWJlbGxlZEJ5LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgIGNvbnN0IHNwID0gYXJpYUxhYmVsbGVkQnkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBzcCkge1xuICAgICAgICAgICAgICAgIGlmIChpZCBpbiBpZERpY3QgJiYgIVJQVFV0aWwuaXNJZFJlZmVyVG9TZWxmKG5vZGUsIChub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0VXNpbmdMYWJlbGxlZEJ5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmQgdGhlIGNhc2VzIHdoZXJlIHdlJ3JlIHdpdGhpbiBhbiBhcmlhIGxhYmVsbGVkYnlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgdGhlIG5vZGUgdGhhdCBpcyBwcm92aWVkIGlzXG4gICAgICogZGlzYWJsZWQgb3Igbm90LiBGb2xsb3dpbmcgaXMgaG93IHRoZSBjaGVjayBpcyBwZXJmb3JtZWQ6XG4gICAgICogICAgMS4gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBkaXNhYmxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczpcbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGRpc2FibGVkXG4gICAgICogICAgICAgICBBbHNvIG5lZWRzIHRvIGJlIFwiYnV0dG9uXCIsIFwiaW5wdXRcIiwgXCJzZWxlY3RcIiwgXCJ0ZXh0YXJlYVwiLCBcIm9wdGdyb3VwXCIsIFwib3B0aW9uXCIsXG4gICAgICogICAgICAgICBcIm1lbnVpdGVtXCIsIFwiZmllbGRzZXRcIiBub2RlcyAoaW4gYXJyYXkgZWxlbWVudHNBbGxvd2VkRGlzYWJsZWQpXG4gICAgICogICAgICAgYXR0cmlidXRlIC0tPiBhcmlhLWRpc2FibGVkPVwidHJ1ZVwiXG4gICAgICogICAgMi4gQ2hlY2sgaWYgYW55IG9mIHRoZSBjdXJyZW50IG5vZGVzIHBhcmVudHMgYXJlIGRpc2FibGVkIHdpdGggdGhlIHNhbWVcbiAgICAgKiAgICAgICBvcHRpb25zIGxpc3RlZCBpbiAxLlxuICAgICAqXG4gICAgICogICAgTm90ZTogSWYgZWl0aGVyIGN1cnJlbnQgbm9kZSBvciBhbnkgb2YgdGhlIHBhcmVudCBub2RlcyBhcmUgZGlzYWJsZWQgdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSAobm9kZSBpcyBkaXNhYmxlZCkuXG4gICAgICpcbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IG5vZGUgLSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpZiBpdCBpcyBkaXNhYmxlZCBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gdHJ1ZSBpZiB0aGUgbm9kZSBpcyBkaXNhYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlRGlzYWJsZWQobm9kZSkge1xuXG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0RJU0FCTEVEIHRvIGZhbHNlIGZvciBhbGwgdGhlIG5vZGVzLCBiZWZvcmUgdGhlIGNoZWNrIGFuZCB0aGlzIHdpbGwgYmUgY2hhbmdlZCB0b1xuICAgICAgICAvLyB0cnVlIHdoZW4gd2UgZGV0ZWN0IHRoYXQgdGhlIG5vZGUgaXMgZGlzYWJsZWQuIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuIE9ubHkgc2V0IGl0IHRvIGZhbHNlIGlmIHRoZSBzZXR0aW5nIGlzIHVuZGVmaW5lZCBvciBudWxsXG4gICAgICAgIC8vIGFzIGlmIGl0IGlzIGRlZmluZWQgd2UgZG8gbm90IHduYXQgdG8gcmVzZXQgaXQuIEFzIGlmIGl0IGlzIHRydWUgdGhlbiB3ZSBzaG91bGQgbWFrZSB1c2Ugb2YgaXRcbiAgICAgICAgLy8gdG8gc3BlZWQgdXAgdGhlIGNoZWNrLlxuICAgICAgICBsZXQgUFRfTk9ERV9ESVNBQkxFRCA9IGdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ESVNBQkxFRFwiLCBmYWxzZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgdGhlIG5vZGVUeXBlIG9mIHRoaXMgbm9kZSwgaWYgdGhpcyBub2RlIGlzIGEgdGV4dCBub2RlIHRoZW5cbiAgICAgICAgLy8gd2UgZ2V0IHRoZSBwYXJlbnRub2RlIGFuZCBzZXQgdGhhdCBhcyB0aGUgbm9kZSBhcyBhIHRleHQgbm9kZXMsXG4gICAgICAgIC8vIGRpc2FibGVkIGlzIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIHBhcmVudCBub2RlLlxuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgbm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGFyYXRpb25cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgZGlzYWJsZWQgZWxlbWVudCBwcm9wZXJ0eSwgZGlzYWJsZWQgYW5kIGFyaWEtZGlzYWJsZWQgYXR0cmlidXRlIGFuZCBjaGVjayB0aGF0IGl0IGlzIHRydWVcbiAgICAgICAgbGV0IGRpc2FibGVkQXR0cmlidXRlID0gbm9kZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgbGV0IGRpc2FibGVkUHJvcGVydHlDdXN0b20gPSBQVF9OT0RFX0RJU0FCTEVEO1xuICAgICAgICBsZXQgYXJpYURpc2FibGVkQXR0cmlidXRlID0gbm9kZS5oYXNBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnKSAmJiBub2RlLmdldEF0dHJpYnV0ZShcImFyaWEtZGlzYWJsZWRcIikgPT09ICd0cnVlJztcblxuICAgICAgICAvLyBJZiB0aGlzIG5vZGUgaGFzIGRpc2FibGVkIGF0dHJpYnV0ZSBhbmQgdGhlIG5vZGUgYWxsb3dzIGRpc2FibGVkIGF0dHJpYnV0ZSwgdGhlbiByZXR1cm4gdHJ1ZS5cbiAgICAgICAgLy8gRGlzYWJsZWQgYXR0cmlidXRlIGlzIG9ubHkgYWxsb3dlZCBvbiBcImJ1dHRvblwiLCBcImlucHV0XCIsIFwic2VsZWN0XCIsIFwidGV4dGFyZWFcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcIm1lbnVpdGVtXCIsIFwiZmllbGRzZXRcIlxuICAgICAgICAvLyBJbiB0aGUgY2FzZSBhcmlhLWRpc2FibGVkIGlzIHNldCB0byB0cnVlLCB0aGVuIGFsc28gcmV0dXJuIHRydWVcbiAgICAgICAgaWYgKGRpc2FibGVkUHJvcGVydHlDdXN0b20gfHwgKGRpc2FibGVkQXR0cmlidXRlICYmIEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWREaXNhYmxlZC5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSB8fCBhcmlhRGlzYWJsZWRBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIFBUX05PREVfRElTQUJMRUQgPSB0cnVlO1xuICAgICAgICAgICAgc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0RJU0FCTEVEXCIsIFBUX05PREVfRElTQUJMRUQpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgIC8vIGRpc2FibGVkIGF0dHJpYnV0ZS4gT25seSBrZWVwIGNoZWNraW5nIHVudGlsIHdlIGFyZSBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSBwYXJlbnROb2RlXG4gICAgICAgIC8vIGVsZW1lbnQuXG4gICAgICAgIGxldCBwYXJlbnRFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIHBhcmVudCBub2RlIGV4aXN0cyBhbmQgdGhlIG5vZGV0eXBlIGlzIGVsZW1lbnQgKDEpLCB0aGVuIHJ1biByZWN1cnNpdmUgY2FsbCB0byBwZXJmb3JtIHRoZSBjaGVja1xuICAgICAgICAvLyBhbGwgdGhlIHdheSB1cCB0byB0aGUgdmVyeSBwYXJlbnQgbm9kZS4gVXNlIHJlY3Vyc2l2ZSBjYWxsIGhlcmUgaW5zdGVhZCBvZiBhIHdoaWxlIGxvb3Agc28gdGhhdCB3ZSBkbyBub3RcbiAgICAgICAgLy8gaGF2ZSB0byBkdXBsaWNhdGUgdGhlIGxvZ2ljIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSBpcyBkaXNhYmxlZCBvciBub3QgZm9yIGFsbCB0aGUgcGFyZW50cyBzdGFydGluZyB3aXRoXG4gICAgICAgIC8vIGNoaWxkIG5vZGUuXG4gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwgJiYgcGFyZW50RWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseSwgYW5kIHNhdmUgdGhlIHJlc3VsdHMgaW4gYW4gdmFyaWFibGVcbiAgICAgICAgICAgIGxldCBub2RlRGlzYWJsZWQgPSBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHBhcmVudEVsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgbm9kZSBpcyBmb3VuZCB0byBiZSBkaXNhYmxlZCB0aGVuIGFkZCB0aGUgY3VzdG9tIFBUX05PREVfRElTQUJMRUQgdG8gdHJ1ZS5cbiAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGlzIG5leHQgdGltZSwgdG8gcXVpY2tseSBkZXRlcm1pbmUgaWYgbm9kZSBpcyBkaXNhYmxlZCBvciBub3QuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGV4dHJhIHBlcmNhdXRpb24sIHRoZSBpc05vZGVEaXNhYmxlZCBmdW5jdGlvbiBhbHJlYWR5IHNldHMgdGhpcy5cbiAgICAgICAgICAgIGlmIChub2RlRGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBQVF9OT0RFX0RJU0FCTEVEID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0RJU0FCTEVEXCIsIFBUX05PREVfRElTQUJMRUQpO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVEaXNhYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiBmYWxzZSAobm9kZSBpcyBub3QgZGlzYWJsZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmUgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIGJlIGNoZWNrZWRcbiAgICAgKiBpbiBydWxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIC0gQSBub2RlIHNvIHRoYXQgdGhlIGRvY3VtZW50IGNhbiBiZSBhY2Nlc3NlZCB0byBjaGVjayBmb3IgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uIENhbiBiZSBkb2N1bWVudCBlbGVtZW50IG9yIGEgc2ltcGxlIG5vZGUgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBiZSBjaGVja2VkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaG91bGRDaGVja0hpZGRlbkNvbnRlbnQobm9kZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgaWYgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBmcm9tIGNoZWNraW5nIG9yIG5vdCwgYmFzZWRcbiAgICAgKiBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZ3MgYW5kIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IG5vZGUgLSBOb2RlIHRvIGNoZWNrIGlmIGl0IGlzIHZpc2libGUgb3Igbm90IGJhc2VkIG9uIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihub2RlKSB7XG4gICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAvLyBvciBub3QuXG4gICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlXG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZSB0byBpZGVudGlmeSB0aGF0IHRoZSBub2RlIHNob3VsZCBub3QgYmUgc2Nhbm5lZC9hZGRlZCB0byBhbnkgaGFzaC9hcnJheS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgIGlmICghUlBUVXRpbC5zaG91bGRDaGVja0hpZGRlbkNvbnRlbnQobm9kZSkgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc2ZvY3VzYWJsZUJ5RGVmYXVsdChub2RlKSB7XG4gICAgICAgIHZhciBmb2N1c2FibGVFbGVtZW50cyA9IFsnaW5wdXQnLCAnc2VsZWN0JywgJ2J1dHRvbicsICd0ZXh0YXJlYScsICdvcHRpb24nLCAnYXJlYSddO1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFcIiAmJiBSUFRVdGlsLmhhc0F0dHJpYnV0ZShub2RlLCAnaHJlZicpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhcmVhXCIgJiYgUlBUVXRpbC5oYXNBdHRyaWJ1dGUobm9kZSwgJ2hyZWYnKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChmb2N1c2FibGVFbGVtZW50cy5pbmRleE9mKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT0gLTEpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjaGVjayBpZiBhIG5vbi10YWJhYmxlIG5vZGUgaGFzIHZhbGlkIHRhYmFibGUgY29udGVudC5cbiAgICAgKiBJZiBpdCBpcyB0YWJhYmxlICh0aGUgdGFiaW5kZXggaXMgbm90IHNwZWljaWZpZWQgb3IgaXMgbm90IC0xKSwgcmV0dXJucyBmYWxzZTtcbiAgICAgKiBJZiBpdCBpcyBub24tdGFiYWJsZSwgYnV0IGEgY2hpbGQgaXMgdGFiYWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBlbGVtZW50IGNvbnRlbnQsIHJldHVybnMgZmFsc2U7XG4gICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIHRydWUuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBub25UYWJhYmxlQ2hpbGRDaGVjayhlbGVtZW50IDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikgfHxcbiAgICAgICAgICAgIChwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSAhPSAtMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IG53LmVsZW0oKTtcbiAgICAgICAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCkgeyAvLyBUZXh0IG5vZGUuIHVzdWFsbHkgaXMgYSBjYXJ0cmlkZ2UgcmV0dXJuLlxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoaWxkLmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpICYmXG4gICAgICAgICAgICAgICAgKHBhcnNlSW50KGNoaWxkLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSAhPSAtMSkgJiZcbiAgICAgICAgICAgICAgICAhUlBUVXRpbC5oYXNJbm5lckNvbnRlbnQoY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgICAgdmFyIGhhc0F0dHJpYnV0ZSA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIGhhc0F0dHJpYnV0ZSA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuYXR0cmlidXRlcyAmJiBlbGVtZW50LmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKSB7XG4gICAgICAgICAgICB2YXIgYXR0ciA9IGVsZW1lbnQuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgICBoYXNBdHRyaWJ1dGUgPSBhdHRyICYmIGF0dHIuc3BlY2lmaWVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNBdHRyaWJ1dGU7XG4gICAgfVxufVxuLyoqIG1vdmVkIHRvIENTU1V0aWxcbmV4cG9ydCBjbGFzcyBSUFRVdGlsU3R5bGUge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0V2VpZ2h0TnVtYmVyKHN0eWxlVmFsKSB7XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBcImxpZ2h0XCI6IDEwMCxcbiAgICAgICAgICAgIFwiYm9sZFwiOiA3MDBcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHJldFZhbCA9IHBhcnNlSW50KHN0eWxlVmFsKTtcbiAgICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgaWYgKHN0eWxlVmFsIGluIG1hcClcbiAgICAgICAgICAgIHJldHVybiBtYXBbc3R5bGVWYWxdO1xuICAgICAgICByZXR1cm4gNDAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Rm9udEluUGl4ZWxzID0gZnVuY3Rpb24gKHN0eWxlVmFsKSB7XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBcInh4LXNtYWxsXCI6IDE2LFxuICAgICAgICAgICAgXCJ4LXNtYWxsXCI6IDEwLFxuICAgICAgICAgICAgXCJzbWFsbFwiOiAxMyxcbiAgICAgICAgICAgIFwibWVkaXVtXCI6IDE2LFxuICAgICAgICAgICAgXCJsYXJnZVwiOiAxOCxcbiAgICAgICAgICAgIFwieC1sYXJnZVwiOiAyNCxcbiAgICAgICAgICAgIFwieHgtbGFyZ2VcIjogMzJcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHZhbHVlID0gcGFyc2VGbG9hdChzdHlsZVZhbCk7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBbc3R5bGVWYWxdO1xuICAgICAgICB9XG4gICAgICAgIGxldCB1bml0cyA9IHN0eWxlVmFsLnN1YnN0cmluZygoXCJcIiArIHZhbHVlKS5sZW5ndGgpO1xuICAgICAgICBpZiAodW5pdHMgPT09IFwiXCIgfHwgdW5pdHMgPT09IFwicHhcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikgcmV0dXJuIHZhbHVlICogMTY7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCIlXCIpIHJldHVybiB2YWx1ZSAvIDEwMCAqIDE2O1xuICAgICAgICBpZiAodW5pdHMgPT09IFwicHRcIikgcmV0dXJuIHZhbHVlICogNCAvIDM7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICB9XG59XG4qL1xuLyogUmV0dXJuIGEgbm9kZSB3YWxrZXIgZm9yIHRoZSBnaXZlbiBlbGVtZW50LlxuICogYkVuZCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gZmFsc2VcbiAqIGJ1dCBpZiB0cnVlLCBpbmRpY2F0ZXMgdGhlIG5vZGUgaXMgdGhlIGVuZCBub2RlKi9cbmV4cG9ydCBjbGFzcyBOb2RlV2Fsa2VyIHtcbiAgICBub2RlIDogTm9kZTtcbiAgICBiRW5kVGFnIDogYm9vbGVhbjtcbiAgICBjb25zdHJ1Y3Rvcihub2RlOiBOb2RlLCBiRW5kPzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgICAgICB0aGlzLmJFbmRUYWcgPSAoYkVuZCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBiRW5kID09PSB0cnVlKTtcbiAgICB9XG5cbiAgICBlbGVtKCkgOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmIHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCB8fCBudWxsO1xuICAgIH1cblxuICAgIG5leHROb2RlKCkge1xuICAgICAgICBpZiAoIXRoaXMubm9kZSkge1xuICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gICAgXG4gICAgICAgIGlmICghdGhpcy5iRW5kVGFnKSB7XG4gICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgbGV0IGVsZW1lbnROb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICBsZXQgc2xvdEVsZW1lbnQgPSAodGhpcy5ub2RlIGFzIEhUTUxTbG90RWxlbWVudClcbiAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi9cbiAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIlxuICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5ud093bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovXG4gICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QuZmlyc3RDaGlsZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm53T3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDFcbiAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNsb3RcIlxuICAgICAgICAgICAgICAgICYmIHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpWzBdO1xuICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5ud1Nsb3RPd25lciA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkubndTbG90SW5kZXggPSAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHROb2RlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm53U2xvdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNsb3RPd25lciA9ICh0aGlzLm5vZGUgYXMgYW55KS5ud1Nsb3RPd25lcjtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFNsb3RJbmRleCA9ICh0aGlzLm5vZGUgYXMgYW55KS5ud1Nsb3RJbmRleCsxO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkubndTbG90T3duZXI7XG4gICAgICAgICAgICAgICAgZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5ud1Nsb3RJbmRleDtcbiAgICAgICAgICAgICAgICBpZiAobmV4dFNsb3RJbmRleCA8IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKClbbmV4dFNsb3RJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5ud1Nsb3RPd25lciA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm53U2xvdEluZGV4ID0gbmV4dFNsb3RJbmRleDsgICAgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5ud093bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5ud093bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByZXZOb2RlKCkge1xuICAgICAgICBpZiAodGhpcy5iRW5kVGFnICYmIHRoaXMubm9kZS5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJFbmRUYWcgJiYgKHRoaXMubm9kZS5maXJzdENoaWxkID09PSBudWxsIHx8IHR5cGVvZiAodGhpcy5ub2RlLmZpcnN0Q2hpbGQpID09PSAndW5kZWZpbmVkJykpXG4gICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBJTWFwcGVyLCBJTWFwUmVzdWx0LCBCb3VuZHMgfSBmcm9tIFwiLi4vYXBpL0lNYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21tb25NYXBwZXIgaW1wbGVtZW50cyBJTWFwcGVyIHtcbiAgICBhYnN0cmFjdCBnZXRSb2xlKG5vZGU6IE5vZGUpIDogc3RyaW5nO1xuICAgIGFic3RyYWN0IGdldE5hbWVzcGFjZSgpIDogc3RyaW5nO1xuICAgIGFic3RyYWN0IGdldEF0dHJpYnV0ZXMobm9kZTogTm9kZSkgOiB7IFtrZXk6c3RyaW5nXTogc3RyaW5nIH07XG5cbiAgICBwcm90ZWN0ZWQgaGllcmFyY2h5Um9sZSA6IHN0cmluZ1tdID0gbnVsbDtcbiAgICBwcm90ZWN0ZWQgaGllcmFyY2h5UGF0aDogQXJyYXk8e1xuICAgICAgICByb2xlUGF0aDogc3RyaW5nLFxuICAgICAgICByb2xlQ291bnQ6IHtcbiAgICAgICAgICAgIFtyb2xlOiBzdHJpbmddOiBudW1iZXJcbiAgICAgICAgfVxuICAgIH0+ID0gbnVsbDtcbiAgICBwcm90ZWN0ZWQgaGllcmFyY2h5UmVzdWx0czogSU1hcFJlc3VsdFtdID0gbnVsbDtcblxuICAgIGdldEJvdW5kcyhub2RlOiBOb2RlKSA6IEJvdW5kcyB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJlc2V0KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IFtdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVBhdGggPSBbe1xuICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICByb2xlQ291bnQ6IHt9XG4gICAgICAgIH1dO1xuXG4gICAgICAgIGxldCBhbmNlc3RvcnMgOiBOb2RlW10gPSBbXTtcbiAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGUpO1xuICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgYW5jZXN0b3JzLnB1c2gocGFyZW50KTtcbiAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgYW5jZXN0b3JzID0gYW5jZXN0b3JzLnJldmVyc2UoKTtcbiAgICAgICAgZm9yIChjb25zdCBhbmNlc3RvciBvZiBhbmNlc3RvcnMpIHtcbiAgICAgICAgICAgIGxldCBzaWJsaW5ncyA9IFtdO1xuICAgICAgICAgICAgbGV0IHNpYmxpbmcgPSBhbmNlc3Rvci5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB3aGlsZSAoc2libGluZykge1xuICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goc2libGluZyk7XG4gICAgICAgICAgICAgICAgc2libGluZyA9IHNpYmxpbmcucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2libGluZ3MgPSBzaWJsaW5ncy5yZXZlcnNlKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNpYmxpbmcgb2Ygc2libGluZ3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hIaWVyYXJjaHkoc2libGluZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3BIaWVyYXJjaHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHVzaEhpZXJhcmNoeShhbmNlc3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHVzaEhpZXJhcmNoeShub2RlOiBOb2RlKSB7XG4gICAgICAgIGxldCByb2xlIDogc3RyaW5nID0gdGhpcy5nZXRSb2xlKG5vZGUpIHx8IFwibm9uZVwiO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUucHVzaChyb2xlKTtcbiAgICAgICAgaWYgKHJvbGUgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50UGF0aEluZm8gPSB0aGlzLmhpZXJhcmNoeVBhdGhbdGhpcy5oaWVyYXJjaHlQYXRoLmxlbmd0aC0xXTtcbiAgICAgICAgICAgIHBhcmVudFBhdGhJbmZvLnJvbGVDb3VudFtyb2xlXSA9IChwYXJlbnRQYXRoSW5mby5yb2xlQ291bnRbcm9sZV0gfHwgMCkgKyAxOyBcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aC5wdXNoKHtcbiAgICAgICAgICAgICAgICBcInJvbGVQYXRoXCI6IHBhcmVudFBhdGhJbmZvLnJvbGVQYXRoK1wiL1wiK3JvbGUrXCJbXCIrcGFyZW50UGF0aEluZm8ucm9sZUNvdW50W3JvbGVdK1wiXVwiLFxuICAgICAgICAgICAgICAgIFwicm9sZUNvdW50XCI6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhdHRyID0ge31cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZXMobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZTogdGhpcy5nZXROYW1lc3BhY2UoKSxcbiAgICAgICAgICAgIHJvbGU6IHJvbGUsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBhdHRyLFxuICAgICAgICAgICAgcm9sZVBhdGg6IHRoaXMuaGllcmFyY2h5UGF0aFt0aGlzLmhpZXJhcmNoeVBhdGgubGVuZ3RoLTFdLnJvbGVQYXRoLFxuICAgICAgICAgICAgYm91bmRzOiB0aGlzLmdldEJvdW5kcyhub2RlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBwb3BIaWVyYXJjaHkoKSB7XG4gICAgICAgIGxldCByb2xlID0gdGhpcy5oaWVyYXJjaHlSb2xlLnBvcCgpO1xuICAgICAgICBpZiAocm9sZSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aC5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMucG9wKCk7XG4gICAgfVxuXG4gICAgb3BlblNjb3BlKG5vZGU6IE5vZGUpOiBJTWFwUmVzdWx0W10ge1xuICAgICAgICBpZiAodGhpcy5oaWVyYXJjaHlSb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHVzaEhpZXJhcmNoeShub2RlKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmhpZXJhcmNoeVJlc3VsdHM7XG4gICAgfVxuXG4gICAgY2xvc2VTY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgbGV0IHJldFZhbCA6IElNYXBSZXN1bHRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiB0aGlzLmhpZXJhcmNoeVJlc3VsdHMpIHtcbiAgICAgICAgICAgIC8vIGNvbnN0IHRlbXAgPSByZXMubm9kZTtcbiAgICAgICAgICAgIC8vIHJlcy5ub2RlID0gbnVsbDtcbiAgICAgICAgICAgIC8vIGxldCBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcykpO1xuICAgICAgICAgICAgLy8gY2xvbmVkLm5vZGUgPSByZXMubm9kZSA9IHRlbXA7IFxuICAgICAgICAgICAgLy8gcmV0VmFsLnB1c2goY2xvbmVkKTtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZSA9IFwiL1wiK3JldFZhbFtyZXRWYWwubGVuZ3RoLTFdLnJvbGVcbiAgICAgICAgdGhpcy5wb3BIaWVyYXJjaHkoKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IElNYXBSZXN1bHQgfSBmcm9tIFwiLi4vYXBpL0lNYXBwZXJcIjtcbmltcG9ydCB7IFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JRW5naW5lXCI7XG5cbi8vIENvbnRleHQgdGhhdCB3aWxsIGNhdXNlIHRoaXMgcnVsZSB0byBleGVjdXRlLiBcbi8vIENvbnRleHQgc3ludGF4OlxuLy8gICBUcmlnZ2Vyczpcbi8vICAgICBhcmlhOnJvbGUgLSBUcmlnZ2VycyBvbiBlbGVtZW50IHdpdGggQVJJQSByb2xlIHJvbGVcbi8vICAgICBhcmlhOnJvbGVbYXR0cmlidXRlXSAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdGhlIGVxdWl2YWxlbnQgbG9naWNhbCBcbi8vICAgICAgIGFyaWEtIGF0dHJpYnV0ZSAoZS5nLiwgYnV0dG9uW2Rpc2FibGVkXSB3aWxsIHRyaWdnZXIgb24gXG4vLyAgICAgICA8YnV0dG9uIGRpc2FibGVkPiBvciA8ZGl2IHJvbGU9XCJidXR0b25cIiBhcmlhLWRpc2FibGVkPVwidHJ1ZVwiPilcbi8vICAgICByb2xlW2F0dHJpYnV0ZT12YWx1ZV0gLSBTaW1pbGFyIHRvIGFib3ZlLCB3aXRoIGNhc2Utc2Vuc2l0aXZlIG1hdGNoXG4vLyAgICAgICB0byB2YWx1ZVxuLy8gICAgIHJvbGVbYXR0cmlidXRlfnZhbHVlXSAtIFNpbWlsYXIgdG8gYWJvdmUsIHdpdGggY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaFxuLy8gICAgIGRvbTplbGVtZW50IC0gVHJpZ2dlcnMgb24gYW4gZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZVxuLy8gICAgIGRvbTplbGVtZW50W2F0dHJpYnV0ZV0gLSBUcmlnZ2VycyBvbiBhIGRvbSBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVcbi8vICAgICBkb206KlthdHRyaWJ1dGVdIC0gVHJpZ2dlcnMgb24gYWxsIGVsZW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVcbi8vICAgQ29tYmluaW5nIHRyaWdnZXJzOlxuLy8gICAgIHRyaWdnZXIxIHRyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiB3aXRoaW4gYW4gXG4vLyAgICAgICBlbGVtZW50IHdpdGggdHJpZ2dlcjFcbi8vICAgICAhdHJpZ2dlcjEgdHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIG5vdCB3aXRoaW5cbi8vICAgICAgIGVsZW1lbnQgd2l0aCB0cmlnZ2VyMVxuLy8gICAgIHRyaWdnZXIxPnRyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiB3aXRoIGFuXG4vLyAgICAgICBhbiBpbW1lZGlhdGUgcGFyZW50IHdpdGggdHJpZ2dlcjFcbi8vICAgICB0cmlnZ2VyMSt0cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgd2l0aCBhblxuLy8gICAgICAgaW1tZWRpYXRlIHByZXZpb3VzIHNpYmxpbmcgd2l0aCB0cmlnZ2VyMVxuLy8gICAgIHRyaWdnZXIxfnRyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiB3aXRoIGFuXG4vLyAgICAgICBzb21lIGVhcmxpZXIgc2libGluZyB3aXRoIHRyaWdnZXIxXG4vLyAgICAgY29udGV4dCxjb250ZXh0IC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCBlaXRoZXIgY29udGV4dFxuZXhwb3J0IGNsYXNzIEF0dHJJbmZvIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGluY2x1c2l2ZTogYm9vbGVhbixcbiAgICAgICAgcHVibGljIGF0dHI6IHN0cmluZyxcbiAgICAgICAgcHVibGljIGVxPzogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgdmFsdWU/OiBzdHJpbmdcbiAgICApIHtcbiAgICAgICAgaWYgKCFpbmNsdXNpdmUgXG4gICAgICAgICAgICAgICAgJiYgKCh0eXBlb2YgZXEpICE9PSBcInVuZGVmaW5lZFwiICYmIGVxLmxlbmd0aCA+IDApKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgaGF2ZSAhYXR0clwiK2VxK1wiIGNvbnRleHRcIik7ICAgIFxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdXNpdmUgJiYgKHR5cGVvZiBlcSkgIT09IFwidW5kZWZpbmVkXCIgJiYgZXEubGVuZ3RoID4gMCAmJiAoKHR5cGVvZiB2YWx1ZSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdmFsdWUubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGhhdmUgZXF1aXZhbGVuY2UgY2hlY2sgd2l0aG91dCBhIHZhbHVlXCIpOyAgICBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBtYXRjaGVzKGNvbnRleHQ6IElNYXBSZXN1bHQpIHtcbiAgICAgICAgY29uc3QgcnVsZUF0dHJQYXJ0ID0gdGhpczsgXG4gICAgICAgIGNvbnN0IGVsZW1BdHRycyA9IGNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgaWYgKCEocnVsZUF0dHJQYXJ0LmF0dHIgaW4gZWxlbUF0dHJzKSkge1xuICAgICAgICAgICAgcmV0dXJuICFydWxlQXR0clBhcnQuaW5jbHVzaXZlXG4gICAgICAgIH0gZWxzZSBpZiAoIXJ1bGVBdHRyUGFydC5pbmNsdXNpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICghcnVsZUF0dHJQYXJ0LmVxKSB7XG4gICAgICAgICAgICAvLyBpbmNsdXNpdmUgbWF0Y2ggYW5kIEkgaGF2ZSB0aGF0IGF0dHJpYnV0ZSBhbmQgbm8gZXF1aXZhbGVuY2UgZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpbmNsdXNpdmUgbWF0Y2ggYW5kIEkgaGF2ZSB0aGF0IGF0dHJpYnV0ZSBhbmQgZXF1aXZhbGVuY2UgZGVmaW5lZFxuICAgICAgICAgICAgY29uc3QgYXR0clZhbHVlID0gZWxlbUF0dHJzW3J1bGVBdHRyUGFydC5hdHRyXTtcbiAgICAgICAgICAgIGlmIChydWxlQXR0clBhcnQuZXEgPT09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVBdHRyUGFydC52YWx1ZSA9PT0gYXR0clZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQXR0clBhcnQuZXEgPT09IFwiIT1cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlQXR0clBhcnQudmFsdWUgIT09IGF0dHJWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocnVsZUF0dHJQYXJ0LmVxID09PSBcIn5cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlQXR0clBhcnQudmFsdWUgPT09IGF0dHJWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocnVsZUF0dHJQYXJ0LmVxID09PSBcIiF+XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZUF0dHJQYXJ0LnZhbHVlICE9PSBhdHRyVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgZXF1aXZhbGVuY2Ugb3BlcmF0b3Igbm90IHN1cHBvcnRlZFwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFydEluZm8ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaW5jbHVzaXZlOiBib29sZWFuLCBcbiAgICAgICAgcHVibGljIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcm9sZTogc3RyaW5nLCBcbiAgICAgICAgcHVibGljIGF0dHJzOiBBdHRySW5mb1tdLCBcbiAgICAgICAgcHVibGljIGNvbm5lY3Rvcjogc3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCIqXCIgJiYgIWluY2x1c2l2ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIiEqIGNvbnRleHQgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgcHVibGljIG1hdGNoZXMoIFxuICAgICAgICBjb250ZXh0SGllcjogUnVsZUNvbnRleHRIaWVyYXJjaHksXG4gICAgICAgIGhpZXJMZXZlbDogbnVtYmVyKSA6IGJvb2xlYW4gXG4gICAge1xuICAgICAgICBjb25zdCBydWxlUGFydCA9IHRoaXM7XG4gICAgICAgIGxldCBydWxlUm9sZU1hdGNoID0gKHJ1bGVQYXJ0Lm5hbWVzcGFjZSBpbiBjb250ZXh0SGllcikgJiYgY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdXG4gICAgICAgICAgICAmJiAoY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdLnJvbGUgPT09IHJ1bGVQYXJ0LnJvbGVcbiAgICAgICAgICAgICAgICB8fCBjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF0ucm9sZSAhPT0gXCJub25lXCIgJiYgcnVsZVBhcnQucm9sZSA9PT0gXCIqXCIpO1xuICAgICAgICBpZiAocnVsZVJvbGVNYXRjaCBcbiAgICAgICAgICAgICYmIHJ1bGVQYXJ0LnJvbGUgPT09IFwiKlwiIFxuICAgICAgICAgICAgJiYgcnVsZVBhcnQubmFtZXNwYWNlID09PSBcImRvbVwiIFxuICAgICAgICAgICAgJiYgKGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXS5yb2xlID09PSBcIiN0ZXh0XCJcbiAgICAgICAgICAgICAgICB8fCBjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF0ucm9sZSA9PT0gXCIvI3RleHRcIikpIHtcbiAgICAgICAgICAgIHJ1bGVSb2xlTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnVsZVBhcnQuaW5jbHVzaXZlICYmICFydWxlUm9sZU1hdGNoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghcnVsZVBhcnQuaW5jbHVzaXZlICYmICFydWxlUm9sZU1hdGNoKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBNYXRjaCB0aGUgYXR0cmlidXRlc1xuICAgICAgICBjb25zdCBydWxlQXR0cnMgPSBydWxlUGFydC5hdHRycztcbiAgICAgICAgY29uc3QgZWxlbUNvbnRleHQgPSBjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF07XG4gICAgICAgIGxldCBtYXRjaCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZUF0dHJQYXJ0IG9mIHJ1bGVBdHRycykge1xuICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaCAmJiBydWxlQXR0clBhcnQubWF0Y2hlcyhlbGVtQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydWxlUGFydC5pbmNsdXNpdmUpIG1hdGNoID0gIW1hdGNoO1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0IHtcbiAgICBjb250ZXh0SW5mbyA6IFBhcnRJbmZvW10gPSBbXVxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGxldCBjb250ZXh0SGllck1hdGNoZXMgOiBzdHJpbmdbXSA9IGNvbnRleHQubWF0Y2goLyE/Wy9hLXpBLVo6MC05KlxcLV9dKyhcXFtbXlxcXV0rXFxdKSpbID4rfl0/L2cpO1xuICAgICAgICBsZXQgcmVzdWx0cyA6IFBhcnRJbmZvW10gPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgY29udGV4dEhpZXJNYXRjaGVzKSB7XG4gICAgICAgICAgICBsZXQgcGFydHMgPSBwYXJ0Lm1hdGNoKC8oIT8pKFsvYS16QS1aOjAtOSpcXC1fXSspKChcXFtbXlxcXV0rXFxdKSopKFsgPit+XT8pLyk7XG4gICAgICAgICAgICBsZXQgYXR0ckluZm8gOiBBdHRySW5mb1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHJQYXJ0IG9mIHBhcnRzWzNdLm1hdGNoKC9cXFsoW15cXF1dKylcXF0vZykgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0clBhcnRzID0gYXR0clBhcnQubWF0Y2goL1xcWyghPykoW2EtejpBLVoqXFwtX10rKSghP1s9fl0pPyhbXlxcXV0rKT9cXF0vKTtcbiAgICAgICAgICAgICAgICBhdHRySW5mby5wdXNoKG5ldyBBdHRySW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzFdICE9PSBcIiFcIixcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzJdLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICAgIGF0dHJQYXJ0c1szXSxcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzRdXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJ0c1syXSA9IHBhcnRzWzJdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBjb25zdCBuc1BhcnRzID0gcGFydHNbMl0uc3BsaXQoXCI6XCIpO1xuICAgICAgICAgICAgbGV0IGluY2wgPSBwYXJ0c1sxXSAhPT0gXCIhXCI7XG4gICAgICAgICAgICBjb25zdCBucyA9IG5zUGFydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIGxldCByb2xlID0gbnNQYXJ0cy5qb2luKFwiOlwiKTtcbiAgICAgICAgICAgIGxldCBwYXJ0SW5mbyA9IG5ldyBQYXJ0SW5mbyhpbmNsLCBucywgcm9sZSwgYXR0ckluZm8sIHBhcnRzW3BhcnRzLmxlbmd0aC0xXSk7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2gocGFydEluZm8pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dEluZm8gPSByZXN1bHRzO1xuICAgIH1cblxuICAgIHN0YXRpYyBjbGVhbkNvbnRleHQoY29udGV4dDogc3RyaW5nKSA6IHN0cmluZyB7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKC8gKyEvZywgXCIgIVwiKTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQucmVwbGFjZSgvICsoWz4rfixdKS9nLCBcIiQxXCIpO1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKC8oWz4rfixdKSArL2csIFwiJDFcIik7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2UoLyArL2csIFwiIFwiKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQudHJpbSgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShjb250ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGNvbnRleHRzID0gQ29udGV4dC5zcGxpdE11bHRpcGxlKENvbnRleHQuY2xlYW5Db250ZXh0KGNvbnRleHQpKTtcblxuICAgICAgICBsZXQgcmV0VmFsIDogQ29udGV4dFtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IGN0eCA9IG5ldyBDb250ZXh0KGNvbnRleHRzW2ldKTtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGluaXRpYWwgcHJvY2Vzc2luZyBvZiBzcGxpdHRpbmcgb24gY29tbWEgLSBjb250ZXh0LGNvbnRleHRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBcbiAgICAgKi9cbiAgICBzdGF0aWMgc3BsaXRNdWx0aXBsZShjb250ZXh0OiBzdHJpbmcpIDogc3RyaW5nW10ge1xuICAgICAgICBsZXQgY29udGV4dHMgPSBbXTtcbiAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmluZGV4T2YoXCIsXCIpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBjb250ZXh0LnNwbGl0KFwiLFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0cy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGV4dHM7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgSUVuZ2luZSwgUmVwb3J0LCBSdWxlLCBSdWxlRGV0YWlscywgUnVsZVJlc3VsdCwgZVJ1bGVDb25maWRlbmNlLCBSdWxlQ29udGV4dCwgTmxzTWFwLCBIZWxwTWFwLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSUVuZ2luZVwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IENvbnRleHQsIFBhcnRJbmZvLCBBdHRySW5mbyB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gXCIuLi9jb25maWcvQ29uZmlnXCI7XG5pbXBvcnQgeyBJTWFwUmVzdWx0LCBJTWFwcGVyIH0gZnJvbSBcIi4uL2FwaS9JTWFwcGVyXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vZG9tL0RPTU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgY2xlYXJDYWNoZXMgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcblxuY2xhc3MgV3JhcHBlZFJ1bGUge1xuICAgIG5zOiBzdHJpbmc7XG4gICAgaWR4PzogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IgKHB1YmxpYyBydWxlOiBSdWxlLCBwdWJsaWMgcGFyc2VkSW5mbyA6IENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5ucyA9IHRoaXMucGFyc2VkSW5mby5jb250ZXh0SW5mb1t0aGlzLnBhcnNlZEluZm8uY29udGV4dEluZm8ubGVuZ3RoLTFdLm5hbWVzcGFjZTtcbiAgICAgICAgQ29uZmlnLkRFQlVHICYmIGNvbnNvbGUubG9nKFwiQWRkZWQgUnVsZTpcIiwgcnVsZS5pZCwgSlNPTi5zdHJpbmdpZnkodGhpcy5wYXJzZWRJbmZvKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBjb252ZXJ0aW5nIHRoZSBub2RlIGludG8gYSBzbmlwcGV0IHdoaWNoIGNhbiBiZSBhZGRlZCB0byByZXBvcnQuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSB0aGUgbm9kZSBhbmQgZXh0cmFjdCB0aGUgbm9kZSBuYW1lIGFuZCB0aGUgYXR0cmlidXRlcyBhbmQgYnVpbGQgdGhlIHNuaXBwZXQgYmFzZWQgb24gdGhpcy5cbiAgICAgKlxuICAgICAqIFRPRE86IEZ1dHVyZSwgbWF5YmUgd2UgY2FuIGV4dHJhY3QgbW9yZSB0aGVuIGp1c3Qgc2luZ2xlIGxpbmUsIGFkZCBtb3JlIGluZm8gb3IgZXZlbiBhZGQgY2xvc2luZyB0YWdzIGV0Yy4uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBodG1sIGVsZW1lbnQgdG8gY29udmVydCBpbnRvIGVsZW1lbnQgc25pcHBldCB3aXRoIG5vZGUgbmFtZSBhbmQgYXR0cmlidXRlcyBvbmx5LlxuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBub2RlU25pcHBldCAtIHJldHVybiB0aGUgZWxlbWVudCBzbmlwcGV0IG9mIHRoZSBlbGVtZW50IHRoYXQgd2FzIHByb3ZpZGVkIHdoaWNoIG9ubHkgY29udGFpbnMsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVuYW1lIGFuZCBhdHRyaWJ1dGVzLiBpLmUuIDx0YWJsZSBpZD1cXFwibGF5b3V0X3RhYmxlMVxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiB0aGlzXG4gICAgICovXG4gICAgc3RhdGljIGNvbnZlcnROb2RlVG9TbmlwcGV0KG5vZGUgOiBFbGVtZW50KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIHZhciBub2RlU25pcHBldCA9ICcnO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG5vZGUgbmFtZSBhbmQgYWRkIGl0IHRvIHRoZSBub2RlIHNuaXBwZXRcbiAgICAgICAgbm9kZVNuaXBwZXQgKz0gJzwnICsgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgYWxsIHRoZSBub2RlIGF0dHJpYnV0ZXMgYXMgYW4gYXJyYXlcbiAgICAgICAgdmFyIG5vZGVBdHRyaWJ1dGVzID0gbm9kZS5hdHRyaWJ1dGVzO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBhdHRyaWJ1dGVzIG9uIHRoaXMgbm9kZVxuICAgICAgICBpZiAobm9kZUF0dHJpYnV0ZXMgIT09IG51bGwgJiYgdHlwZW9mIG5vZGVBdHRyaWJ1dGVzICE9PSAndW5kZWZpbmVkJykge1xuXG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZXNlcyBhdHRyaWJ1dGVzIGFuZCBhZGQgdGhlIG5hbWUgYW5kIHZhbHVlIHRvIHRoZSBub2RlU25pcHBldCB3aGljaCB3aWxsIGJlIHJldHVybmVkXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbm9kZUF0dHJpYnV0ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZUF0dHJpYnV0ZXNbaV0ubmFtZSA9PT0gXCJkYXRhLW5hbWV3YWxrXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIHZhbHVlLlxuICAgICAgICAgICAgICAgIG5vZGVTbmlwcGV0ICs9ICcgJyArIG5vZGVBdHRyaWJ1dGVzW2ldLm5hbWUgKyAnPVwiJyArIG5vZGVBdHRyaWJ1dGVzW2ldLnZhbHVlICsgJ1wiJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsb3NlIHRoZSBub2RlXG4gICAgICAgIG5vZGVTbmlwcGV0ICs9ICc+JztcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIG5vZGUgc25pcHBldFxuICAgICAgICByZXR1cm4gbm9kZVNuaXBwZXQ7XG4gICAgfVxuXG4gICAgcnVuKGVuZ2luZTogRW5naW5lLCBjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBSdWxlRGV0YWlsc1tdIHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIGxldCByZXN1bHRzOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHRoaXMucnVsZS5ydW4oY29udGV4dCwgb3B0aW9ucywgY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc3QgZXJyOiBFcnJvciA9IGU7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUlVMRSBFWENFUFRJT046XCIsdGhpcy5ydWxlLmlkLCBjb250ZXh0LmRvbS5yb2xlUGF0aCwgZXJyLnN0YWNrKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBpZiAoIXJlc3VsdHMpIHJlc3VsdHMgPSBbXTtcblxuICAgICAgICBpZiAoIShyZXN1bHRzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgICAgICByZXN1bHRzID0gW3Jlc3VsdHNdO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgOiBSdWxlRGV0YWlsc1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlbmdpbmUuZ2V0TWVzc2FnZSh0aGlzLnJ1bGUuaWQsIHJlc3VsdC5yZWFzb25JZCwgcmVzdWx0Lm1lc3NhZ2VBcmdzKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbnMgaW4gY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHBhdGhbbnNdID0gY29udGV4dFtuc10ucm9sZVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJ1bGVJZCA9IHRoaXMucnVsZS5pZC5yZXBsYWNlKC9eKC4qKVxcJFxcJFxcZCskLywgXCIkMVwiKTtcblxuICAgICAgICAgICAgcmV0VmFsLnB1c2goe1xuICAgICAgICAgICAgICAgIHJ1bGVJZDogcnVsZUlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgbm9kZTogY29udGV4dFtcImRvbVwiXS5ub2RlLFxuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICAgICAgcnVsZVRpbWU6IGVuZFRpbWUtc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgIHJlYXNvbklkOiByZXN1bHQucmVhc29uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlQXJnczogcmVzdWx0Lm1lc3NhZ2VBcmdzLFxuICAgICAgICAgICAgICAgIGFwaUFyZ3M6IHJlc3VsdC5hcGlBcmdzLFxuICAgICAgICAgICAgICAgIGJvdW5kczogY29udGV4dFtcImRvbVwiXS5ib3VuZHMsXG4gICAgICAgICAgICAgICAgc25pcHBldDogV3JhcHBlZFJ1bGUuY29udmVydE5vZGVUb1NuaXBwZXQoY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5naW5lIGltcGxlbWVudHMgSUVuZ2luZSB7XG4gICAgcHVibGljIHN0YXRpYyBnZXRMYW5ndWFnZXMoKSB7XG4gICAgICAgIGNvbnN0IGVudiA9IHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiAocHJvY2VzcyBhcyBhbnkpLm5vZGVUeXBlID09PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52O1xuICAgICAgICAvLyBJZiBhbGwgZWxzZSBmYWlscywgZGVmYXVsdCB0byBVUyBFbmdsaXNoXG4gICAgICAgIGxldCBub2RlTGFuZyA9IFwiZW4tVVNcIjtcbiAgICAgICAgaWYgKGVudikge1xuICAgICAgICAgICAgbm9kZUxhbmcgPSBlbnYuTEFORyB8fCBlbnYuTEFOR1VBR0UgfHwgZW52LkxDX0FMTCB8fCBlbnYuTENfTUVTU0FHRVM7XG4gICAgICAgICAgICBpZiAobm9kZUxhbmcgJiYgbm9kZUxhbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG5vZGVMYW5nID0gbm9kZUxhbmcuc3BsaXQoXCIuXCIpWzBdLnJlcGxhY2UoL18vZyxcIi1cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGVMYW5nID0gXCJlbi1VU1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvci5sYW5ndWFnZXMgfHwgW25vZGVMYW5nXTtcbiAgICB9XG4gICAgbWFwcGVycyA6IHsgW25hbWVzcGFjZTogc3RyaW5nXSA6IElNYXBwZXIgfSA9IHt9O1xuICAgIHJ1bGVNYXAgOiB7IFtpZDogc3RyaW5nXTogUnVsZSB9ID0ge307XG4gICAgd3JhcHBlZFJ1bGVNYXAgOiB7IFtpZDogc3RyaW5nXTogV3JhcHBlZFJ1bGUgfSA9IHt9O1xuICAgIG5sc01hcCA6IE5sc01hcCA9IHt9XG4gICAgaGVscE1hcCA6IEhlbHBNYXAgPSB7fVxuXG4gICAgcHJpdmF0ZSBpbmNsUnVsZXM6IHtcbiAgICAgICAgW25zUm9sZTogc3RyaW5nXTogV3JhcHBlZFJ1bGVbXVxuICAgIH0gPSB7fVxuXG4gICAgcHJpdmF0ZSBleGNsUnVsZXM6IHtcbiAgICAgICAgW25zUm9sZTogc3RyaW5nXTogV3JhcHBlZFJ1bGVbXVxuICAgIH0gPSB7fVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIE5lZWQgYSBET00gTWFwcGVyIGFzIGEgbWluaW11bVxuICAgICAgICB0aGlzLmFkZE1hcHBlcihuZXcgRE9NTWFwcGVyKCkpO1xuICAgIH1cblxuICAgIHJ1bihyb290OiBEb2N1bWVudCB8IE5vZGUsIG9wdGlvbnM/OiB7fSk6IFByb21pc2U8UmVwb3J0PiB7XG4gICAgICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJudWxsIGRvY3VtZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb290Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgcm9vdCA9IChyb290IGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5vd25lckRvY3VtZW50ICYmICgocm9vdC5vd25lckRvY3VtZW50IGFzIGFueSkuUFRfQ0hFQ0tfSElEREVOX0NPTlRFTlQgPSBmYWxzZSk7XG4gICAgICAgIGNsZWFyQ2FjaGVzKHJvb3QpO1xuICAgICAgICBjb25zdCB3YWxrZXIgPSBuZXcgRE9NV2Fsa2VyKHJvb3QpO1xuICAgICAgICBjb25zdCByZXRWYWwgOiBSZXBvcnQgPSB7XG4gICAgICAgICAgICByZXN1bHRzOiBbXSxcbiAgICAgICAgICAgIG51bUV4ZWN1dGVkOiAwLFxuICAgICAgICAgICAgcnVsZVRpbWU6IDAsXG4gICAgICAgICAgICB0b3RhbFRpbWU6IDBcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAvLyBSZXNldCB0aGUgcm9sZSBtYXBwZXJzXG4gICAgICAgIGZvciAoY29uc3QgbmFtZXNwYWNlIGluIHRoaXMubWFwcGVycykge1xuICAgICAgICAgICAgdGhpcy5tYXBwZXJzW25hbWVzcGFjZV0ucmVzZXQocm9vdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBjb250ZXh0IGRldGVjdG9yXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgY29udGV4dCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBydWxlIG1hcHBlcnNcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHRIaWVyYXJjaGllcyA6IFJ1bGVDb250ZXh0SGllcmFyY2h5ID0ge31cbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZXNwYWNlIGluIHRoaXMubWFwcGVycykge1xuICAgICAgICAgICAgICAgIGlmICghd2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dEhpZXJhcmNoaWVzW25hbWVzcGFjZV0gPSB0aGlzLm1hcHBlcnNbbmFtZXNwYWNlXS5vcGVuU2NvcGUod2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAobmFtZXNwYWNlID09PSBcImRvbVwiICYmIHdhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBlbGVtID0gd2Fsa2VyLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIChpZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHJvb3Qub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkgPT09IGVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGV4dEhpZXJhcmNoaWVzW1wiZG9tXCJdW2NvbnRleHRIaWVyYXJjaGllc1tcImRvbVwiXS5sZW5ndGgtMV0ucm9sZVBhdGggPSBcIi8vKltAaWQ9J1wiK2lkK1wiJ11cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0SGllcmFyY2hpZXNbbmFtZXNwYWNlXSA9IHRoaXMubWFwcGVyc1tuYW1lc3BhY2VdLmNsb3NlU2NvcGUod2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHdhbGtlci5ub2RlLm5vZGVUeXBlICE9PSAxMSBcbiAgICAgICAgICAgICAgICAmJiAoRE9NV2Fsa2VyLmlzTm9kZVZpc2libGUod2Fsa2VyLm5vZGUpXG4gICAgICAgICAgICAgICAgICAgIC8vIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaGVhZFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibWV0YVwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImRhdGFsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgfHwgd2Fsa2VyLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwYXJhbVwiXG4gICAgICAgICAgICAgICAgICAgIHx8ICFET01VdGlsLmdldEFuY2VzdG9yKHdhbGtlci5ub2RlLCBbXCJib2R5XCJdKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGxldCBjb250ZXh0IDogUnVsZUNvbnRleHQgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5zIGluIGNvbnRleHRIaWVyYXJjaGllcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuc0hpZXIgPSBjb250ZXh0SGllcmFyY2hpZXNbbnNdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0SGllciA9IG5zSGllcltuc0hpZXIubGVuZ3RoLTFdO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0W25zXSA9IGxhc3RIaWVyOyBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hpbmdSdWxlcyA9IHRoaXMuZ2V0TWF0Y2hpbmdSdWxlcyhjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgICAgIGxldCBkZXBNYXRjaCA9IHt9XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaGluZ1J1bGUgb2YgbWF0Y2hpbmdSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZnVsZmlsbHNEZXBlbmRlbmNpZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBtYXRjaGluZ1J1bGUucnVsZS5kZXBlbmRlbmNpZXMgfHwgW10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVwTWF0Y2hbZGVwXSkgZnVsZmlsbHNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZnVsZmlsbHNEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzIDogUnVsZURldGFpbHNbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbWF0Y2hpbmdSdWxlLnJ1bih0aGlzLCBjb250ZXh0LCBvcHRpb25zLCBjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcHBlciBzaG93cyBlcnJvciBpbiBjb25zb2xlLiBTa2lwIHRoaXMgcnVsZSBhcyBOL0FcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGtpbGwgdGhlIGVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgb3V0IG9mIHNjb3BlLCBpdCBmdWxmaWxscyB0aGUgZGVwZW5kZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwTWF0Y2hbbWF0Y2hpbmdSdWxlLnJ1bGUuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwucmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnJ1bGVUaW1lICs9IHJlc3VsdC5ydWxlVGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwubnVtRXhlY3V0ZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnZhbHVlWzFdID09PSBlUnVsZUNvbmZpZGVuY2UuUEFTUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBNYXRjaFtyZXN1bHQucnVsZUlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICh3YWxrZXIubmV4dE5vZGUoKSk7XG4gICAgICAgIGNsZWFyQ2FjaGVzKHJvb3QpO1xuICAgICAgICByZXRWYWwudG90YWxUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCktc3RhcnQ7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0VmFsKTtcbiAgICB9XG5cbiAgICBlbmFibGVSdWxlcyhydWxlSWRzOiBzdHJpbmdbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBvZiBydWxlSWRzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlTWFwKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIldBUk5JTkc6IFJ1bGUgSWRcIixydWxlSWQsXCJjb3VsZCBub3QgYmUgZW5hYmxlZC5cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UnVsZShydWxlSWQ6IHN0cmluZyk6IFJ1bGUge1xuICAgICAgICByZXR1cm4gdGhpcy5ydWxlTWFwW3J1bGVJZF07XG4gICAgfVxuXG4gICAgZ2V0UnVsZXNJZHMoKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHJ1bGVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBhZGRSdWxlcyhydWxlczogUnVsZVtdKSB7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgICAgICAgdGhpcy5hZGRSdWxlKHJ1bGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvcnRSdWxlcygpO1xuICAgIH1cblxuICAgIGFkZFJ1bGUocnVsZTogUnVsZSwgc2tpcFNvcnQ/OiBib29sZWFuKSB7XG4gICAgICAgIGxldCBjdHhzIDpDb250ZXh0W10gPSBDb250ZXh0LnBhcnNlKHJ1bGUuY29udGV4dCk7XG4gICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICBjb25zdCBydWxlSWQgPSBydWxlLmlkO1xuICAgICAgICBpZiAocnVsZUlkIGluIHRoaXMucnVsZU1hcCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJXQVJOSU5HOiBSdWxlXCIscnVsZUlkLFwiYWxyZWFkeSBhZGRlZCB0byBlbmdpbmUuIElnbm9yaW5nLi4uXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdID0gcnVsZTtcbiAgICAgICAgZm9yIChjb25zdCBjdHggb2YgY3R4cykge1xuICAgICAgICAgICAgbGV0IHdyYXBJZCA9IHJ1bGVJZDtcbiAgICAgICAgICAgIGlmIChpZHggPj0gMSkge1xuICAgICAgICAgICAgICAgIHdyYXBJZCA9IHJ1bGVJZCtcIiQkXCIraWR4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKytpZHg7XG4gICAgICAgICAgICBsZXQgd3JhcHBlZFJ1bGUgPSBuZXcgV3JhcHBlZFJ1bGUocnVsZSxjdHgpO1xuICAgICAgICAgICAgdGhpcy53cmFwcGVkUnVsZU1hcFt3cmFwSWRdID0gd3JhcHBlZFJ1bGU7XG4gICAgICAgICAgICBsZXQgcGFydHMgPSB3cmFwcGVkUnVsZS5wYXJzZWRJbmZvLmNvbnRleHRJbmZvO1xuICAgICAgICAgICAgbGV0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoLTFdO1xuICAgICAgICAgICAgbGV0IHRyaWdnZXJSb2xlID0gbGFzdFBhcnQubmFtZXNwYWNlK1wiOlwiK2xhc3RQYXJ0LnJvbGU7XG4gICAgICAgICAgICBpZiAobGFzdFBhcnQuaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmNsUnVsZXNbdHJpZ2dlclJvbGVdID0gdGhpcy5pbmNsUnVsZXNbdHJpZ2dlclJvbGVdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jbFJ1bGVzW3RyaWdnZXJSb2xlXS5wdXNoKHdyYXBwZWRSdWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsUnVsZXNbdHJpZ2dlclJvbGVdID0gdGhpcy5leGNsUnVsZXNbdHJpZ2dlclJvbGVdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbFJ1bGVzW3RyaWdnZXJSb2xlXS5wdXNoKHdyYXBwZWRSdWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNraXBTb3J0KSB7XG4gICAgICAgICAgICB0aGlzLl9zb3J0UnVsZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zb3J0UnVsZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5pbmNsUnVsZXNbcm9sZV0uc29ydCgocnVsZUE6IFdyYXBwZWRSdWxlLCBydWxlQjogV3JhcHBlZFJ1bGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBBID0gcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBCID0gcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAvLyBJZiBCIGRlcGVuZHMgb24gQSwgc29ydCBBIGJlZm9yZSBCXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEIgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUEucnVsZS5pZCkpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAvLyBJZiBBIGRlcGVuZHMgb24gQiwgc29ydCBCIGJlZm9yZSBBXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEEgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUIucnVsZS5pZCkpIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBpbiB0aGlzLmV4Y2xSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5leGNsUnVsZXNbcm9sZV0uc29ydCgocnVsZUE6IFdyYXBwZWRSdWxlLCBydWxlQjogV3JhcHBlZFJ1bGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBBID0gcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBCID0gcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAvLyBJZiBCIGRlcGVuZHMgb24gQSwgc29ydCBBIGJlZm9yZSBCXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEIgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUEucnVsZS5pZCkpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAvLyBJZiBBIGRlcGVuZHMgb24gQiwgc29ydCBCIGJlZm9yZSBBXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEEgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUIucnVsZS5pZCkpIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkTmxzTWFwKG1hcDogTmxzTWFwKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgdGhpcy5ubHNNYXBba2V5XSA9IG1hcFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkSGVscE1hcChtYXA6IEhlbHBNYXApIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgICAgICAgICB0aGlzLmhlbHBNYXBba2V5XSA9IG1hcFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TWVzc2FnZShydWxlSWQ6IHN0cmluZywgcnVsZUlkeDogbnVtYmVyIHwgc3RyaW5nLCBtc2dBcmdzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgICBsZXQgc3BsaXR0ZXIgPSBydWxlSWQuaW5kZXhPZihcIiQkXCIpO1xuICAgICAgICBpZiAoc3BsaXR0ZXIgPj0gMCkge1xuICAgICAgICAgICAgcnVsZUlkID0gcnVsZUlkLnN1YnN0cmluZygwLHNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ubHNNYXApKSByZXR1cm4gcnVsZUlkO1xuICAgICAgICBsZXQgbWVzc2FnZVRlbXBsYXRlID0gdGhpcy5ubHNNYXBbcnVsZUlkXVtydWxlSWR4IHx8IDBdO1xuICAgICAgICBpZiAoIW1lc3NhZ2VUZW1wbGF0ZSkgcmV0dXJuIHJ1bGVJZCtcIl9cIitydWxlSWR4O1xuICAgICAgICByZXR1cm4gbWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoL1xceyhcXGQrKVxcfS9nLFxuICAgICAgICAgICAgKG1hdGNoZWRTdHIsIG1hdGNoZWROdW0sIG1hdGNoZWRJbmRleCkgPT4gbXNnQXJnc1ttYXRjaGVkTnVtXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldEhlbHAocnVsZUlkOiBzdHJpbmcsIHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIGFyY2hpdmVJZD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICghYXJjaGl2ZUlkKSB7XG4gICAgICAgICAgICAvLyBTZXQgdG8gdGhlIGxhdGVzdFxuICAgICAgICAgICAgYXJjaGl2ZUlkID0gXCJsYXRlc3RcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7Q29uZmlnLmhlbHBSb290fS8ke2FyY2hpdmVJZH0vZG9jJHt0aGlzLmdldEhlbHBSZWwocnVsZUlkLCByZWFzb25JZCl9YDtcbiAgICB9XG5cbiAgICBnZXRIZWxwUmVsKHJ1bGVJZDogc3RyaW5nLCBydWxlSWR4OiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgc3BsaXR0ZXIgPSBydWxlSWQuaW5kZXhPZihcIiQkXCIpO1xuICAgICAgICBpZiAoc3BsaXR0ZXIgPj0gMCkge1xuICAgICAgICAgICAgcnVsZUlkID0gcnVsZUlkLnN1YnN0cmluZygwLHNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5oZWxwTWFwKSkgcmV0dXJuIHJ1bGVJZDtcbiAgICAgICAgcnVsZUlkeCA9IHJ1bGVJZHggfHwgMDtcbiAgICAgICAgbGV0IGhlbHBTdHIgPSBudWxsO1xuICAgICAgICBpZiAocnVsZUlkeCBpbiB0aGlzLmhlbHBNYXBbcnVsZUlkXSkge1xuICAgICAgICAgICAgaGVscFN0ciA9IHRoaXMuaGVscE1hcFtydWxlSWRdW3J1bGVJZHggfHwgMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoZWxwU3RyID0gdGhpcy5oZWxwTWFwW3J1bGVJZF1bMF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhlbHBTdHIpIHJldHVybiBydWxlSWQrXCJfXCIrcnVsZUlkeDtcbiAgICAgICAgcmV0dXJuIGhlbHBTdHI7XG4gICAgfVxuXG4gICAgYWRkTWFwcGVyKG1hcHBlcjogSU1hcHBlcikge1xuICAgICAgICB0aGlzLm1hcHBlcnNbbWFwcGVyLmdldE5hbWVzcGFjZSgpXSA9IG1hcHBlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBtYXRjaChydWxlOiBXcmFwcGVkUnVsZSxcbiAgICAgICAgY29udGV4dEhpZXI6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIGxldCBydWxlUGFydHMgPSBydWxlLnBhcnNlZEluZm8uY29udGV4dEluZm87XG4gICAgICAgIGxldCBwYXJ0SWR4ID0gcnVsZVBhcnRzLmxlbmd0aC0xO1xuICAgICAgICBsZXQgY3VyTlMgPSBydWxlUGFydHNbcGFydElkeF0ubmFtZXNwYWNlO1xuICAgICAgICBsZXQgY3VySGllciA9IGNvbnRleHRIaWVyW2N1ck5TXVtjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTFdO1xuICAgICAgICBjb25zdCBjb250ZXh0Tm9kZSA9IGN1ckhpZXIubm9kZTtcblxuICAgICAgICAvLyBJZiB0aGUgZW5kIG9mIHRoZSBydWxlIHBhcnQgZG9lc24ndCBtYXRjaCB0aGUgZW5kIG9mIHRoZSBoaWVyYXJjaHksIHdlIGRvbid0IGhhdmUgYSBtYXRjaFxuICAgICAgICBpZiAoIXJ1bGVQYXJ0c1twYXJ0SWR4XS5tYXRjaGVzKGNvbnRleHRIaWVyLCBjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgd2FzIG9ubHkgb25lIHBhcnQsIHdlIGhhdmUgYSBtYXRjaFxuICAgICAgICBpZiAocnVsZVBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTmVlZCB0byBkZWFsIHdpdGggcGFyZW50IHBhcnRzLiBUbyB3YWxrIHRoZSBoaWVyYXJjaHksIHRoZXNlIG5lZWQgdG8gYmVcbiAgICAgICAgLy8gYWxsIGluIHRoZSBzYW1lIG5hbWVzcGFjZS4gQ29uZmlybSB0aGF0IGlzIHRydWUuXG4gICAgICAgIGN1ck5TID0gcnVsZVBhcnRzWzBdLm5hbWVzcGFjZTtcbiAgICAgICAgY3VySGllciA9IGNvbnRleHRIaWVyW2N1ck5TXVtjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTFdO1xuICAgICAgICAtLXBhcnRJZHg7XG4gICAgICAgIGlmIChydWxlUGFydHMuc2xpY2UoMCwgcnVsZVBhcnRzLmxlbmd0aC0xKS5zb21lKHBhcnQgPT4gcGFydC5uYW1lc3BhY2UgIT09IGN1ck5TKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0VSUk9SXSBSdWxlICR7cnVsZS5ydWxlLmlkfSBoYXMgaW5jb25zaXRlbnQgcGFyZW50IG5hbWVzcGFjZXNgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IG5vZGUgbWF0Y2hlcyB0aGUgZW5kIG9mIHRoZSBoaWVyYXJjaHksIG1vdmUgdXAgcGFzdCBpdCwgb3RoZXJ3aXNlLCBzdGFydCBhdCB0aGUgZW5kXG4gICAgICAgIGxldCBoaWVySWR4ID0gY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aCAtIChjdXJIaWVyLm5vZGUuaXNTYW1lTm9kZShjb250ZXh0Tm9kZSkgPyAyIDogMSk7XG4gICAgICAgIHdoaWxlIChoaWVySWR4ID49IDAgJiYgcGFydElkeCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcnVsZVBhcnRzW3BhcnRJZHhdO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlc1BhcnQgPSBydWxlUGFydHNbcGFydElkeF0ubWF0Y2hlcyhjb250ZXh0SGllciwgaGllcklkeCk7XG4gICAgICAgICAgICBpZiAocGFydC5jb25uZWN0b3IgPT09IFwiPlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVzUGFydCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3QgcGFyZW50IGNoZWNrIGFuZCBkb2Vzbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3QgcGFyZW50IGNoZWNrIGFuZCBkb2VzIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICAgICAgLS1oaWVySWR4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5jb25uZWN0b3IgPT09IFwiIFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQuaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluY2x1c2l2ZSBhbmNlc3RvciBtYXRjaFxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlc1BhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBkb2Vzbid0IG1hdGNoLCBqdXN0IG1vdmUgdXAgdGhlIHJvbGUgaGllcmFyY2h5XG4gICAgICAgICAgICAgICAgICAgIC0taGllcklkeDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtYXRjaGVzUGFydCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBleGNsdXNpdmUgYW5jZXN0b3IgbWF0Y2ggYW5kIGN1cnJlbnQgbWF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhjbHVzaXZlIGFuY2VzdG9yIG1hdGNoIGFuZCBjdXJyZW50IGRvZXNuJ3QgbWF0Y2ggLSBjaGVjayBmb3Igb3RoZXIgYW5jZXN0b3JzXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnRNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzZWFyY2hJZHggPSBoaWVySWR4LTE7ICFwYXJlbnRNYXRjaCAmJiBzZWFyY2hJZHggPj0gMDsgLS1zZWFyY2hJZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1hdGNoID0gIXJ1bGVQYXJ0c1twYXJ0SWR4XS5tYXRjaGVzKGNvbnRleHRIaWVyLCBzZWFyY2hJZHgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRNYXRjaCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgY29ubmVjdG9yIFwiK3BhcnQuY29ubmVjdG9yK1wiIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRJZHggPT09IC0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWF0Y2hpbmdSdWxlcyhjdHhIaWVyIDogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogV3JhcHBlZFJ1bGVbXSB7XG4gICAgICAgIGxldCBtYXRjaGVzIDogV3JhcHBlZFJ1bGVbXSA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBhZGRNYXRjaGVzKHJ1bGVzOiBXcmFwcGVkUnVsZVtdKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZS5ydWxlLmVuYWJsZWQgJiYgRW5naW5lLm1hdGNoKHJ1bGUsIGN0eEhpZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChydWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBucyBpbiBjdHhIaWVyKSB7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IG5zK1wiOlwiKyhjdHhIaWVyW25zXS5sZW5ndGggPiAwID8gY3R4SGllcltuc11bY3R4SGllcltuc10ubGVuZ3RoLTFdLnJvbGUgOiBcIm5vbmVcIik7XG4gICAgICAgICAgICBpZiAocm9sZSBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbcm9sZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCB4Um9sZSBpbiB0aGlzLmV4Y2xSdWxlcykge1xuICAgICAgICAgICAgICAgIGlmICh4Um9sZSAhPT0gcm9sZSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRNYXRjaGVzKHRoaXMuZXhjbFJ1bGVzW3hSb2xlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvbGUgIT09IG5zK1wiOm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGlmIChyb2xlLnN0YXJ0c1dpdGgobnMrXCI6L1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnMrXCI6LypcIiBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWF0Y2hlcyh0aGlzLmluY2xSdWxlc1tucytcIjovKlwiXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChucytcIjoqXCIgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbbnMrXCI6KlwiXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGVwcyhtYXRjaGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTb3J0cyB0aGUgcnVsZXMgaW4gb3JkZXIgdG8gZXhlY3V0ZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXJcbiAgICAgKiBAcGFyYW0gaW5SdWxlcyBMaXN0IG9mIHdyYXBwZWQgcnVsZXMgdG8gc29ydFxuICAgICAqIEByZXR1cm5zIFNvcnRlZCBsaXN0IG9mIHdyYXBwZWQgcnVsZXNcbiAgICAgKi9cbiAgICBzb3J0RGVwcyhpblJ1bGVzOiBXcmFwcGVkUnVsZVtdKSB7XG4gICAgICAgIGxldCBkZXBSdWxlczogV3JhcHBlZFJ1bGVbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgaW5SdWxlcykge1xuICAgICAgICAgICAgZGVwUnVsZXMucHVzaChydWxlKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHJldFZhbCA6IFdyYXBwZWRSdWxlW10gPSBbXTtcbiAgICAgICAgbGV0IGlkVG9SdWxlID0ge307XG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcnVsZXMuIElmIHRoYXQgcnVsZSdzIGRlcGVuZGVuY2llcyBjYW4gYmUgbWV0IGJ5IHJ1bGVzIGFscmVhZHkgaW4gdGhlIGxpc3QsIGFkZCBpdCB0byB0aGUgbGlzdFxuICAgICAgICAvLyBSZXBlYXQgdW50aWwgbm8gY2hhbmdlcyBhcmUgbWFkZSB0byB0aGUgc2F0aXNmaWVkIGxpc3RcbiAgICAgICAgLy8gSWYgYSBydWxlIGNhbm5vdCBiZSBzYXRpc2ZpZWQsIGl0IHdpbGwgbmV2ZXIgZXhlY3V0ZSwgc28gaXQgY2FuIGJlIGRyb3BwZWQuXG4gICAgICAgIGxldCBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY2hhbmdlID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGRlcFJ1bGVzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBSdWxlID0gZGVwUnVsZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwUnVsZS5ydWxlLmlkIGluIGlkVG9SdWxlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgYWxsTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChkZXBSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzICYmIGRlcFJ1bGUucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcElkIG9mIGRlcFJ1bGUucnVsZS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGRlcElkIGluIGlkVG9SdWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRlcFJ1bGUucnVsZS5wcmVyZXFzICYmIGRlcFJ1bGUucnVsZS5wcmVyZXFzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXBJZCBvZiBkZXBSdWxlLnJ1bGUucHJlcmVxcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZGVwSWQgaW4gaWRUb1J1bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWxsTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goZGVwUnVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlkVG9SdWxlW2RlcFJ1bGUucnVsZS5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBkZXBSdWxlcy5zcGxpY2UoaWR4LS0sIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoY2hhbmdlKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnIHtcbiAgICBzdGF0aWMgREVCVUcgPSBmYWxzZTtcbiAgICBzdGF0aWMgaGVscFJvb3QgPSBcImh0dHBzOi8vYWJsZS5pYm0uY29tL3J1bGVzL2FyY2hpdmVzXCI7XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGNsYXNzIENvbG9yVXRpbCB7XG5cbiAgICBwdWJsaWMgc3RhdGljIENTU0NvbG9yTG9va3VwID0ge1xuICAgICAgICBcImFsaWNlYmx1ZVwiOiBcIiNmMGY4ZmZcIixcbiAgICAgICAgXCJhbnRpcXVld2hpdGVcIjogXCIjZmFlYmQ3XCIsXG4gICAgICAgIFwiYXF1YVwiOiBcIiMwMGZmZmZcIixcbiAgICAgICAgXCJhcXVhbWFyaW5lXCI6IFwiIzdmZmZkNFwiLFxuICAgICAgICBcImF6dXJlXCI6IFwiI2YwZmZmZlwiLFxuICAgICAgICBcImJlaWdlXCI6IFwiI2Y1ZjVkY1wiLFxuICAgICAgICBcImJpc3F1ZVwiOiBcIiNmZmU0YzRcIixcbiAgICAgICAgXCJibGFja1wiOiBcIiMwMDAwMDBcIixcbiAgICAgICAgXCJibGFuY2hlZGFsbW9uZFwiOiBcIiNmZmViY2RcIixcbiAgICAgICAgXCJibHVlXCI6IFwiIzAwMDBmZlwiLFxuICAgICAgICBcImJsdWV2aW9sZXRcIjogXCIjOGEyYmUyXCIsXG4gICAgICAgIFwiYnJvd25cIjogXCIjYTUyYTJhXCIsXG4gICAgICAgIFwiYnVybHl3b29kXCI6IFwiI2RlYjg4N1wiLFxuICAgICAgICBcImNhZGV0Ymx1ZVwiOiBcIiM1ZjllYTBcIixcbiAgICAgICAgXCJjaGFydHJldXNlXCI6IFwiIzdmZmYwMFwiLFxuICAgICAgICBcImNob2NvbGF0ZVwiOiBcIiNkMjY5MWVcIixcbiAgICAgICAgXCJjb3JhbFwiOiBcIiNmZjdmNTBcIixcbiAgICAgICAgXCJjb3JuZmxvd2VyYmx1ZVwiOiBcIiM2NDk1ZWRcIixcbiAgICAgICAgXCJjb3Juc2lsa1wiOiBcIiNmZmY4ZGNcIixcbiAgICAgICAgXCJjcmltc29uXCI6IFwiI2RjMTQzY1wiLFxuICAgICAgICBcImN5YW5cIjogXCIjMDBmZmZmXCIsXG4gICAgICAgIFwiZGFya2JsdWVcIjogXCIjMDAwMDhiXCIsXG4gICAgICAgIFwiZGFya2N5YW5cIjogXCIjMDA4YjhiXCIsXG4gICAgICAgIFwiZGFya2dvbGRlbnJvZFwiOiBcIiNiODg2MGJcIixcbiAgICAgICAgXCJkYXJrZ3JheVwiOiBcIiNhOWE5YTlcIixcbiAgICAgICAgXCJkYXJrZ3JlZW5cIjogXCIjMDA2NDAwXCIsXG4gICAgICAgIFwiZGFya2toYWtpXCI6IFwiI2JkYjc2YlwiLFxuICAgICAgICBcImRhcmttYWdlbnRhXCI6IFwiIzhiMDA4YlwiLFxuICAgICAgICBcImRhcmtvbGl2ZWdyZWVuXCI6IFwiIzU1NmIyZlwiLFxuICAgICAgICBcImRhcmtvcmFuZ2VcIjogXCIjZmY4YzAwXCIsXG4gICAgICAgIFwiZGFya29yY2hpZFwiOiBcIiM5OTMyY2NcIixcbiAgICAgICAgXCJkYXJrcmVkXCI6IFwiIzhiMDAwMFwiLFxuICAgICAgICBcImRhcmtzYWxtb25cIjogXCIjZTk5NjdhXCIsXG4gICAgICAgIFwiZGFya3NlYWdyZWVuXCI6IFwiIzhmYmM4ZlwiLFxuICAgICAgICBcImRhcmtzbGF0ZWJsdWVcIjogXCIjNDgzZDhiXCIsXG4gICAgICAgIFwiZGFya3NsYXRlZ3JheVwiOiBcIiMyZjRmNGZcIixcbiAgICAgICAgXCJkYXJrdHVycXVvaXNlXCI6IFwiIzAwY2VkMVwiLFxuICAgICAgICBcImRhcmt2aW9sZXRcIjogXCIjOTQwMGQzXCIsXG4gICAgICAgIFwiZGVlcHBpbmtcIjogXCIjZmYxNDkzXCIsXG4gICAgICAgIFwiZGVlcHNreWJsdWVcIjogXCIjMDBiZmZmXCIsXG4gICAgICAgIFwiZGltZ3JheVwiOiBcIiM2OTY5NjlcIixcbiAgICAgICAgXCJkb2RnZXJibHVlXCI6IFwiIzFlOTBmZlwiLFxuICAgICAgICBcImZpcmVicmlja1wiOiBcIiNiMjIyMjJcIixcbiAgICAgICAgXCJmbG9yYWx3aGl0ZVwiOiBcIiNmZmZhZjBcIixcbiAgICAgICAgXCJmb3Jlc3RncmVlblwiOiBcIiMyMjhiMjJcIixcbiAgICAgICAgXCJmdWNoc2lhXCI6IFwiI2ZmMDBmZlwiLFxuICAgICAgICBcImdhaW5zYm9yb1wiOiBcIiNkY2RjZGNcIixcbiAgICAgICAgXCJnaG9zdHdoaXRlXCI6IFwiI2Y4ZjhmZlwiLFxuICAgICAgICBcImdvbGRcIjogXCIjZmZkNzAwXCIsXG4gICAgICAgIFwiZ29sZGVucm9kXCI6IFwiI2RhYTUyMFwiLFxuICAgICAgICBcImdyYXlcIjogXCIjODA4MDgwXCIsXG4gICAgICAgIFwiZ3JlZW5cIjogXCIjMDA4MDAwXCIsXG4gICAgICAgIFwiZ3JlZW55ZWxsb3dcIjogXCIjYWRmZjJmXCIsXG4gICAgICAgIFwiaG9uZXlkZXdcIjogXCIjZjBmZmYwXCIsXG4gICAgICAgIFwiaG90cGlua1wiOiBcIiNmZjY5YjRcIixcbiAgICAgICAgXCJpbmRpYW5yZWRcIjogXCIjY2Q1YzVjXCIsXG4gICAgICAgIFwiaW5kaWdvXCI6IFwiIzRiMDA4MlwiLFxuICAgICAgICBcIml2b3J5XCI6IFwiI2ZmZmZmMFwiLFxuICAgICAgICBcImtoYWtpXCI6IFwiI2YwZTY4Y1wiLFxuICAgICAgICBcImxhdmVuZGVyXCI6IFwiI2U2ZTZmYVwiLFxuICAgICAgICBcImxhdmVuZGVyYmx1c2hcIjogXCIjZmZmMGY1XCIsXG4gICAgICAgIFwibGF3bmdyZWVuXCI6IFwiIzdjZmMwMFwiLFxuICAgICAgICBcImxlbW9uY2hpZmZvblwiOiBcIiNmZmZhY2RcIixcbiAgICAgICAgXCJsaWdodGJsdWVcIjogXCIjYWRkOGU2XCIsXG4gICAgICAgIFwibGlnaHRjb3JhbFwiOiBcIiNmMDgwODBcIixcbiAgICAgICAgXCJsaWdodGN5YW5cIjogXCIjZTBmZmZmXCIsXG4gICAgICAgIFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogXCIjZmFmYWQyXCIsXG4gICAgICAgIFwibGlnaHRncmV5XCI6IFwiI2QzZDNkM1wiLFxuICAgICAgICBcImxpZ2h0Z3JlZW5cIjogXCIjOTBlZTkwXCIsXG4gICAgICAgIFwibGlnaHRwaW5rXCI6IFwiI2ZmYjZjMVwiLFxuICAgICAgICBcImxpZ2h0c2FsbW9uXCI6IFwiI2ZmYTA3YVwiLFxuICAgICAgICBcImxpZ2h0c2VhZ3JlZW5cIjogXCIjMjBiMmFhXCIsXG4gICAgICAgIFwibGlnaHRza3libHVlXCI6IFwiIzg3Y2VmYVwiLFxuICAgICAgICBcImxpZ2h0c2xhdGVncmF5XCI6IFwiIzc3ODg5OVwiLFxuICAgICAgICBcImxpZ2h0c3RlZWxibHVlXCI6IFwiI2IwYzRkZVwiLFxuICAgICAgICBcImxpZ2h0eWVsbG93XCI6IFwiI2ZmZmZlMFwiLFxuICAgICAgICBcImxpbWVcIjogXCIjMDBmZjAwXCIsXG4gICAgICAgIFwibGltZWdyZWVuXCI6IFwiIzMyY2QzMlwiLFxuICAgICAgICBcImxpbmVuXCI6IFwiI2ZhZjBlNlwiLFxuICAgICAgICBcIm1hZ2VudGFcIjogXCIjZmYwMGZmXCIsXG4gICAgICAgIFwibWFyb29uXCI6IFwiIzgwMDAwMFwiLFxuICAgICAgICBcIm1lZGl1bWFxdWFtYXJpbmVcIjogXCIjNjZjZGFhXCIsXG4gICAgICAgIFwibWVkaXVtYmx1ZVwiOiBcIiMwMDAwY2RcIixcbiAgICAgICAgXCJtZWRpdW1vcmNoaWRcIjogXCIjYmE1NWQzXCIsXG4gICAgICAgIFwibWVkaXVtcHVycGxlXCI6IFwiIzkzNzBkOFwiLFxuICAgICAgICBcIm1lZGl1bXNlYWdyZWVuXCI6IFwiIzNjYjM3MVwiLFxuICAgICAgICBcIm1lZGl1bXNsYXRlYmx1ZVwiOiBcIiM3YjY4ZWVcIixcbiAgICAgICAgXCJtZWRpdW1zcHJpbmdncmVlblwiOiBcIiMwMGZhOWFcIixcbiAgICAgICAgXCJtZWRpdW10dXJxdW9pc2VcIjogXCIjNDhkMWNjXCIsXG4gICAgICAgIFwibWVkaXVtdmlvbGV0cmVkXCI6IFwiI2M3MTU4NVwiLFxuICAgICAgICBcIm1pZG5pZ2h0Ymx1ZVwiOiBcIiMxOTE5NzBcIixcbiAgICAgICAgXCJtaW50Y3JlYW1cIjogXCIjZjVmZmZhXCIsXG4gICAgICAgIFwibWlzdHlyb3NlXCI6IFwiI2ZmZTRlMVwiLFxuICAgICAgICBcIm1vY2Nhc2luXCI6IFwiI2ZmZTRiNVwiLFxuICAgICAgICBcIm5hdmFqb3doaXRlXCI6IFwiI2ZmZGVhZFwiLFxuICAgICAgICBcIm5hdnlcIjogXCIjMDAwMDgwXCIsXG4gICAgICAgIFwib2xkbGFjZVwiOiBcIiNmZGY1ZTZcIixcbiAgICAgICAgXCJvbGl2ZVwiOiBcIiM4MDgwMDBcIixcbiAgICAgICAgXCJvbGl2ZWRyYWJcIjogXCIjNmI4ZTIzXCIsXG4gICAgICAgIFwib3JhbmdlXCI6IFwiI2ZmYTUwMFwiLFxuICAgICAgICBcIm9yYW5nZXJlZFwiOiBcIiNmZjQ1MDBcIixcbiAgICAgICAgXCJvcmNoaWRcIjogXCIjZGE3MGQ2XCIsXG4gICAgICAgIFwicGFsZWdvbGRlbnJvZFwiOiBcIiNlZWU4YWFcIixcbiAgICAgICAgXCJwYWxlZ3JlZW5cIjogXCIjOThmYjk4XCIsXG4gICAgICAgIFwicGFsZXR1cnF1b2lzZVwiOiBcIiNhZmVlZWVcIixcbiAgICAgICAgXCJwYWxldmlvbGV0cmVkXCI6IFwiI2Q4NzA5M1wiLFxuICAgICAgICBcInBhcGF5YXdoaXBcIjogXCIjZmZlZmQ1XCIsXG4gICAgICAgIFwicGVhY2hwdWZmXCI6IFwiI2ZmZGFiOVwiLFxuICAgICAgICBcInBlcnVcIjogXCIjY2Q4NTNmXCIsXG4gICAgICAgIFwicGlua1wiOiBcIiNmZmMwY2JcIixcbiAgICAgICAgXCJwbHVtXCI6IFwiI2RkYTBkZFwiLFxuICAgICAgICBcInBvd2RlcmJsdWVcIjogXCIjYjBlMGU2XCIsXG4gICAgICAgIFwicHVycGxlXCI6IFwiIzgwMDA4MFwiLFxuICAgICAgICBcInJlZFwiOiBcIiNmZjAwMDBcIixcbiAgICAgICAgXCJyb3N5YnJvd25cIjogXCIjYmM4ZjhmXCIsXG4gICAgICAgIFwicm95YWxibHVlXCI6IFwiIzQxNjllMVwiLFxuICAgICAgICBcInNhZGRsZWJyb3duXCI6IFwiIzhiNDUxM1wiLFxuICAgICAgICBcInNhbG1vblwiOiBcIiNmYTgwNzJcIixcbiAgICAgICAgXCJzYW5keWJyb3duXCI6IFwiI2Y0YTQ2MFwiLFxuICAgICAgICBcInNlYWdyZWVuXCI6IFwiIzJlOGI1N1wiLFxuICAgICAgICBcInNlYXNoZWxsXCI6IFwiI2ZmZjVlZVwiLFxuICAgICAgICBcInNpZW5uYVwiOiBcIiNhMDUyMmRcIixcbiAgICAgICAgXCJzaWx2ZXJcIjogXCIjYzBjMGMwXCIsXG4gICAgICAgIFwic2t5Ymx1ZVwiOiBcIiM4N2NlZWJcIixcbiAgICAgICAgXCJzbGF0ZWJsdWVcIjogXCIjNmE1YWNkXCIsXG4gICAgICAgIFwic2xhdGVncmF5XCI6IFwiIzcwODA5MFwiLFxuICAgICAgICBcInNub3dcIjogXCIjZmZmYWZhXCIsXG4gICAgICAgIFwic3ByaW5nZ3JlZW5cIjogXCIjMDBmZjdmXCIsXG4gICAgICAgIFwic3RlZWxibHVlXCI6IFwiIzQ2ODJiNFwiLFxuICAgICAgICBcInRhblwiOiBcIiNkMmI0OGNcIixcbiAgICAgICAgXCJ0ZWFsXCI6IFwiIzAwODA4MFwiLFxuICAgICAgICBcInRoaXN0bGVcIjogXCIjZDhiZmQ4XCIsXG4gICAgICAgIFwidG9tYXRvXCI6IFwiI2ZmNjM0N1wiLFxuICAgICAgICBcInR1cnF1b2lzZVwiOiBcIiM0MGUwZDBcIixcbiAgICAgICAgXCJ2aW9sZXRcIjogXCIjZWU4MmVlXCIsXG4gICAgICAgIFwid2hlYXRcIjogXCIjZjVkZWIzXCIsXG4gICAgICAgIFwid2hpdGVcIjogXCIjZmZmZmZmXCIsXG4gICAgICAgIFwid2hpdGVzbW9rZVwiOiBcIiNmNWY1ZjVcIixcbiAgICAgICAgXCJ5ZWxsb3dcIjogXCIjZmZmZjAwXCIsXG4gICAgICAgIFwieWVsbG93Z3JlZW5cIjogXCIjOWFjZDMyXCIsXG4gICAgICAgIFwiYnV0dG9udGV4dFwiOiBcInJnYmEoMCwgMCwgMCwgMC44NDcpXCIsXG4gICAgICAgIFwiYnV0dG9uZmFjZVwiOiBcIiNmZmZmZmZcIixcbiAgICAgICAgXCJncmF5dGV4dFwiOiBcInJnYmEoMCwgMCwgMCwgMC4yNDcpXCJcbiAgICB9XG5cblxuICAgIC8vIFJld3JpdGUgdGhlIGNvbG9yIG9iamVjdCB0byBhY2NvdW50IGZvciBhbHBoYVxuICAgIHB1YmxpYyBzdGF0aWMgQ29sb3IoY3NzU3R5bGVDb2xvcikge1xuICAgICAgICBjc3NTdHlsZUNvbG9yID0gY3NzU3R5bGVDb2xvci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoY3NzU3R5bGVDb2xvciA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gbmV3IENvbG9yT2JqKDI1NSwgMjU1LCAyNTUsIDApO1xuICAgICAgICBpZiAoY3NzU3R5bGVDb2xvciBpbiBDb2xvclV0aWwuQ1NTQ29sb3JMb29rdXApXG4gICAgICAgICAgICBjc3NTdHlsZUNvbG9yID0gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwW2Nzc1N0eWxlQ29sb3JdO1xuICAgICAgICBpZiAoY3NzU3R5bGVDb2xvci5zdGFydHNXaXRoKFwicmdiKFwiKSkge1xuICAgICAgICAgICAgbGV0IHJnYlJlZ2V4ID0gL1xccypyZ2JcXHMqXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccypcXCkvO1xuICAgICAgICAgICAgbGV0IG0gPSBjc3NTdHlsZUNvbG9yLm1hdGNoKHJnYlJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChtID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoobVsxXSwgbVsyXSwgbVszXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3NzU3R5bGVDb2xvci5zdGFydHNXaXRoKFwicmdiYShcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiYVxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKC4rKVxccypcXCkvO1xuICAgICAgICAgICAgbGV0IG0gPSBjc3NTdHlsZUNvbG9yLm1hdGNoKHJnYlJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChtID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoobVsxXSwgbVsyXSwgbVszXSwgbVs0XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3NzU3R5bGVDb2xvci5jaGFyQXQoMCkgIT0gXCIjXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHRocmVlLWRpZ2l0IFJHQiAoI3JnYikgaXMgY29udmVydGVkIHRvIHNpeC1kaWdpdCBmb3JtICgjcnJnZ2JiKSBieSByZXBsaWNhdGluZyBkaWdpdHNcbiAgICAgICAgICAgICAgICAvLyAoaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1jb2xvci0zLyNyZ2ItY29sb3IpXG4gICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IFwiI1wiICsgY3NzU3R5bGVDb2xvci5jaGFyQXQoMSkucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMikucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMykucmVwZWF0KDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRoaXNSZWQgPSBwYXJzZUludChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygxLCAzKSwgMTYpO1xuICAgICAgICAgICAgbGV0IHRoaXNHcmVlbiA9IHBhcnNlSW50KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDMsIDUpLCAxNik7XG4gICAgICAgICAgICBsZXQgdGhpc0JsdWUgPSBwYXJzZUludChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZyg1LCA3KSwgMTYpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaih0aGlzUmVkLCB0aGlzR3JlZW4sIHRoaXNCbHVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAgICByZXR1cm4gbnVsbDsgLy8gVW5yZWFjaGFibGVcbiAgICB9O1xuXG4gcHVibGljIHN0YXRpYyBDb2xvckNvbWJvKHJ1bGVDb250ZXh0IDogSFRNTEVsZW1lbnQpIHtcbiAgICB0cnkgeyBcbiAgICAgICAgdmFyIGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuICAgICAgICBpZiAoIXdpbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYW5jZXN0b3JzID0gW107XG4gICAgICAgIGxldCB3YWxrTm9kZSA6IEVsZW1lbnQgPSBydWxlQ29udGV4dDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlKSB7XG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZVR5cGUgPT09IDEpIFxuICAgICAgICAgICAgICAgIGFuY2VzdG9ycy5wdXNoKHdhbGtOb2RlKTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB2YXIgcmV0VmFsID0ge1xuICAgICAgICAgICAgXCJoYXNHcmFkaWVudFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwiaGFzQkdJbWFnZVwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwidGV4dFNoYWRvd1wiOiBmYWxzZSxcbiAgICAgICAgICAgIFwiZmdcIjogbnVsbCxcbiAgICAgICAgICAgIFwiYmdcIjogbnVsbFxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gc3RhcnRcbiAgICAgICAgdmFyIGNTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgdmFyIGNvbXBTdHlsZUNvbG9yID0gY1N0eWxlLmNvbG9yO1xuICAgICAgICBpZiAoIWNvbXBTdHlsZUNvbG9yKVxuICAgICAgICAgICAgY29tcFN0eWxlQ29sb3IgPSBcImJsYWNrXCI7XG4gICAgICAgIHZhciBmZyA9IENvbG9yVXRpbC5Db2xvcihjb21wU3R5bGVDb2xvcik7XG4gICAgICAgIHZhciByZUNvbG9yID0gL3RyYW5zcGFyZW50fHJnYmE/XFwoW14pXStcXCkvZ2k7XG4gICAgICAgIHZhciBndWVzc0dyYWRDb2xvciA9IGZ1bmN0aW9uIChncmFkTGlzdCwgYmdDb2xvciwgZmdDb2xvcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIGNvbG9yLCByZXR1cm4gdGhhdFxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZ3JhZExpc3QubGVuZ3RoID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JhZExpc3Q7XG5cbiAgICAgICAgICAgICAgICB2YXIgb3ZlcmFsbFdvcnN0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB2YXIgb3ZlcmFsbFdvcnN0UmF0aW8gPSBudWxsO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGlHcmFkID0gMTsgaUdyYWQgPCBncmFkTGlzdC5sZW5ndGg7ICsraUdyYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdvcnN0Q29sb3IgPSBncmFkTGlzdFtpR3JhZCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgd29yc3RSYXRpbyA9IGZnQ29sb3IuY29udHJhc3RSYXRpbyhncmFkTGlzdFtpR3JhZCAtIDFdKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSAuMTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGVwID4gLjAwMDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggKyBzdGVwIDw9IDEgJiYgd29yc3RSYXRpbyA+IGZnQ29sb3IuY29udHJhc3RSYXRpbyhncmFkTGlzdFtpR3JhZF0ubWl4KGdyYWRMaXN0W2lHcmFkIC0gMV0sIGlkeCArIHN0ZXApLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdENvbG9yID0gZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggKyBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RSYXRpbyA9IGZnQ29sb3IuY29udHJhc3RSYXRpbyh3b3JzdENvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBpZHggKyBzdGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlkeCAtIHN0ZXAgPj0gMCAmJiB3b3JzdFJhdGlvID4gZmdDb2xvci5jb250cmFzdFJhdGlvKGdyYWRMaXN0W2lHcmFkXS5taXgoZ3JhZExpc3RbaUdyYWQgLSAxXSwgaWR4IC0gc3RlcCkuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0Q29sb3IgPSBncmFkTGlzdFtpR3JhZF0ubWl4KGdyYWRMaXN0W2lHcmFkIC0gMV0sIGlkeCAtIHN0ZXApLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdFJhdGlvID0gZmdDb2xvci5jb250cmFzdFJhdGlvKHdvcnN0Q29sb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IGlkeCAtIHN0ZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwID0gc3RlcCAvIDEwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvdmVyYWxsV29yc3RSYXRpbyA9PT0gbnVsbCB8fCBvdmVyYWxsV29yc3RSYXRpbyA+IHdvcnN0UmF0aW8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxXb3JzdFJhdGlvID0gd29yc3RSYXRpbztcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxXb3JzdCA9IHdvcnN0Q29sb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJhbGxXb3JzdDsgLy8gcmV0dXJuIHRoZSBkYXJrZXN0IGNvbG9yXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYmdDb2xvcjtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgcHJpb3JTdGFja0JHID0gQ29sb3JVdGlsLkNvbG9yKFwid2hpdGVcIik7XG4gICAgICAgIHZhciB0aGlzU3RhY2tPcGFjaXR5ID0gbnVsbDtcbiAgICAgICAgdmFyIHRoaXNTdGFja0FscGhhID0gbnVsbDtcbiAgICAgICAgdmFyIHRoaXNTdGFja0JHID0gbnVsbDtcbiAgICAgICAgLy8gQW5jZXN0b3JzIHByb2Nlc3NlZCBmcm9tIHRoZSB0b3Btb3N0IHBhcmVudCB0b3dhcmQgdGhlIGNoaWxkXG4gICAgICAgIHdoaWxlIChhbmNlc3RvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIHByb2NOZXh0ID0gYW5jZXN0b3JzLnBvcCgpO1xuICAgICAgICAgICAgLy92YXIgcHJvY05leHQgPSBhbmNlc3RvcnMuc3BsaWNlKDAsIDEpWzBdO1xuICAgICAgICAgICAgLy8gY1N0eWxlIGlzIHRoZSBjb21wdXRlZCBzdHlsZSBvZiB0aGlzIGxheWVyXG4gICAgICAgICAgICB2YXIgY1N0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUocHJvY05leHQpO1xuICAgICAgICAgICAgaWYgKGNTdHlsZSA9PT0gbnVsbCkgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIHRoaXNCZ0NvbG9yIGlzIHRoZSBjb2xvciBvZiB0aGlzIGxheWVyIG9yIG51bGwgaWYgdGhlIGxheWVyIGlzIHRyYW5zcGFyZW50XG4gICAgICAgICAgICB2YXIgdGhpc0JnQ29sb3IgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgJiYgY1N0eWxlLmJhY2tncm91bmRDb2xvciAhPSBcInRyYW5zcGFyZW50XCIgJiYgY1N0eWxlLmJhY2tncm91bmRDb2xvciAhPSBcInJnYmEoMCwgMCwgMCwgMClcIikge1xuICAgICAgICAgICAgICAgIHRoaXNCZ0NvbG9yID0gQ29sb3JVdGlsLkNvbG9yKGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBncmFkaWVudCBpbnZvbHZlZCwgc2V0IHRoaXNCZ0NvbG9yIHRvIHRoZSB3b3JzdCBjb2xvciBjb21iaW5hdGlvbiBhdmFpbGFibGUgYWdhaW5zdCB0aGUgZm9yZWdyb3VuZFxuICAgICAgICAgICAgaWYgKGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgJiYgY1N0eWxlLmJhY2tncm91bmRJbWFnZS5pbmRleE9mICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZihcImdyYWRpZW50XCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdyYWRDb2xvcnMgOiBzdHJpbmdbXSA9IGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UubWF0Y2gocmVDb2xvcik7XG4gICAgICAgICAgICAgICAgaWYgKGdyYWRDb2xvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdyYWRDb2xvckNvbXAgOiBDb2xvck9ialtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JhZENvbG9ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncmFkQ29sb3JzW2ldLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRDb2xvcnMuc3BsaWNlKGktLSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2xvckNvbXAgPSBDb2xvclV0aWwuQ29sb3IoZ3JhZENvbG9yc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yQ29tcC5hbHBoYSAhPT0gdW5kZWZpbmVkICYmIGNvbG9yQ29tcC5hbHBoYSA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWl4IHRoZSBncmRpZW50IGJnIGNvbG9yIHdpdCBwYXJlbnQgYmcgaWYgYWxwaGEgPCAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb21wU3RhY2tCZyA9IHRoaXNTdGFja0JHIHx8IHByaW9yU3RhY2tCRztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JDb21wID0gY29sb3JDb21wLmdldE92ZXJsYXlDb2xvcihjb21wU3RhY2tCZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRDb2xvckNvbXAucHVzaChjb2xvckNvbXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXNCZ0NvbG9yID0gZ3Vlc3NHcmFkQ29sb3IoZ3JhZENvbG9yQ29tcCwgdGhpc1N0YWNrQkcgfHwgcHJpb3JTdGFja0JHLCBmZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBIYW5kbGUgbm9uLXNvbGlkIG9wYWNpdHlcbiAgICAgICAgICAgIGlmICh0aGlzU3RhY2tPcGFjaXR5ID09PSBudWxsIHx8IChjU3R5bGUub3BhY2l0eSAmJiBjU3R5bGUub3BhY2l0eS5sZW5ndGggPiAwICYmIHBhcnNlRmxvYXQoY1N0eWxlLm9wYWNpdHkpIDwgMSkpIHtcbiAgICAgICAgICAgICAgICAvLyBOZXcgc3RhY2ssIHJlc2V0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNTdGFja0JHICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcmxheVxuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRy5hbHBoYSA9IHRoaXNTdGFja09wYWNpdHkgKiB0aGlzU3RhY2tBbHBoYTtcbiAgICAgICAgICAgICAgICAgICAgcHJpb3JTdGFja0JHID0gdGhpc1N0YWNrQkcuZ2V0T3ZlcmxheUNvbG9yKHByaW9yU3RhY2tCRyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXNTdGFja09wYWNpdHkgPSAxLjA7XG4gICAgICAgICAgICAgICAgdGhpc1N0YWNrQWxwaGEgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXNTdGFja0JHID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY1N0eWxlLm9wYWNpdHkgJiYgY1N0eWxlLm9wYWNpdHkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tPcGFjaXR5ID0gcGFyc2VGbG9hdChjU3R5bGUub3BhY2l0eSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzQmdDb2xvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0JHID0gdGhpc0JnQ29sb3I7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gdGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1N0YWNrQkcuYWxwaGE7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tPcGFjaXR5ID09PSAxLjAgJiYgdGhpc1N0YWNrQWxwaGEgPT09IDEuMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0JHSW1hZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNHcmFkaWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSGFuZGxlIHNvbGlkIGNvbG9yIGJhY2tncm91bmRzIGFuZCBncmFkaWVudCBjb2xvciBiYWNrZ3JvdW5kc1xuICAgICAgICAgICAgZWxzZSBpZiAodGhpc0JnQ29sb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgc3RhY2sgYWxyZWFkeSBoYXMgYSBiYWNrZ3JvdW5kIGNvbG9yLCBibGVuZCBpdFxuICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tCRyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IHRoaXNCZ0NvbG9yO1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tBbHBoYSA9IHRoaXNTdGFja0JHLmFscGhhIHx8IDEuMDtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNTdGFja0JHLmFscGhhO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0JHID0gdGhpc0JnQ29sb3IuZ2V0T3ZlcmxheUNvbG9yKHRoaXNTdGFja0JHKTtcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzU3RhY2tBbHBoYSA9IHRoaXNCZ0NvbG9yLmFscGhhIHx8IDEuMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQWxwaGEgPSB0aGlzU3RhY2tCRy5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICM1MjY6IElmIHRoaXNCZ0NvbG9yIGhhZCBhbiBhbHBoYSB2YWx1ZSwgaXQgbWF5IG5vdCBleHBvc2UgdGhyb3VnaCB0aGlzU3RhY2tCRyBpbiB0aGUgYWJvdmUgY29kZVxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHdpcGUgb3V0IHRoZSBncmFkaWVudCBpbmZvIGlmIHRoaXMgbGF5ZXIgd2FzIHRyYW5zcGFyZW50XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNTdGFja09wYWNpdHkgPT09IDEuMCAmJiB0aGlzU3RhY2tBbHBoYSA9PT0gMS4wICYmICh0aGlzU3RhY2tCRy5hbHBoYSB8fCAxLjApID09PSAxLjAgJiYgKHRoaXNCZ0NvbG9yLmFscGhhIHx8IDEuMCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0JHSW1hZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0dyYWRpZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgJiYgY1N0eWxlLmJhY2tncm91bmRJbWFnZSAhPSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZEltYWdlLmluZGV4T2YgJiYgY1N0eWxlLmJhY2tncm91bmRJbWFnZS5pbmRleE9mKFwiZ3JhZGllbnRcIikgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0dyYWRpZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzQkdJbWFnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzU3RhY2tCRyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmZyA9IGZnLmdldE92ZXJsYXlDb2xvcih0aGlzU3RhY2tCRyk7XG4gICAgICAgICAgICBkZWxldGUgZmcuYWxwaGE7XG4gICAgICAgIH1cbiAgICAgICAgZmcuYWxwaGEgPSAoZmcuYWxwaGEgfHwgMSkgKiB0aGlzU3RhY2tPcGFjaXR5O1xuICAgICAgICBmZyA9IGZnLmdldE92ZXJsYXlDb2xvcihwcmlvclN0YWNrQkcpO1xuICAgICAgICBpZiAodGhpc1N0YWNrQkcgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpc1N0YWNrQkcuYWxwaGEgPSB0aGlzU3RhY2tPcGFjaXR5ICogdGhpc1N0YWNrQWxwaGE7XG4gICAgICAgICAgICBwcmlvclN0YWNrQkcgPSB0aGlzU3RhY2tCRy5nZXRPdmVybGF5Q29sb3IocHJpb3JTdGFja0JHKTtcbiAgICAgICAgfVxuICAgICAgICByZXRWYWwuZmcgPSBmZztcbiAgICAgICAgcmV0VmFsLmJnID0gcHJpb3JTdGFja0JHO1xuXG4gICAgICAgIGlmIChjU3R5bGUudGV4dFNoYWRvdyAmJiBjU3R5bGUudGV4dFNoYWRvdyAhPT0gJ25vbmUnKVxuICAgICAgICAgICAgcmV0VmFsLnRleHRTaGFkb3cgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIHNvbWV0aGluZyBoYXBwZW5lZCwgdGhlbi4uLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gfTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbG9yT2JqIHtcbiAgICByZWQgOiBudW1iZXI7XG4gICAgZ3JlZW4gOiBudW1iZXI7XG4gICAgYmx1ZSA6IG51bWJlcjtcbiAgICBhbHBoYSA6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHJlZCA6IHN0cmluZyB8IG51bWJlciwgZ3JlZW4gOiBzdHJpbmcgfCBudW1iZXIsIGJsdWUgOiBzdHJpbmcgfCBudW1iZXIsIGFscGhhPyA6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBmdW5jdGlvbiBmaXhDb21wb25lbnQoY29tcCA6IHN0cmluZyB8IG51bWJlcikgOiBudW1iZXIge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAoY29tcCkgIT0gdHlwZW9mIChcIlwiKSkgcmV0dXJuIGNvbXAgYXMgbnVtYmVyO1xuICAgICAgICAgICAgbGV0IGNvbXBTdHIgPSBjb21wIGFzIHN0cmluZztcbiAgICAgICAgICAgIGNvbXBTdHIgPSBjb21wU3RyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChjb21wU3RyW2NvbXBTdHIubGVuZ3RoIC0gMV0gIT0gXCIlXCIpIHJldHVybiBwYXJzZUludChjb21wU3RyKTtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoY29tcFN0ci5zdWJzdHJpbmcoMCwgY29tcFN0ci5sZW5ndGggLSAxKSkgKiAyLjU1KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlZCA9IGZpeENvbXBvbmVudChyZWQpO1xuICAgICAgICB0aGlzLmdyZWVuID0gZml4Q29tcG9uZW50KGdyZWVuKTtcbiAgICAgICAgdGhpcy5ibHVlID0gZml4Q29tcG9uZW50KGJsdWUpO1xuICAgICAgICBpZiAodHlwZW9mIChhbHBoYSkgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5hbHBoYSA9ICh0eXBlb2YgKGFscGhhKSA9PT0gdHlwZW9mIChcIlwiKSkgPyBwYXJzZUZsb2F0KGFscGhhIGFzIHN0cmluZykgOiBhbHBoYSBhcyBudW1iZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b0hleEhlbHAodmFsdWUgOiBudW1iZXIpIDogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IE1hdGgucm91bmQodmFsdWUpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgaWYgKHJldFZhbC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICByZXR1cm4gXCIwXCIgKyByZXRWYWw7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfTtcblxuICAgIHRvSGV4KCkgOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCIjXCIgKyB0aGlzLnRvSGV4SGVscCh0aGlzLnJlZCkgKyB0aGlzLnRvSGV4SGVscCh0aGlzLmdyZWVuKSArIHRoaXMudG9IZXhIZWxwKHRoaXMuYmx1ZSk7XG4gICAgfTtcblxuICAgIGNvbnRyYXN0UmF0aW8oYmdDb2xvciA6IENvbG9yT2JqKSB7IFxuICAgICAgICBsZXQgZmdDb2xvcjogQ29sb3JPYmogPSB0aGlzO1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5hbHBoYSkgIT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgIGZnQ29sb3IgPSB0aGlzLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKTtcbiAgICAgICAgICAgICBcbiAgICAgICAgbGV0IGx1bTEgPSBmZ0NvbG9yLnJlbGF0aXZlTHVtaW5hbmNlKCk7XG4gICAgICAgIGlmICghYmdDb2xvci5yZWxhdGl2ZUx1bWluYW5jZSkge1xuICAgICAgICAgICAgbGV0IHMgPSBcIlwiO1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGJnQ29sb3IpIHtcbiAgICAgICAgICAgICAgICBzICs9IGtleSArIFwiXFxuXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbGVydChiZ0NvbG9yKTtcbiAgICAgICAgICAgIGFsZXJ0KHMpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsdW0yID0gYmdDb2xvci5yZWxhdGl2ZUx1bWluYW5jZSgpO1xuICAgICAgICBsZXQgcmF0aW8gPSAobHVtMSA+IGx1bTIpID8gKGx1bTEgKyAuMDUpIC8gKGx1bTIgKyAuMDUpIDogKGx1bTIgKyAuMDUpIC8gKGx1bTEgKyAuMDUpO1xuICAgICAgICByZXR1cm4gcmF0aW87XG4gICAgfTtcblxuICAgIHJlbGF0aXZlTHVtaW5hbmNlKCkgOiBudW1iZXIge1xuICAgICAgICBsZXQgUiA9IHRoaXMucmVkIC8gMjU1LjA7XG4gICAgICAgIGxldCBHID0gdGhpcy5ncmVlbiAvIDI1NS4wO1xuICAgICAgICBsZXQgQiA9IHRoaXMuYmx1ZSAvIDI1NS4wO1xuICAgICAgICBSID0gUiA8PSAuMDQwNDUgPyBSIC8gMTIuOTIgOiBNYXRoLnBvdygoUiArIC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICAgIEcgPSBHIDw9IC4wNDA0NSA/IEcgLyAxMi45MiA6IE1hdGgucG93KChHICsgLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICAgICAgQiA9IEIgPD0gLjA0MDQ1ID8gQiAvIDEyLjkyIDogTWF0aC5wb3coKEIgKyAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgICAgICByZXR1cm4gMC4yMTI2ICogUiArIDAuNzE1MiAqIEcgKyAwLjA3MjIgKiBCO1xuICAgIH07XG5cbiAgICBtaXgoY29sb3IyIDogQ29sb3JPYmosIHBlcmNUaGlzIDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWxwaGEpID09PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiAoY29sb3IyLmFscGhhKSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaihcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMucmVkICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIucmVkLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ncmVlbiArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmdyZWVuLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ibHVlICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIuYmx1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhbHBoYVRoaXMgPSB0aGlzLmFscGhhID8gdGhpcy5hbHBoYSA6IDE7XG4gICAgICAgICAgICBsZXQgYWxwaGFPdGhlciA9IGNvbG9yMi5hbHBoYSA/IGNvbG9yMi5hbHBoYSA6IDE7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5yZWQgKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5yZWQsXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLmdyZWVuICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIuZ3JlZW4sXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLmJsdWUgKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5ibHVlLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogYWxwaGFUaGlzICsgKDEgLSBwZXJjVGhpcykgKiBhbHBoYU90aGVyXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGdldE92ZXJsYXlDb2xvcihiZ0NvbG9yIDogQ29sb3JPYmopIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5hbHBoYSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdGhpcy5hbHBoYSA+PSAxKSB7XG4gICAgICAgICAgICAvLyBObyBtaXhpbmcgcmVxdWlyZWQgLSBpdCdzIG9wYXF1ZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWxwaGEgPCAwKSB7XG4gICAgICAgICAgICAvL1x0XHRIYWFjLkVycm9yLmxvZ0Vycm9yKFwiSW52YWxpZCBhbHBoYSB2YWx1ZVwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKGJnQ29sb3IuYWxwaGEpICE9IFwidW5kZWZpbmVkXCIgJiYgYmdDb2xvci5hbHBoYSA8IDEpIHtcbiAgICAgICAgICAgIC8vXHRcdEhhYWMuRXJyb3IubG9nRXJyb3IoXCJDYW5ub3QgbWl4IHdpdGggYSBiYWNrZ3JvdW5kIGFscGhhXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFZhbCA9IHRoaXMubWl4KGJnQ29sb3IsIHRoaXMuYWxwaGEpO1xuICAgICAgICBkZWxldGUgcmV0VmFsLmFscGhhOyBcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21DU1NDb2xvcihjc3NTdHlsZUNvbG9yKSB7XG4gICAgICAgIGxldCB0aGlzUmVkID0gLTE7XG4gICAgICAgIGxldCB0aGlzR3JlZW4gPSAtMTtcbiAgICAgICAgbGV0IHRoaXNCbHVlID0gLTE7XG5cbiAgICAgICAgY3NzU3R5bGVDb2xvciA9IGNzc1N0eWxlQ29sb3IudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYihcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzUmVkID0gbVsxXTtcbiAgICAgICAgICAgICAgICB0aGlzR3JlZW4gPSBtWzJdO1xuICAgICAgICAgICAgICAgIHRoaXNCbHVlID0gbVszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjc3NTdHlsZUNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2JhKFwiKSkge1xuICAgICAgICAgICAgbGV0IHJnYlJlZ2V4ID0gL1xccypyZ2JhXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooLispXFxzKlxcKS87XG4gICAgICAgICAgICBsZXQgbSA9IGNzc1N0eWxlQ29sb3IubWF0Y2gocmdiUmVnZXgpO1xuICAgICAgICAgICAgaWYgKG0gPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1JlZCA9IG1bMV07XG4gICAgICAgICAgICAgICAgdGhpc0dyZWVuID0gbVsyXTtcbiAgICAgICAgICAgICAgICB0aGlzQmx1ZSA9IG1bM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3NzU3R5bGVDb2xvci5jaGFyQXQoMCkgIT0gXCIjXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3NzU3R5bGVDb2xvciBpbiBDb2xvclV0aWwuQ1NTQ29sb3JMb29rdXApXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IgPSBDb2xvclV0aWwuQ1NTQ29sb3JMb29rdXBbY3NzU3R5bGVDb2xvcl07XG4gICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBmcm9tSGV4ID0gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgICAgIGxldCBsb29rdXAgPSB7XG4gICAgICAgICAgICAgICAgICAgIFwiYVwiOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgXCJiXCI6IDExLFxuICAgICAgICAgICAgICAgICAgICBcImNcIjogMTIsXG4gICAgICAgICAgICAgICAgICAgIFwiZFwiOiAxMyxcbiAgICAgICAgICAgICAgICAgICAgXCJlXCI6IDE0LFxuICAgICAgICAgICAgICAgICAgICBcImZcIjogMTVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCByZXRWYWwgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbCAqIDE2ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHZhbC5jaGFyQXQoaSkgaW4gbG9va3VwID8gbG9va3VwW3ZhbC5jaGFyQXQoaSldIDogdmFsLmNoYXJBdChpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3NzU3R5bGVDb2xvci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGhyZWUtZGlnaXQgUkdCICgjcmdiKSBpcyBjb252ZXJ0ZWQgdG8gc2l4LWRpZ2l0IGZvcm0gKCNycmdnYmIpIGJ5IHJlcGxpY2F0aW5nIGRpZ2l0c1xuICAgICAgICAgICAgICAgIC8vIChodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWNvbG9yLTMvI3JnYi1jb2xvcilcbiAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yID0gXCIjXCIgKyBjc3NTdHlsZUNvbG9yLmNoYXJBdCgxKS5yZXBlYXQoMikgK1xuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yLmNoYXJBdCgyKS5yZXBlYXQoMikgK1xuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yLmNoYXJBdCgzKS5yZXBlYXQoMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzUmVkID0gZnJvbUhleChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygxLCAzKSk7XG4gICAgICAgICAgICB0aGlzR3JlZW4gPSBmcm9tSGV4KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDMsIDUpKTtcbiAgICAgICAgICAgIHRoaXNCbHVlID0gZnJvbUhleChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZyg1LCA3KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaih0aGlzUmVkLCB0aGlzR3JlZW4sIHRoaXNCbHVlKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vbk1hcHBlciB9IGZyb20gXCIuLi9jb21tb24vQ29tbW9uTWFwcGVyXCI7XG5pbXBvcnQgeyBCb3VuZHMgfSBmcm9tIFwiLi4vYXBpL0lNYXBwZXJcIjtcblxuZXhwb3J0IGNsYXNzIERPTU1hcHBlciBleHRlbmRzIENvbW1vbk1hcHBlciB7XG4gICAgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGdldE5hbWVzcGFjZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJkb21cIlxuICAgIH1cbiAgICBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9IHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHt9O1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8ZWxlbS5hdHRyaWJ1dGVzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRySW5mbyA9IGVsZW0uYXR0cmlidXRlc1tpZHhdO1xuICAgICAgICAgICAgICAgIHJldFZhbFthdHRySW5mby5uYW1lLnRvTG93ZXJDYXNlKCldID0gYXR0ckluZm8ubm9kZVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgZ2V0Qm91bmRzKG5vZGU6IE5vZGUpIDogQm91bmRzIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgLypOb2RlLkVMRU1FTlRfTk9ERSovKSB7XG4gICAgICAgICAgICBsZXQgYWRqdXN0bWVudCA9IDE7XG4gICAgICAgICAgICBpZiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZGV2aWNlUGl4ZWxSYXRpbykge1xuICAgICAgICAgICAgICAgIGFkanVzdG1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBib3VuZHMgPSAobm9kZSBhcyBFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBcbiAgICAgICAgICAgIC8vIERvIGEgY2hlY2sgd2hldGhlciBib3VuZHMgaGFzIHZhbHVlIGFzIHdlIHVzZSBkaWZmZXJlbnQgdG9vbCAoaHRtbFVuaXQsIGJyb3dzZXIpIHRvIGNhbGwgdGhpcyBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKGJvdW5kcykge1xuICAgICAgICAgICAgICAgIGxldCBzY3JvbGxYID0gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxYIHx8IDA7XG4gICAgICAgICAgICAgICAgbGV0IHNjcm9sbFkgPSBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LnNjcm9sbFkgfHwgMDtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcImxlZnRcIjogTWF0aC5jZWlsKChib3VuZHMubGVmdCArIHNjcm9sbFgpICogYWRqdXN0bWVudCksXG4gICAgICAgICAgICAgICAgICAgIFwidG9wXCI6IE1hdGguY2VpbCgoYm91bmRzLnRvcCArIHNjcm9sbFkpICogYWRqdXN0bWVudCksXG4gICAgICAgICAgICAgICAgICAgIFwiaGVpZ2h0XCI6IE1hdGguY2VpbChib3VuZHMuaGVpZ2h0ICogYWRqdXN0bWVudCksXG4gICAgICAgICAgICAgICAgICAgIFwid2lkdGhcIjogTWF0aC5jZWlsKGJvdW5kcy53aWR0aCAqIGFkanVzdG1lbnQpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBET01VdGlsIHtcbiAgICBcbiAgICBzdGF0aWMgaGFzUGFyZW50KG5vZGU6IE5vZGUsIG5hbWVzOnN0cmluZ1tdKSB7XG4gICAgICAgIGxldCBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSk7XG4gICAgICAgIHdoaWxlIChwICYmICFuYW1lcy5pbmNsdWRlcyhwLm5vZGVOYW1lKSkge1xuICAgICAgICAgICAgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIXA7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEFuY2VzdG9yKG5vZGU6IE5vZGUsIG5hbWVzOnN0cmluZ1tdKSB7XG4gICAgICAgIGxldCBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSk7XG4gICAgICAgIHdoaWxlIChwICYmICFuYW1lcy5pbmNsdWRlcyhwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuXG4gICAgc3RhdGljIHNhbWVOb2RlKGE6IE5vZGUsIGI6IE5vZGUpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChhLmlzU2FtZU5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBhLmlzU2FtZU5vZGUoYik7XG4gICAgICAgIH0gZWxzZSBpZiAoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgPT09IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgLSB0cnkgb3VyIGJlc3RcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGNsZWFuV2hpdGVzcGFjZShzOiBzdHJpbmcpIDogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHMucmVwbGFjZSgvWyBcXHRcXHJcXG5dL2csIFwiIFwiKS5yZXBsYWNlKC8gKy9nLFwiIFwiKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2xlYW5TcGFjZShzOiBzdHJpbmcpIDogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHMucmVwbGFjZSgvICsvZyxcIiBcIik7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIHRydWUgaWYgZWxlbWVudDEgYW5kIGVsZW1lbnQyIChjZWxscykgYXJlIGluIHRoZSBzYW1lIHRhYmxlXG4gICAgc3RhdGljIGlzSW5TYW1lVGFibGUoZWxlbWVudDEsIGVsZW1lbnQyKSB7XG4gICAgICAgIGlmIChlbGVtZW50MSAmJiBlbGVtZW50Mikge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50TmFtZSA9IFsndGFibGUnXTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudDE9IERPTVV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudDEsIHBhcmVudE5hbWUpO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50Mj0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtZW50MiwgcGFyZW50TmFtZSk7XG4gICAgICAgICAgICBpZiAocGFyZW50MSAhPT0gbnVsbCAmJiBwYXJlbnQyICE9IG51bGwgJiYgRE9NVXRpbC5zYW1lTm9kZShwYXJlbnQxLCBwYXJlbnQyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBzaGFkb3dSb290Tm9kZShub2RlOiBOb2RlKSA6IE5vZGUgfCBudWxsIHtcbiAgICAgICAgbGV0IG5kID0gbm9kZTtcbiAgICAgICAgd2hpbGUgKG5kICE9IG51bGwgJiYgbmQubm9kZVR5cGUgIT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLykgXG4gICAgICAgICAgICBuZCA9IG5kLnBhcmVudE5vZGU7XG4gICAgICAgIHJldHVybiBuZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgb2JqZWN0cywgYnV0IHJldGFpbnMgTm9kZSBhdHRyaWJ1dGVzIGFzIHJlZmVyZW5jZXNcbiAgICAgKiBAcGFyYW0gcmhzIFxuICAgICAqL1xuICAgIHN0YXRpYyBvYmplY3RDb3B5V2l0aE5vZGVSZWZzKHJoczogYW55KSB7XG4gICAgICAgIGlmICghcmhzKSByZXR1cm4gcmhzO1xuICAgICAgICBpZiAodHlwZW9mIHJocyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByaHMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiByaHM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJocykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJocyBpbnN0YW5jZW9mIE5vZGUgfHwgISFyaHMubm9kZVR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiByaHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmV0VmFsO1xuICAgICAgICAgICAgaWYgKHJocy5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIkFycmF5XCIpIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcmhzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKHRoaXMub2JqZWN0Q29weVdpdGhOb2RlUmVmcyhpdGVtKSk7XG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmhzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbFtrZXldID0gdGhpcy5vYmplY3RDb3B5V2l0aE5vZGVSZWZzKHJoc1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcldpdGhBdHRyaWJ1dGUoZWxlbWVudCwgYXR0ck5hbWUsIGF0dHJWYWx1ZSkge1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgKDxFbGVtZW50PndhbGtOb2RlKS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpID09PSBhdHRyVmFsdWUpIFxuICAgICAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogV2Fsa3MgaW4gYSBET00gb3JkZXJcbiAqIFxuICogU2VlIGFsc28gLi4vYXJpYS9BUklBV2Fsa2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBET01XYWxrZXIge1xuICAgIHJvb3QgOiBOb2RlO1xuICAgIG5vZGUgOiBOb2RlO1xuICAgIGJFbmRUYWc6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50IDogTm9kZSwgYkVuZD8gOiBib29sZWFuLCByb290PyA6IE5vZGUpIHtcbiAgICAgICAgdGhpcy5yb290ID0gcm9vdCB8fCBlbGVtZW50O1xuICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLmJFbmRUYWcgPSAoYkVuZCA9PSB1bmRlZmluZWQgPyBmYWxzZSA6IGJFbmQgPT0gdHJ1ZSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcmVudE5vZGUobm9kZTogTm9kZSkgOiBOb2RlIHwgbnVsbCB7XG4gICAgICAgIGlmIChub2RlID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHAgOiBOb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICBpZiAoKG5vZGUgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHAgPSAobm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgfSBlbHNlIGlmICgobm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgcCA9IChub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICB9IGVsc2UgaWYgKHAgJiYgcC5ub2RlVHlwZSA9PT0gMTEpIHtcbiAgICAgICAgICAgIGlmICgocCBhcyBTaGFkb3dSb290KS5ob3N0KSB7XG4gICAgICAgICAgICAgICAgcCA9IChwIGFzIFNoYWRvd1Jvb3QpLmhvc3Q7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHAgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJlbnRFbGVtZW50KG5vZGU6IE5vZGUpIDogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBsZXQgZWxlbSA6IEVsZW1lbnQgPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGVsZW0gPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtKSBhcyBFbGVtZW50O1xuICAgICAgICB9IHdoaWxlIChlbGVtICYmIGVsZW0ubm9kZVR5cGUgIT09IDEpO1xuICAgICAgICByZXR1cm4gZWxlbTtcbiAgICB9XG4gICAgXG4gICAgc3RhdGljIGlzTm9kZVZpc2libGUobm9kZTogTm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHZpcyA9IG51bGw7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSAmJiBub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBsZXQgdyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBsZXQgY3MgPSB3LmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKGNzLmRpc3BsYXkgPT09IFwibm9uZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHZpcyA9PT0gbnVsbCAmJiBjcy52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZpcyA9IGNzLnZpc2liaWxpdHk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2aXMgPT09IFwiaGlkZGVuXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxlbSA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGVsZW0pO1xuICAgICAgICAgICAgfSB3aGlsZSAoZWxlbSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhdFJvb3QoKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS5vd25lckVsZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PT0gdGhpcy5ub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QuaXNTYW1lTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5pc1NhbWVOb2RlKHRoaXMubm9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMubm9kZSkgPT09IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgLSB0cnkgb3VyIGJlc3RcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGUucGFyZW50Tm9kZSA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5leHROb2RlKCkgOiBib29sZWFuIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5ub2RlLm5vZGVOYW1lLCB0aGlzLmJFbmRUYWc/XCJFTkRcIjpcIlNUQVJUXCIsIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIGFueSkuZ2V0QXR0cmlidXRlKFwiaWRcIikpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBzbG90RWxlbWVudCA9ICh0aGlzLm5vZGUgYXMgSFRNTFNsb3RFbGVtZW50KVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmlzTm9kZVZpc2libGUoZWxlbWVudE5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3RcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdC5maXJzdENoaWxkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudE5vZGUuc2hhZG93Um9vdDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSBcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzbG90XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNsb3RPd25lciA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpWzBdO1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gfHwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxMSkgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0Um9vdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNsb3RPd25lciA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0U2xvdEluZGV4ID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCsxO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0U2xvdEluZGV4IDwgc2xvdE93bmVyLmFzc2lnbmVkTm9kZXMoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKClbbmV4dFNsb3RJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCA9IG5leHRTbG90SW5kZXg7ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLylcbiAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJldk5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAodGhpcy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlmcmFtZU5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxJRnJhbWVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudE5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIlxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290Lmxhc3RDaGlsZCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50Tm9kZS5zaGFkb3dSb290O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyB8fCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDExKSAmJiB0aGlzLm5vZGUubGFzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucHJldmlvdXNTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExKVxuICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi8uLi92NC91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuL0RPTVV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgY2xhc3MgVmlzVXRpbCB7XG4gICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBlbGVtZW50IHRhZ3Mgd2hpY2ggY2FuIG5vdCBiZSBoaWRkZW4sIHdoZW4gaGlkZGVuIGlzXG4gICAgLy8gYWRkZWQgdG8gdGhlc2VzIGVsZW1lbnRzIGl0IGRvZXMgbm90IGRvIGFueXRoaW5nIGF0IGFsbC5cbiAgICAvLyAgYXJlYSAtLT4gYXJlYSBlbGVtZW50IGlzIHBhcnQgb2YgYSBtYXAgZWxlbWVudCBhbmQgaXQgY2FuIG5vdCBiZSBoaWRkZW4gYmVjYXVzZSBpdCBpcyB1c2VkIHRvXG4gICAgLy8gICAgICAgICAgIG1ha2UgYW4gY2VydGlhbiBwYXJ0cyBvZiBhbiBtYXAgaW50ZXJhY3RpdmUuXG4gICAgLy8gIHBhcmFtIC0tPiBlbGVtZW50IGNhbiBvbmx5IGJlIHBhcnQgb2Ygb2JqZWN0IGVsbWVudCBhbmQgaXQgY2Fubm90IGJlIGhpZGRlbiBkaXJlY3RseSwgaXRcbiAgICAvLyAgICAgICAgICAgIGNhbiBvbmx5IGJlIGhpZGRlbiBpZiB0aGUgcGFyZW50IGlzIGhpZGRlbi5cbiAgICAvLyAgYXVkaW8gLS0+IElmIHRoaXMgZWxlbWVudCBpcyBoaWRkZW4gaXQgd2lsbCBzdGlsbCBwbGF5IHRoZSBtdXNpYywgc28gd2Ugc2hvdWxkIHN0aWxsIHRyaWdnZXJcbiAgICAvLyAgICAgICAgICAgIHZpb2xhdGlvbnMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAvLyBOb3RlOiBBbGwgZWxlbWVudCB0YWdzIHRoYXQgYXJlIGFkZGVkIGhlcmUgc2hvdWxkIGJlIGFkZGVkIGFzIGxvd2VyY2FzZSwgYXMgd2UgYXJlIHVzaW5nIGluZGV4T2YgdG8gZG8gdGhlIGNoZWNrLlxuICAgIHB1YmxpYyBzdGF0aWMgdW5oaWRlYWJsZUVsZW1lbnRzID0gWydhcmVhJywgJ3BhcmFtJywgJ2F1ZGlvJ107XG5cbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRhZ3Mgd2hpY2ggaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIHNpbmNlIHdlIGhhdmUgcnVsZXMgdHJpZ2dlcmluZ1xuICAgIC8vIG9uIHRoZXNlcyBlbGVtZW50cyB3ZSBuZWVkIHRvIG1ha2UgdGhlbiB2aXNpYmxlIGJ5IGRlZmF1bHQgc28gdGhhdCB0aGUgcnVsZXMgY2FuIHRyaWdnZXIgcmVnYXJkbGVzcyBvZiB0aGVcbiAgICAvLyBDaGVjayBIaWRkZW4gQ29udGVudCBvcHRpb24gaW4gdGhlIHRvb2xzLlxuICAgIC8vICBzY3JpcHQgLS0+IHNjcmlwdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdFxuICAgIC8vICBsaW5rIC0tPiBsaW5rIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgdGhlIGFjdHVhbGx5IENTUyBzY3JpcHQgaXMgc3RpbGwgZXhlY3V0ZWQgc28gd2UgaGF2ZSB0b1xuICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgLy8gIHN0eWxlIC0tPiBzdHlsZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IHRoZSBhY3R1YWxseSBDU1Mgc2NyaXB0IGlzIHN0aWxsIGV4ZWN1dGVkIHNvIHdlIGhhdmUgdG9cbiAgICAvLyAgICAgICAgICAgIG1hcmsgdGhpcyBlbGVtZW50IGFzIHZpc2libGUgYXQgYWxsIHRpbWVzLlxuICAgIC8vICBoZWFkIC0tPiBoZWFkIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBiZWhhdmUgY29ycmVjdFxuICAgIC8vICB0aXRsZSAtLT4gdGl0bGUgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCBpdCB3aWxsIHN0aWxsIGRpc3BsYXkgdGhlIHRpdGxlXG4gICAgLy8gIG1ldGEgLS0+IG1ldGEgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCBpdCB3aWxsIHN0aWxsIHBlcmZvcm0gdGhlIGFjdGlvbiB0aGF0IG1ldGEgaXMgc3VwcG9zZSB0b1xuICAgIC8vICBiYXNlIC0tPiBiYXNlIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBwZXJmb3JtIHRoZSBhY3Rpb24gdGhhdCBtZXRhIGlzIHN1cHBvc2UgdG9cbiAgICAvLyAgbm9zY3JpcHQgLS0+IG5vc2NyaXB0IGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBwZXJmb3JtIHRoZSBhY3Rpb24gdGhhdCBtZXRhIGlzIHN1cHBvc2UgdG9cbiAgICAvLyAgdGVtcGxhdGUgLS0+IHRlbXBsYXRlIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBiZWNhdXNlIHRoZXkgYXJlIGp1c3QgYSBtZWNoYW5pc20gZm9yIGhvbGRpbmcgY2xpZW50LXNpZGUgY29udGVudFxuICAgIC8vICAgICAgICAgICAgICAgdGhhdCBpcyBub3QgdG8gYmUgcmVuZGVyZWQgd2hlbiBhIHBhZ2UgaXMgbG9hZGVkLiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvdGVtcGxhdGVcbiAgICAvLyAgZGF0YWxpc3QgLS0+IGRhdGFsaXN0IGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LFxuICAgIHB1YmxpYyBzdGF0aWMgaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgPSBbJ3NjcmlwdCcsICdsaW5rJywgJ3N0eWxlJywgJ2hlYWQnLCAndGl0bGUnLCAnbWV0YScsICdiYXNlJywgJ25vc2NyaXB0JywgJ3RlbXBsYXRlJywgJ2RhdGFsaXN0J11cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIGlmIHRoZSBub2RlIHRoYXQgaXMgcHJvdmllZCBpc1xuICAgICAqIHZpc2libGUgb3Igbm90LiBGb2xsb3dpbmcgaXMgaG93IHRoZSBjaGVjayBpcyBwZXJmb3JtZWQ6XG4gICAgICogICAgMS4gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6XG4gICAgICogICAgICAgQ1NTIC0tPiBkaXNsYXk6IG5vbmVcbiAgICAgKiAgICAgICBDU1MgLS0+IHZpc2liaWxpdHk6IGhpZGRlblxuICAgICAqICAgICAgIGF0dHJpYnV0ZSAtLT4gaGlkZGVuXG4gICAgICogICAgMi4gQ2hlY2sgaWYgdGhlIGFueSBvZiB0aGUgY3VycmVudCBub2RlcyBwYXJlbnRzIGFyZSBoaWRkZW4gd2l0aCB0aGUgc2FtZVxuICAgICAqICAgICAgIG9wdGlvbnMgbGlzdGVkIGluIDEuXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSBoaWRkZW4gdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgKG5vZGUgaXMgbm90IHZpc2libGUpLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IG5vZGUgVGhlIG5vZGUgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgaWYgaXQgaXMgdmlzaWJsZSBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gZmFsc2UgaWYgdGhlIG5vZGUgaXMgTk9UIHZpc2libGUsIHRydWUgb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgVmlzVXRpbFxuICAgICAqL1xuICAgICBwdWJsaWMgc3RhdGljIGlzTm9kZVZpc2libGUobm9kZUluOiBOb2RlKSA6IGJvb2xlYW4ge1xuXG4gICAgICAgIC8vIENoZWNrIHRoZSBub2RlVHlwZSBpZiB0aGlzIG5vZGUsIGlmIHRoaXMgbm9kZSBpcyBhIHRleHQgbm9kZSB0aGVuXG4gICAgICAgIC8vIHdlIGdldCB0aGUgcGFyZW50bm9kZSBhbmQgc2V0IHRoYXQgYXMgdGhlIG5vZGUgYXMgYSB0ZXh0IG5vZGVzLFxuICAgICAgICAvLyB2aXNpYmlsaXR5IGlzIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIHBhcmVudCBub2RlLlxuICAgICAgICBpZiAobm9kZUluLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICBub2RlSW4gPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlSW4pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBub2RlID0gbm9kZUluIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0hJRERFTiB0byBmYWxzZSBmb3IgYWxsIHRoZSBub2RlcywgYmVmb3JlIHRoZSBjaGVjayBhbmQgdGhpcyB3aWxsIGJlIGNoYW5nZWQgdG9cbiAgICAgICAgLy8gdHJ1ZSB3aGVuIHdlIGRldGVjdCB0aGF0IHRoZSBub2RlIGlzIGhpZGRlbi4gV2UgaGF2ZSB0byBzZXQgaXQgdG8gZmFsc2Ugc28gdGhhdCB3ZSBrbm93XG4gICAgICAgIC8vIHRoZSBydWxlcyBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gICAgICAgIHNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCBmYWxzZSkpO1xuXG4gICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGFsbG93IG5vZGVUeXBlIGVsZW1lbnQsIGFuZCBUZXh0Tm9kZSBhbGwgb3RoZXIgbm9kZXNUeXBlc1xuICAgICAgICAvLyB3ZSBjYW4gcmV0dXJuIHRoZSB2aXNpYmlsaXR5IGFzIHZpc2libGUuXG4gICAgICAgIC8vIEZvbGxvd2luZyBub2RlcyB3aWxsIGJlIHJldHVybmVkIGFzIHZpc2FibGUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgY2FuIG5vdFxuICAgICAgICAvLyBhY3R1YWxseSBjaGFuZ2UgdGhlaXIgdmlzaWJpbGl0eS5cbiAgICAgICAgLy8gIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIC0tPiA3XG4gICAgICAgIC8vICBOb2RlLkNPTU1FTlRfTk9ERSAgICAgICAgICAgICAgICAtLT4gOFxuICAgICAgICAvLyAgOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gICAgICAgICAgICAgICAtLT4gOVxuICAgICAgICAvLyAgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgICAgICAgICAgLS0+IDEwXG4gICAgICAgIC8vICBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICAtLT4gMTFcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG93bmVyRG9jdW1lbnQgaXMgcHJlc2VudCBiZWZvcmUgbW92aW5nIGZvcndhcmRcbiAgICAgICAgLy8gaW4gZGV0ZWN0aW5nIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90LiBJbiB0aGUgY2FzZSB0aGF0IG93bmVyRG9jdW1lbnRcbiAgICAgICAgLy8gZG9lcyBub3QgZXhpc3QgdGhlbiB3ZSBzaW1wbHkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZSBieSBkZWZhdWx0LlxuICAgICAgICBpZiAoIW5vZGUub3duZXJEb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsYXJhdGlvblxuICAgICAgICBsZXQgY29tcFN0eWxlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhpcyBub2RlIGlzIGEgc2NyaXB0LCBsaW5rIG9yIHN0eWxlIG5vZGUsIHJpZ2h0IGF3YXkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZVxuICAgICAgICAvLyBiZWNhdXNlIHNjcmlwdHMsIGxpbmtzIGFuZCBzdHlsZSBub2RlcyBjYW4gbm90IGJlIGhpZGRlbiBieSBIVE1MIGF0dHJpYnV0ZSBvciBDU1Mgb3IgYXJlIGhpZGRlbiBieSBkZWZhdWx0LiBCdXQgd2Ugd2FudCB0byBzY2FuXG4gICAgICAgIC8vIHRoZSBlbGVtZW50cyBldmVyeXRpbWUgYXMgdGhleSByZW5kZXIgY29udGVudCBzdGlsbCB3aGljaCBpcyBzdGlsbCB2aXNpYmxlIHRvIHVzZXJzLlxuICAgICAgICAvLyAgc2NyaXB0IC0tPiBzY3JpcHQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHRcbiAgICAgICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vICBzdHlsZSAtLT4gc3R5bGUgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIGlmIChWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IG51bGwgJiYgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cyAhPSB1bmRlZmluZWQgJiYgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBpcyB2aXNpYmxlLCB3ZSBjaGVjayBjb3VwbGUgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIGhpZGRlbiBhdHRyaWJ1dGUuXG4gICAgICAgIC8vIGFyZWEsIHBhcmFtIGFuZCBhdWRpbyBlbGVtZW50cyB3ZSBkbyBub3QgY2hlY2sgaWYgdGhleSBhcmUgaGlkZGVuIGFzIGl0IGRvZXMgbm90IGFwcGx5IHRvIHRoZW0uXG4gICAgICAgIC8vIENoZWNrIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgd2hpY2ggaXMgcGFydCBvZiB0aGUgcnVsZXMsIHRvIGNoZWNrIGlmIHRoaXMgZWxlbWVudCBpcyBhbGxvd2VkIHRvIGJlIGhpZGRlbiBvciBub3RcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGUgZWxlbWVudCBpcyBwYXJ0IG9mIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgdGhlbiB3ZSBkbyBub3QgcnVuIHRoZSBoaWRkZW4gY2hlY2sgb24gdGhpcyBlbGVtZW50LFxuICAgICAgICAvLyBhbmQgZ28gc3RyaWdodCB0byB0aGUgcGFyZW50IG5vZGUuXG4gICAgICAgIC8vIEFycmF5IGNoZWNrIGVsZW1lbnRzIGxpa2U6XG4gICAgICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gICAgICAgICAgIG1ha2UgYW4gY2VydGlhbiBwYXJ0cyBvZiBhbiBtYXAgaW50ZXJhY3RpdmUuXG4gICAgICAgIC8vICBwYXJhbSAtLT4gZWxlbWVudCBjYW4gb25seSBiZSBwYXJ0IG9mIG9iamVjdCBlbG1lbnQgYW5kIGl0IGNhbm5vdCBiZSBoaWRkZW4gZGlyZWN0bHksIGl0XG4gICAgICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgICAgICAvLyAgYXVkaW8gLS0+IElmIHRoaXMgZWxlbWVudCBpcyBoaWRkZW4gaXQgd2lsbCBzdGlsbCBwbGF5IHRoZSBtdXNpYywgc28gd2Ugc2hvdWxkIHN0aWxsIHRyaWdnZXJcbiAgICAgICAgLy8gICAgICAgICAgICB2aW9sYXRpb25zIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdW5oaWRlYWJsZUVsZW1lbnRzIGFycmF5IGlzIG5vdCBkZWZpbmVkIHRoZW4gd2UganVzdCBzY2FuIGFsbCBlbGVtZW50cyBhbmQgZG8gbm8gZmlsdGVyaW5nIGF0IGFsbC5cbiAgICAgICAgaWYgKFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSBudWxsIHx8IFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSB1bmRlZmluZWQgfHwgVmlzVXRpbC51bmhpZGVhYmxlRWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBkZWZhdWx0VmlldyBleGlzdHMgZm9yIHRoaXMgbm9kZSwgaWYgaXQgZG9lcyB0aGVuIHVzZSB0aGlzIHRvIHJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZVxuICAgICAgICAgICAgLy8gZnVuY3Rpb24gdG8gZ2V0IHRoZSBDU1Mgc3R5bGUgZm9yIHRoZSBub2RlLlxuICAgICAgICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldykge1xuICAgICAgICAgICAgICAgIC8vIFJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZSBvbiB0aGlzIG5vZGUgdG8gZmV0Y2ggdGhlIENTUyBjb21wdWF0aW9uIG9mIHRoZSBub2RlXG4gICAgICAgICAgICAgICAgY29tcFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGRlZmF1bHRWaWV3IGRvZXMgbm90IGV4aXN0cyByZXR1cm4gdHJ1ZSB0byBpZGVudGlmeSB0aGF0IHRoaXNcbiAgICAgICAgICAgIC8vIG5vZGUgaXMgdmlzaWJsZSwgYmVjYXVzZSB3ZXJlIG5vdCBhYmxlIHRvIGRldGVjdCBpZiBpdCB3YXMgbm90LlxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgaGlkZGVuIGVsZW1lbnQgcHJvcGVydHkgYW5kIGhpZGRlbiBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGxldCBoaWRkZW5BdHRyaWJ1dGUgPSBub2RlLmdldEF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgICAgICAgIGxldCBoaWRkZW5Qcm9wZXJ0eUN1c3RvbSA9IGdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIC8vIFRvIGdldCB0aGUgaGlkZGVuIHByb3BlcnR5IHdlIG5lZWQgdG8gcGVyZm9ybSBhIHNwZWNpYWwgY2hlY2sgYXMgaW4gc29tZSBjYXNlcyB0aGUgaGlkZGVuIHByb3BlcnR5IHdpbGwgbm90IGJlXG4gICAgICAgICAgICAvLyBhIGJvb2xlYW4sIGZvciB0aGVzZXMgY2FzZXMgd2Ugc2V0IGl0IHRvIGZhbHNlIGFzIHdlIGFyZSBub3QgYWJsZSB0byBkZXRlcm1pbmUgdGhlIHRydWUgaGlkZGVuIGNvbmRpdGlvbi5cbiAgICAgICAgICAgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgYmVjYXVzZSBmb3JtIGVsZW1lbnRzIGFyZSBhYmxlIHRvIHBlcmZvcm0gYW4gb3ZlcnJpZGUsIHNvIHdoZW4gd2UgaGF2ZSBpZD1cImhpZGRlblwiIGZvciBhbiBlbGVtZW50XG4gICAgICAgICAgICAvLyB3aGljaCBpcyB1bmRlciB0aGUgZm9ybSBlbGVtZW50IHRoZW4sIG5vZGUuaGlkZGVuIGdpdmVzIHRoZSBlbGVtZW50L2xpc3Qgb2YgZWxlbWVudHMgd2hpY2ggaGF2ZSBpZD1cImhpZGRlblwiLiBSZWZlciB0b1xuICAgICAgICAgICAgLy8gbW96aWxsYSBidWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNjczNTZcbiAgICAgICAgICAgIGxldCBoaWRkZW5Qcm9wZXJ0eSA9IHR5cGVvZiAobm9kZSBhcyBhbnkpLmhpZGRlbiA9PT0gXCJib29sZWFuXCIgPyAobm9kZSBhcyBhbnkpLmhpZGRlbiA6IGZhbHNlO1xuICAgICAgICAgICAgLy8gSWYgY29tcFN0eWxlIG9iamVjdCBpcyBlbXB0eSwgbm9kZSBkb2VzJ3QgaGF2ZSBoaWRkZW4gcHJvcGVydHksIG5vZGUgZG9lcyd0IGhhdmUgaGlkZGVuIGF0dHJpYnV0ZSBhbmQgZG9lcyd0IGhhdmUgY3VzdG9tIFBUXG4gICAgICAgICAgICAvLyBoaWRkZW4gcHJvcGVydHkgdGhlbiB3ZSBjYW4ganVzdCByZXR1cm4gdHJ1ZSAobm9kZSB2aXNpYmxlKSBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgaWYgKCFjb21wU3R5bGUgJiZcbiAgICAgICAgICAgICAgICAhaGlkZGVuUHJvcGVydHkgJiYgLy8gdGhpcyBjb3ZlcnMgZmFsc2UsIG51bGwsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIChoaWRkZW5BdHRyaWJ1dGUgPT09IG51bGwgfHwgaGlkZGVuQXR0cmlidXRlID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAgICAgIWhpZGRlblByb3BlcnR5Q3VzdG9tIC8vIFRoaXMgY292ZXJzIGZhbHNlLCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlIGNvbXBTdHlsZSBpcyBkZWZpbmVkIHdlIGNoZWNrIHRoZSBmb2xsb3dpbmc6XG4gICAgICAgICAgICAvLyAgQ1NTIHN0eWxlIGRpc3BsYXkgc2V0IHRvIG5vbmVcbiAgICAgICAgICAgIC8vICBDU1Mgc3R5bGUgdmlzaWJpbGl0eSBzZXQgdG8gaGlkZGVuXG4gICAgICAgICAgICAvLyAgICBOb3RlOiBGb3IgdGhpcyBwcm9wZXJ0eSBzaW5jZSBpdCBpcyBpbmhlcml0ZWQsIG5lZWQgdG8gc2tpcCB0aGUgY2hlY2sgb24gcGFyZW50cyBhc1xuICAgICAgICAgICAgLy8gICAgICAgICAgdGhlIHBhcmVudCBjYW4gaGF2ZSBoaWRkZW4gYnV0IHRoZSBjaGlsZCBjYW4gYmUgdmlzaWJsZS4gU28gd2Ugb25seSBjaGVjayB0aGlzIHByb3BlcnR5XG4gICAgICAgICAgICAvLyAgICAgICAgICBvbiBjaGlsZCBlbGVtZW50cy9lbGVtZW50cyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiB0aGUgZmlyc3QgdGltZS5cbiAgICAgICAgICAgIC8vICBub2RlIGhpZGRlbiBwcm9wZXJ0eSBzZXQgKG5vZGUuaGlkZGVuKVxuICAgICAgICAgICAgLy8gIG5vZGUgYXR0cmlidXRlIGhpZGRlbiBzZXQgKHRvIGFueSB2YWx1ZSlcbiAgICAgICAgICAgIC8vICBub2RlIGN1c3RvbSBoaWRkZW4gcHJvcGVydHkgc2VyIChub2RlLlBUX05PREVfSElEREVOKVxuICAgICAgICAgICAgLy8gSWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSB0cnVlIHRoZW4gd2UgcmV0dXJuIGZhbHNlIGFzIHRoaXMgZWxlbWVudCBpcyBub3QgdmlzaWJsZVxuICAgICAgICAgICAgaWYgKChjb21wU3R5bGUgIT09IG51bGwgJiYgKChjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZGlzcGxheScpID09PSAnbm9uZScgfHxcbiAgICAgICAgICAgICAgICAoIWdldENhY2hlKG5vZGUsIFwiVmlzaWJpbGl0eV9DaGVja19QYXJlbnRcIiwgbnVsbCkgJiYgY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3Zpc2liaWxpdHknKSA9PT0gJ2hpZGRlbicpKSkgfHxcbiAgICAgICAgICAgICAgICAoY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKSAhPT0gJ2Jsb2NrJyAgJiYgKGhpZGRlblByb3BlcnR5IHx8IGhpZGRlbkF0dHJpYnV0ZSAhPSBudWxsIHx8IGhpZGRlblByb3BlcnR5Q3VzdG9tKSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gU2V0IGEgY3VzdG9tIGV4cGFuZG9zIHByb3BlcnR5IG9uIHRoZSB0aGUgbm9kZSB0byBpZGVudGlmeSB0aGF0IGl0IGlzIGhpZGRlbiwgc28gdGhhdCB3ZSBjYW4gdXNlc1xuICAgICAgICAgICAgICAgIC8vIHVzZSB0aGlzIGluIHRoZSBydWxlcyB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgaXMgaGlkZGVuIG9yIG5vdCwgaWYgd2UgbmVlZCB0by5cbiAgICAgICAgICAgICAgICAvLyBVc2UgZXhwYW5kb3MgcHJvcGVydHkgaW5zdGVhZCBvZiBhIGhhc2ggbWFwIHdoaWNoIHN0b3JlcyB0aGUgZWxlbWVudHMsIGFkZGluZy9jaGVja2luZyBleHBhbmRvc1xuICAgICAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgaXMgYSBsb3QgZmFzdGVyIHBlcmZvcm1hbmNlIHdoaXNlLiBGb3IgSGFzaCBtYXAgd2UgbmVlZCB0byBzdG9yZSBiYXNlZCBvbiB4cGF0aCwgYW5kIHRvIGNhbGN1bGF0ZVxuICAgICAgICAgICAgICAgIC8vIHhwYXRoIGl0IGlzIG1vcmUgcGVyZm9ybWFuY2UgaW1wYWN0LlxuICAgICAgICAgICAgICAgIHNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnROb2RlIGZvciB0aGlzIG5vZGUsIGJlY3Vhc2Ugd2UgaGF2ZSB0byBjaGVjayBhbGwgcGFyZW50cyB0byBtYWtlIHN1cmUgdGhleSBkbyBub3QgaGF2ZVxuICAgICAgICAvLyB0aGUgaGlkZGVuIENTUywgcHJvcGVydHkgb3IgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgLy8gZWxlbWVudC5cbiAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcblxuICAgICAgICAvLyBJZiB0aGUgcGFyZW50IG5vZGUgZXhpc3RzIGFuZCB0aGUgbm9kZXR5cGUgaXMgZWxlbWVudCAoMSksIHRoZW4gcnVuIHJlY3Vyc2l2ZSBjYWxsIHRvIHBlcmZvcm0gdGhlIGNoZWNrXG4gICAgICAgIC8vIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSB2ZXJ5IHBhcmVudCBub2RlLiBVc2UgcmVjdXJzaXZlIGNhbGwgaGVyZSBpbnN0ZWFkIG9mIGEgd2hpbGUgbG9vcCBzbyB0aGF0IHdlIGRvIG5vdFxuICAgICAgICAvLyBoYXZlIHRvIGR1cGxpY2F0ZSB0aGUgbG9naWMgZm9yIGNoZWNraW5nIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90IGZvciBhbGwgdGhlIHBhcmVudHMgc3RhcnRpbmcgd2l0aFxuICAgICAgICAvLyBjaGlsZCBub2RlLlxuICAgICAgICBpZiAocGFyZW50RWxlbWVudCAhPSBudWxsICYmIHBhcmVudEVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgaGF2ZSBhIHBhcmVudCBlbGVtZW50IGdvaW5nIHRocm91Z2ggdGhlIGlzTm9kZVZpc2libGUgZnVuY3Rpb24gd2UgaGF2ZSB0byBtYXJrIGl0IGFzIHN1Y2hcbiAgICAgICAgICAgIC8vIHNvIHRoYXQgaW4gdGhlIGZ1bmN0aW9uIHdlIGNhbiBza2lwIGNoZWNraW5nIHZpc2liaWxpdHk6IGhpZGRlbiBmb3IgcGFyZW50IGVsZW1lbnRzIHNpbmNlIHZpc2liaWxpdHk6IGhpZGRlblxuICAgICAgICAgICAgLy8gaXMgaW5oZXJpdGVkLCB3aGljaCBhbGxvd3MgYSBjaGlsZCB0byBoYXZlIGEgZGlmZmVyZW50IHNldHRpbmcgdGhlbiB0aGUgY2hpbGQuIFRoaXMgcHJvcGVydHkgb25seSBuZWVkcyB0byBiZSBjaGVja2VkXG4gICAgICAgICAgICAvLyBvbmNlIGZvciB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHBhc3NlZCBkb3duIGFuZCB0aGF0IGlzIGFsbC4gSWdub3JlIGl0IGZvciBhbGwgdGhlIHBhcmVudHMgdGhhdCB3ZSBpdGVyYXRlIG92ZXIuXG4gICAgICAgICAgICBzZXRDYWNoZShwYXJlbnRFbGVtZW50IGFzIEVsZW1lbnQsIFwiVmlzaWJpbGl0eV9DaGVja19QYXJlbnRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHVwd2FyZHMgcmVjdXJzaXZlbHksIGFuZCBzYXZlIHRoZSByZXN1bHRzIGluIGFuIHZhcmlhYmxlXG4gICAgICAgICAgICBsZXQgbm9kZVZpc2libGUgPSBWaXNVdGlsLmlzTm9kZVZpc2libGUocGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGZvdW5kIHRvIG5vdCBiZSB2aXNpYmxlIHRoZW4gYWRkIHRoZSBjdXN0b20gUFRfTk9ERV9ISURERU4gdG8gdHJ1ZS5cbiAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGlzIGluIHRoZSBydWxlcy5cbiAgICAgICAgICAgIGlmICghbm9kZVZpc2libGUpIHtcbiAgICAgICAgICAgICAgICBzZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgICByZXR1cm4gbm9kZVZpc2libGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gdHJ1ZSAobm9kZSBpcyB2aXNpYmxlKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBvciBpdHMgYW5jZXN0b3IgaXMgbmF0aXZlbHkgaGlkZGVuIG9yIGFyaWEtaGlkZGVuID0gJ3RydWUnXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTm9kZUhpZGRlbkZyb21BVChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShub2RlKSB8fCBub2RlLmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSAndHJ1ZScpIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgYW5jZXN0b3IgPSBET01VdGlsLmdldEFuY2VzdG9yV2l0aEF0dHJpYnV0ZShub2RlLCBcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgaWYgKGFuY2VzdG9yKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vbk1hcHBlciB9IGZyb20gXCIuLi9jb21tb24vQ29tbW9uTWFwcGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBTdHlsZU1hcHBlciBleHRlbmRzIENvbW1vbk1hcHBlciB7XG4gICAgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcImNvbXB1dGVkXCI7XG4gICAgfVxuICAgIGdldE5hbWVzcGFjZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJjc3NcIlxuICAgIH1cbiAgICBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9IHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHt9O1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PHN0eWxlLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gc3R5bGVbaWR4XS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHJldFZhbFtuYW1lXSA9IHN0eWxlW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBJTWFwUmVzdWx0IH0gZnJvbSBcIi4vSU1hcHBlclwiO1xuXG5leHBvcnQgZW51bSBlUnVsZUNvbmZpZGVuY2Uge1xuICAgIFBBU1MgPSBcIlBBU1NcIixcbiAgICBGQUlMID0gXCJGQUlMXCIsXG4gICAgUE9URU5USUFMID0gXCJQT1RFTlRJQUxcIixcbiAgICBNQU5VQUwgPSBcIk1BTlVBTFwiXG59XG5cbmV4cG9ydCBlbnVtIGVSdWxlUG9saWN5IHtcbiAgICBWSU9MQVRJT04gPSBcIlZJT0xBVElPTlwiLFxuICAgIFJFQ09NTUVOREFUSU9OID0gXCJSRUNPTU1FTkRBVElPTlwiLFxuICAgIElORk9STUFUSU9OID0gXCJJTkZPUk1BVElPTlwiXG59XG5cbmV4cG9ydCBlbnVtIGVUb29sa2l0TGV2ZWwge1xuICAgIExFVkVMX09ORSA9IFwiMVwiLFxuICAgIExFVkVMX1RXTyA9IFwiMlwiLFxuICAgIExFVkVMX1RIUkVFID0gXCIzXCIsXG4gICAgTEVWRUxfRk9VUiA9IFwiNFwiXG59XG5cbmV4cG9ydCBlbnVtIGVSdWxlQ2F0ZWdvcnkge1xuICAgIEFDQ0VTU0lCSUxJVFkgPSBcIkFjY2Vzc2liaWxpdHlcIixcbiAgICBERVNJR04gPSBcIkRlc2lnblwiLFxuICAgIE9USEVSID0gXCJPdGhlclwiXG59XG5cbmV4cG9ydCBlbnVtIGVSdWxlc2V0VHlwZSB7XG4gICAgREVGQVVMVCA9IFwiZGVmYXVsdFwiLFxuICAgIEVYVEVOU0lPTiA9IFwiZXh0ZW5zaW9uXCJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVQYXNzKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLlBBU1NdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVSZW5kZXIocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuUEFTU10sXG4gICAgICAgIHJlYXNvbklkOiAwLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gUnVsZUZhaWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuRkFJTF0sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZVBvdGVudGlhbChyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5QT1RFTlRJQUxdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVNYW51YWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuTUFOVUFMXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFJ1bGVSZXN1bHQgPSB7XG4gICAgdmFsdWU6IFtlUnVsZVBvbGljeSwgZVJ1bGVDb25maWRlbmNlXSxcbiAgICByZWFzb25JZD86IG51bWJlciB8IHN0cmluZyxcbiAgICBtZXNzYWdlQXJncz86IHN0cmluZ1tdLFxuICAgIGFwaUFyZ3M/OiBhbnlbXVxufVxuXG5leHBvcnQgdHlwZSBSdWxlRGV0YWlscyA9IFJ1bGVSZXN1bHQgJiB7XG4gICAgcnVsZUlkOiBzdHJpbmcsXG5cbiAgICBub2RlOiBOb2RlLFxuICAgIC8vIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGNhdGVnb3J5PzogZVJ1bGVDYXRlZ29yeSxcbiAgICBwYXRoOiB7IFtuczogc3RyaW5nXSA6IHN0cmluZyB9LFxuXG4gICAgcnVsZVRpbWU6IG51bWJlcixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgYm91bmRzPzoge1xuICAgICAgICB0b3A6IG51bWJlcixcbiAgICAgICAgbGVmdDogbnVtYmVyLFxuICAgICAgICB3aWR0aDogbnVtYmVyLFxuICAgICAgICBoZWlnaHQ6IG51bWJlclxuICAgIH0sXG4gICAgc25pcHBldDogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFJ1bGVDb250ZXh0SGllcmFyY2h5ID0geyBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcFJlc3VsdFtdIH07XG5cbmV4cG9ydCB0eXBlIFJ1bGVDb250ZXh0ID0ge1xuICAgIFtuYW1lc3BhY2U6IHN0cmluZ10gOiBJTWFwUmVzdWx0XG59XG5cbmV4cG9ydCB0eXBlIFJ1bGUgPSB7XG4gICAgLy8gVW5pcXVlIHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGlzIHJ1bGUgKHNob3VsZCBiZSBodW1hbiB1bmRlcnN0YW5kYWJsZSlcbiAgICAvLyBOTFMgY29kZXMgYW5kIGhlbHAgc291cmNlcyB3aWxsIGJlIGJhc2VkIG9mZiBvZiB0aGlzIGlkXG4gICAgaWQ6IHN0cmluZztcblxuICAgIHJ1bGVzZXRzOiBBcnJheTx7XG4gICAgICAgIGlkOiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgICAgICBudW06IHN0cmluZyB8IHN0cmluZ1tdXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeSxcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsXG4gICAgfT5cblxuICAgIHJlZmFjdG9yPzoge1xuICAgICAgICBbb2xkUnVsZUlkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbb2xkUmVhc29uQ29kZTogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgW2xvY2FsZTogc3RyaW5nXToge1xuICAgICAgICAgICAgW3JlYXNvbklkOiBzdHJpbmddOiBzdHJpbmdcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBoZWxwOiB7XG4gICAgICAgIFtsb2NhbGU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIFxuICAgICAqIEhvdyB0aGlzIHJ1bGUgbWFwcyB0byBBQ1QgcnVsZXMsIGlmIGFueSAoaHR0cHM6Ly9hY3QtcnVsZXMuZ2l0aHViLmlvL3J1bGVzLylcbiAgICAgKiBcbiAgICAgKiBzdHJpbmc6IEZvciBhIHNpbmdsZSBydWxlIG1hcHBpbmcgdGhhdCBtYXRjaGVzIGV4YWN0bHkgdG8gdGhlIHJ1bGUgKFBhc3MgLT4gcGFzcywgUG90ZW50aWFsIC0+IGNhbnRUZWxsLCBGYWlsIC0+IGZhaWwsIHVubGlzdGVkID0+IGluYXBwbGljYWJsZSlcbiAgICAgKiBBcnJheTw+OiBDdXN0b20gbWFwcGluZyBvZiBydWxlIHRvIEFDVCByZXN1bHRzXG4gICAgICovXG4gICAgYWN0Pzogc3RyaW5nIHwgc3RyaW5nW10gfCBBcnJheTxzdHJpbmcgfCB7XG4gICAgICAgIFthY3RSdWxlSWQ6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogXCJwYXNzXCIgfCBcImZhaWxcIiB8IFwiY2FudFRlbGxcIiB8IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH0+XG5cbiAgICAvLyBTZWUgc3JjL3YyL2NvbW1vbi9Db250ZXh0LnRzIGZvciB2YWxpZCBjb250ZXh0c1xuICAgIGNvbnRleHQ6IHN0cmluZztcblxuICAgIC8vIEFycmF5IG9mIHJ1bGVzIHRoYXQgbXVzdCBwYXNzIHRvIGFsbG93IHRoaXMgdmFsaWRhdGUgdG8gcnVuIC0gdGhleSBtdXN0IGhhdmUgdGhlIHNhbWUgY29udGV4dCBwcm9wZXJ0eVxuICAgIGRlcGVuZGVuY2llcz86IHN0cmluZ1tdXG5cbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgPT4gUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSB8IG51bGxcblxuICAgIGVuYWJsZWQ/OiBib29sZWFuXG59XG5cblxuZXhwb3J0IHR5cGUgUmVwb3J0ID0ge1xuICAgIHJlc3VsdHM6IFJ1bGVEZXRhaWxzW10sXG4gICAgbnVtRXhlY3V0ZWQ6IG51bWJlcixcbiAgICBydWxlVGltZTogbnVtYmVyLFxuICAgIC8vIFRoaXMgbWF5IGJlIHVuZGVmaW5lZCBmb3IgYSBmaWx0ZXJlZCByZXBvcnRcbiAgICB0b3RhbFRpbWU/OiBudW1iZXIsXG4gICAgbmxzPzoge1xuICAgICAgICBbcnVsZUlkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbcmVhc29uSWQ6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBObHNNYXAgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW11cbn1cblxuZXhwb3J0IHR5cGUgSGVscE1hcCA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFbmdpbmUge1xuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gYSBzY2FuIG9uIGEgZG9jdW1lbnQgb3Igc3VidHJlZVxuICAgICAqIEBwYXJhbSBydWxlc2V0SWRzIEFycmF5IG9mIHJ1bGVzZXQgaWRzIG9mIHJ1bGVzZXRzIHRvIHVzZSBmb3IgdGhpcyBzY2FuXG4gICAgICogQHBhcmFtIHJvb3QgRG9jdW1lbnQgb3Igc3VidHJlZSB0byBzY2FuXG4gICAgICovXG4gICAgcnVuKHJvb3Q6IERvY3VtZW50IHwgTm9kZSwgb3B0aW9ucz86IHt9KSA6IFByb21pc2U8UmVwb3J0PjtcblxuICAgIGVuYWJsZVJ1bGVzKHJ1bGVJZHM6IHN0cmluZ1tdKTtcblxuICAgIGdldFJ1bGUocnVsZUlkOiBzdHJpbmcpOiBSdWxlO1xuXG4gICAgZ2V0UnVsZXNJZHMoKSA6IHN0cmluZ1tdO1xuXG4gICAgZ2V0TWVzc2FnZShydWxlSWQ6IHN0cmluZywgcnVsZUlkeDogbnVtYmVyIHwgc3RyaW5nLCBtc2dBcmdzPzogc3RyaW5nW10pOiBzdHJpbmc7XG5cbiAgICBnZXRIZWxwKHJ1bGVJZDogc3RyaW5nLCBydWxlSWR4OiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmc7XG5cbiAgICBhZGRSdWxlcyhydWxlOiBSdWxlW10pO1xuXG4gICAgYWRkUnVsZShydWxlOiBSdWxlKTtcblxuICAgIGFkZE5sc01hcChtYXA6IE5sc01hcCk7XG5cbiAgICBhZGRIZWxwTWFwKG1hcDogTmxzTWFwKTtcbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IElFbmdpbmUsIGVSdWxlUG9saWN5LCBSZXBvcnQsIGVSdWxlQ2F0ZWdvcnksIGVUb29sa2l0TGV2ZWwsIGVSdWxlc2V0VHlwZSwgUnVsZSBhcyBSdWxlVjIgfSBmcm9tIFwiLi4vLi4vdjIvYXBpL0lFbmdpbmVcIjtcbmltcG9ydCB7IFJ1bGUgYXMgUnVsZVY0IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRW5naW5lIH0gZnJvbSBcIi4uLy4uL3YyL2NvbW1vbi9FbmdpbmVcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBTdHlsZU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9zdHlsZS9TdHlsZU1hcHBlclwiO1xuaW1wb3J0IHsgYTExeVJ1bGVzZXRzIH0gZnJvbSBcIi4uL3J1bGVzZXRzXCI7XG5pbXBvcnQgKiBhcyBjaGVja1J1bGVzVjQgZnJvbSBcIi4uL3J1bGVzXCI7XG5cbmxldCBjaGVja1J1bGVzID0gW107XG5sZXQgY2hlY2tObHMgPSB7fTtcbmxldCBjaGVja0hlbHAgPSB7fTtcblxuZnVuY3Rpb24gX2luaXRpYWxpemUoKSB7XG4gICAgY29uc3QgbGFuZ3MgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEVuZ2luZS5nZXRMYW5ndWFnZXMoKSkpO1xuICAgIC8vIERlZmF1bHQgbGFuZyB0byBlbi1VUyBpZiBub3RoaW5nIGVsc2Ugc3BlY2lmaWVkIGlzIGZvdW5kXG4gICAgbGFuZ3MucHVzaChcImVuLVVTXCIpO1xuICAgIC8vIFByb2Nlc3MgVjQgcnVsZXMgaW50byB0aGUgVjIgZm9ybWF0XG4gICAgZm9yIChsZXQgcnVsZW5hbWUgaW4gY2hlY2tSdWxlc1Y0KSB7XG4gICAgICAgIC8vIENvbnZlcnQgcnVsZVxuICAgICAgICBsZXQgdjRSdWxlOiBSdWxlVjQgPSBjaGVja1J1bGVzVjRbcnVsZW5hbWVdO1xuICAgICAgICBjaGVja1J1bGVzLnB1c2godjRSdWxlKTtcbiAgICAgICAgLy8gR28gYmFja3dhcmRzIGJlY2F1c2UgdGhlIGZpcnN0IGxhbmcgaXMgdGhlIHByZWZlcnJlZCwgc29cbiAgICAgICAgLy8gZWFybGllciBsYW5ndWFnZXMgd2lsbCBvdmVycmlkZSBsYXRlciBsYW5ndWFnZXNcbiAgICAgICAgZm9yIChsZXQgaWR4PWxhbmdzLmxlbmd0aC0xOyBpZHggPj0wOyAtLWlkeCkge1xuICAgICAgICAgICAgY29uc3QgbGFuZ0lkID0gbGFuZ3NbaWR4XTtcbiAgICAgICAgICAgIGlmIChsYW5nSWQgaW4gdjRSdWxlLm1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tObHNbdjRSdWxlLmlkXSA9IHY0UnVsZS5tZXNzYWdlc1tsYW5nSWRdO1xuICAgICAgICAgICAgICAgIGNoZWNrTmxzW3Y0UnVsZS5pZF1bMF0gPSBjaGVja05sc1t2NFJ1bGUuaWRdLmdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxhbmdJZCBpbiB2NFJ1bGUuaGVscCkge1xuICAgICAgICAgICAgICAgIGNoZWNrSGVscFt2NFJ1bGUuaWRdID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWFzb25JZCBpbiB2NFJ1bGUuaGVscFtsYW5nSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrSGVscFt2NFJ1bGUuaWRdW3JlYXNvbklkXSA9IGAvJHtsYW5nSWR9LyR7djRSdWxlLmhlbHBbbGFuZ0lkXVtyZWFzb25JZF19YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hlY2tObHNbdjRSdWxlLmlkXVswXSA9IGNoZWNrTmxzW3Y0UnVsZS5pZF0uZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29udmVydCBSU1xuICAgICAgICBmb3IgKGNvbnN0IHJzU2VjdGlvbiBvZiB2NFJ1bGUucnVsZXNldHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcnMgb2YgYTExeVJ1bGVzZXRzIGFzIFJ1bGVzZXRbXSkge1xuICAgICAgICAgICAgICAgIGxldCBjaGVja1JzSWRzIDogc3RyaW5nW10gPSB0eXBlb2YgcnNTZWN0aW9uLmlkID09PSBcInN0cmluZ1wiID8gW3JzU2VjdGlvbi5pZF0gOiByc1NlY3Rpb24uaWQ7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrUnNJZHMuaW5jbHVkZXMocnMuaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3Agb2YgcnMuY2hlY2twb2ludHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGVja0NQSWRzIDogc3RyaW5nW10gPSB0eXBlb2YgcnNTZWN0aW9uLm51bSA9PT0gXCJzdHJpbmdcIiA/IFtyc1NlY3Rpb24ubnVtXSA6IHJzU2VjdGlvbi5udW07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDUElkcy5pbmNsdWRlcyhjcC5udW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AucnVsZXMgPSBjcC5ydWxlcyB8fCBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLnJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdjRSdWxlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogcnNTZWN0aW9uLmxldmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sa2l0TGV2ZWw6IHJzU2VjdGlvbi50b29sa2l0TGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuX2luaXRpYWxpemUoKTtcblxuZXhwb3J0IHR5cGUgUnVsZXNldCA9IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjYXRlZ29yeTogZVJ1bGVDYXRlZ29yeSxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIHR5cGU/OiBlUnVsZXNldFR5cGUsXG4gICAgY2hlY2twb2ludHM6IEFycmF5PHtcbiAgICAgICAgbnVtOiBzdHJpbmcsXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC10b29scy9ibG9iL21haW4vc3JjL2RhdGEvc2MtdXJscy5qc29uXG4gICAgICAgIHNjSWQ/OiBzdHJpbmcsXG4gICAgICAgIC8vIEpDSDogYWRkIG5hbWUgb2YgY2hlY2twb2ludCBhbmQgc3VtbWFyeSBkZXNjcmlwdGlvblxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHdjYWdMZXZlbDogc3RyaW5nLFxuICAgICAgICBzdW1tYXJ5OiBzdHJpbmcsXG4gICAgICAgIHJ1bGVzPzogQXJyYXk8eyBpZDogc3RyaW5nLCBsZXZlbDogZVJ1bGVQb2xpY3ksIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbCB9PlxuICAgIH0+XG59XG5cbmV4cG9ydCBjbGFzcyBDaGVja2VyIHtcbiAgICBlbmdpbmU6IElFbmdpbmU7XG4gICAgcnVsZXNldHM6IFJ1bGVzZXRbXSA9IFtdO1xuICAgIHJ1bGVzZXRJZHM6IHN0cmluZ1tdID0gW107XG4gICAgcnVsZXNldFJ1bGVzOiB7IFtyc0lkOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gICAgcnVsZUxldmVscyA6IHsgW3J1bGVJZDogc3RyaW5nXTogeyBbcnNJZDogc3RyaW5nXSA6IGVSdWxlUG9saWN5IH19ID0ge307XG4gICAgcnVsZUNhdGVnb3J5IDogeyBbcnVsZUlkOiBzdHJpbmddOiB7IFtyc0lkOiBzdHJpbmddIDogZVJ1bGVDYXRlZ29yeSB9fSA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGxldCBlbmdpbmUgPSB0aGlzLmVuZ2luZSA9IG5ldyBFbmdpbmUoKTtcblxuICAgICAgICBlbmdpbmUuYWRkTWFwcGVyKG5ldyBBUklBTWFwcGVyKCkpO1xuICAgICAgICBlbmdpbmUuYWRkTWFwcGVyKG5ldyBTdHlsZU1hcHBlcigpKTtcblxuICAgICAgICBlbmdpbmUuYWRkUnVsZXMoY2hlY2tSdWxlcyk7XG4gICAgICAgIGVuZ2luZS5hZGRObHNNYXAoY2hlY2tObHMpO1xuICAgICAgICBlbmdpbmUuYWRkSGVscE1hcChjaGVja0hlbHApO1xuXG4gICAgICAgIGZvciAoY29uc3QgcnMgb2YgYTExeVJ1bGVzZXRzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFJ1bGVzZXQocnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkUnVsZXNldChyczogUnVsZXNldCkge1xuICAgICAgICB0aGlzLnJ1bGVzZXRzLnB1c2gocnMpO1xuICAgICAgICB0aGlzLnJ1bGVzZXRJZHMucHVzaChycy5pZCk7XG4gICAgICAgIGNvbnN0IHJ1bGVJZHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjcCBvZiBycy5jaGVja3BvaW50cykge1xuICAgICAgICAgICAgY3AucnVsZXMgPSBjcC5ydWxlcyB8fCBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBjcC5ydWxlcykge1xuICAgICAgICAgICAgICAgIHJ1bGVJZHMucHVzaChydWxlLmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF0gPSB0aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF0gfHwge307XG4gICAgICAgICAgICAgICAgdGhpcy5ydWxlTGV2ZWxzW3J1bGUuaWRdW3JzLmlkXSA9IHJ1bGUubGV2ZWw7XG4gICAgICAgICAgICAgICAgdGhpcy5ydWxlQ2F0ZWdvcnlbcnVsZS5pZF0gPSB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXVtycy5pZF0gPSBycy5jYXRlZ29yeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJ1bGVzZXRSdWxlc1tycy5pZF0gPSBydWxlSWRzO1xuICAgIH1cblxuICAgIGNoZWNrKG5vZGU6IE5vZGUgfCBEb2N1bWVudCwgcnNJZHM/OiBzdHJpbmcgfCBzdHJpbmdbXSkgOiBQcm9taXNlPFJlcG9ydD4ge1xuICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggcnVsZXMgdG8gcnVuXG4gICAgICAgIGxldCBydWxlSWRzIDogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAvLyBGaXggdGhlIGlucHV0XG4gICAgICAgIGlmICghcnNJZHMpIHtcbiAgICAgICAgICAgIHJ1bGVJZHMgPSB0aGlzLmVuZ2luZS5nZXRSdWxlc0lkcygpO1xuICAgICAgICB9IGVsc2V7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJzSWRzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgcnNJZHMgPSBbcnNJZHNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzSWQgb2YgcnNJZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnNJZCBpbiB0aGlzLnJ1bGVzZXRSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICBydWxlSWRzID0gcnVsZUlkcy5jb25jYXQodGhpcy5ydWxlc2V0UnVsZXNbcnNJZF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW5naW5lLmVuYWJsZVJ1bGVzKHJ1bGVJZHMpO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcmVwb3J0IGxldmVsc1xuICAgICAgICBsZXQgbXlUaGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5naW5lLnJ1bihub2RlKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcG9ydCkge1xuICAgICAgICAgICAgICAgIHJlcG9ydC5ubHMgPSB7fVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVwb3J0LnJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5ydWxlSWQgaW4gY2hlY2tObHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydC5ubHNbcmVzdWx0LnJ1bGVJZF0gPSByZXBvcnQubmxzW3Jlc3VsdC5ydWxlSWRdIHx8IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBjaGVja05sc1tyZXN1bHQucnVsZUlkXVswXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZWFzb25JZCBpbiBjaGVja05sc1tyZXN1bHQucnVsZUlkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydC5ubHNbcmVzdWx0LnJ1bGVJZF1bcmVzdWx0LnJlYXNvbklkXSA9IGNoZWNrTmxzW3Jlc3VsdC5ydWxlSWRdW3Jlc3VsdC5yZWFzb25JZF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlWzBdID0gbXlUaGlzLmdldExldmVsKHJzSWRzIGFzIHN0cmluZ1tdLCByZXN1bHQucnVsZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNhdGVnb3J5ID0gbXlUaGlzLmdldENhdGVnb3J5KHJzSWRzIGFzIHN0cmluZ1tdLCByZXN1bHQucnVsZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdC5wYXRoLmNzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcG9ydDtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldExldmVsKHJzSWRzOiBzdHJpbmdbXSwgcnVsZUlkOiBzdHJpbmcpIDogZVJ1bGVQb2xpY3kge1xuICAgICAgICBpZiAoIXJzSWRzKSByZXR1cm4gZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT047XG4gICAgICAgIGxldCByc0luZm8gPSB0aGlzLnJ1bGVMZXZlbHNbcnVsZUlkXTtcbiAgICAgICAgbGV0IHJldFZhbCA9IG51bGw7XG4gICAgICAgIGlmIChyc0lkcykge1xuICAgICAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZUxldmVscykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdWxlIHRyaWdnZXJlZCBmb3Igd2hpY2ggd2UgaGF2ZSBubyBydWxlIGxldmVsIGluZm9ybWF0aW9uOiBcIitydWxlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCByc0lkIG9mIHJzSWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJzSWQgaW4gcnNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyc0luZm9bcnNJZF0gPT09IGVSdWxlUG9saWN5LlZJT0xBVElPTikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuVklPTEFUSU9OO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJzSW5mb1tyc0lkXSA9PT0gZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04gJiYgcmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LklORk9STUFUSU9OO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJ1bGUgdHJpZ2dlcmVkIGZvciB3aGljaCB3ZSBoYXZlIG5vIHJ1bGUgbGV2ZWwgaW5mb3JtYXRpb246IFwiK3J1bGVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBnZXRDYXRlZ29yeShyc0lkczogc3RyaW5nW10sIHJ1bGVJZDogc3RyaW5nKSA6IGVSdWxlQ2F0ZWdvcnkge1xuICAgICAgICBsZXQgcnNJbmZvID0gdGhpcy5ydWxlQ2F0ZWdvcnlbcnVsZUlkXTtcbiAgICAgICAgbGV0IHJldFZhbCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZUNhdGVnb3J5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGVSdWxlQ2F0ZWdvcnkuT1RIRVI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyc0lkcykge1xuICAgICAgICAgICAgcnNJZHMgPSB0aGlzLnJ1bGVzZXRJZHM7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByc0lkIG9mIHJzSWRzKSB7XG4gICAgICAgICAgICBpZiAocnNJZCBpbiByc0luZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnNJbmZvW3JzSWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlUnVsZUNhdGVnb3J5Lk9USEVSO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBhX3RhcmdldF93YXJuaW5nOiBSdWxlID0ge1xuICAgIGlkOiBcImFfdGFyZ2V0X3dhcm5pbmdcIixcbiAgICBjb250ZXh0OiBcImRvbTphW3RhcmdldF0sZG9tOmFyZWFbdGFyZ2V0XSxkb206YmFzZVt0YXJnZXRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQV9UYXJnZXRBbmRUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYV90YXJnZXRfd2FybmluZy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhX3RhcmdldF93YXJuaW5nLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYV90YXJnZXRfd2FybmluZy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJVc2VycyBzaG91bGQgYmUgd2FybmVkIGluIGFkdmFuY2UgaWYgdGhlaXIgaW5wdXQgYWN0aW9uIHdpbGwgb3BlbiBhIG5ldyB3aW5kb3cgb3Igb3RoZXJ3aXNlIGNoYW5nZSB0aGVpciBjb250ZXh0XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiSW5mb3JtIHRoZSB1c2VyIHdoZW4gdGhlaXIgaW5wdXQgYWN0aW9uIHdpbGwgb3BlbiBhIG5ldyB3aW5kb3cgb3Igb3RoZXJ3aXNlIGNoYW5nZSB0aGVpciBjb250ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMy4yLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBza2lwIHRoZSBydWxlIGlmIGl0J3MgQVQgaGlkZGVuIGFuZCBub3QgdGFiYmFibGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSAmJiAhUlBUVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtV2luVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJuZXcgd2luZG93XCIsIFwibmV3IHRhYlwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0U3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdFN0ciA9PSBcIl9wYXJlbnRcIiB8fCB0U3RyID09IFwiX3NlbGZcIiB8fCB0U3RyID09IFwiX3RvcFwiIHx8IFJQVFV0aWwuZ2V0RnJhbWVCeU5hbWUocnVsZUNvbnRleHQsdFN0cikgIT0gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vIE5hbWUgaXMgbm90IHBhcnQgb2YgdGhpcyBmcmFtZXNldCDigJMgbXVzdCBoYXZlIHBvdGVudGlhbCB0byBjcmVhdGUgbmV3IHdpbmRvdz9cbiAgICAgICAgICAgIC8vIFNlZSBpZiBhIG5ldyB3aW5kb3cgaXMgbWVudGlvbmVkXG4gICAgICAgICAgICBsZXQgdGV4dFN0ciA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICB0ZXh0U3RyICs9IFwiIFwiICsgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgcGFyYW1zLnBhcmFtV2luVGV4dC52YWx1ZS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBpZiAodGV4dFN0ci5pbmRleE9mKHBhcmFtcy5wYXJhbVdpblRleHQudmFsdWVbaV0pICE9IC0xKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGFfdGV4dF9wdXJwb3NlOiBSdWxlID0ge1xuICAgIGlkOiBcImFfdGV4dF9wdXJwb3NlXCIsXG4gICAgLy8gZG9jLWJpYmxpb3JlZiBpcyBhIGxpbmtcbiAgICBjb250ZXh0OiBcImFyaWE6bGluayxhcmlhOmRvYy1iaWJsaW9yZWZcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9BX0hhc1RleHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkh5cGVybGlua3MgbXVzdCBoYXZlIGEgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGVpciBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkh5cGVybGluayBoYXMgYSBkZXNjcmlwdGlvbiBvZiBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJIeXBlcmxpbmsgaGFzIG5vIGxpbmsgdGV4dCwgbGFiZWwgb3IgaW1hZ2Ugd2l0aCBhIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIyLjQuNFwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogXCJjNDg3YWVcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFJ1bGUgb25seSBwYXNzZXMgaWYgYW4gZWxlbWVudCBoYXMgaW5uZXIgY29udGVudCxcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBvbmx5IGhpZGRlbiBjb250ZW50IHVuZGVyIHRoZSB0aGUgZWxlbWVudCBpdCBpcyBhIHZpb2xhdGlvblxuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIEFSSUFNYXBwZXIuY29tcHV0ZU5hbWUocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgICAgICB8fCBSUFRVdGlsLm5vblRhYmFibGVDaGlsZENoZWNrKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBhcHBsZXRfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcHBsZXRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFwcGxldFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0FwcGxldF9IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGFwcGxldD4gZWxlbWVudHMgbXVzdCBwcm92aWRlIGFuICdhbHQnIGF0dHJpYnV0ZSBhbmQgYW4gYWx0ZXJuYXRpdmUgZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQW4gPGFwcGxldD4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuICdhbHQnIGF0dHJpYnV0ZSB0aGF0IHByb3ZpZGVzIGEgc2hvcnQgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2FsdCcgYXR0cmlidXRlIHZhbHVlIGZvciBhbiA8YXBwbGV0PiBlbGVtZW50IGR1cGxpY2F0ZXMgdGhlICdjb2RlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiQW4gPGFwcGxldD4gZWxlbWVudCBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0LCBidXQgZG9lcyBub3QgcHJvdmlkZSBpbm5lciBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMS4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmICghUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNvZGVcIikgJiYgYWx0ID09IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvZGVcIikudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghUlBUVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGFwcGxpY2F0aW9uX2NvbnRlbnRfYWNjZXNzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YXBwbGljYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXBwbGljYXRpb25fUm9sZV9UZXh0XCI6IHtcbiAgICAgICAgICAgIDA6IGBIQUFDX0FwcGxpY2F0aW9uX1JvbGVfVGV4dC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgMDogYGFwcGxpY2F0aW9uX2NvbnRlbnRfYWNjZXNzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTm9uLWRlY29yYXRpdmUgc3RhdGljIHRleHQgYW5kIGltYWdlIGNvbnRlbnQgd2l0aGluIGFuIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBiZSBhY2Nlc3NpYmxlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIG5vbi1kZWNvcmF0aXZlIHN0YXRpYyB0ZXh0IGFuZCBpbWFnZSBjb250ZW50IHdpdGhpbiBhbiBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIGFyZSBhY2Nlc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMi4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBydWxlQ29udGV4dC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZHJlbltpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MoY2hpbGRyZW5baV0sIFwiZG9jdW1lbnRcIikgfHwgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MoY2hpbGRyZW5baV0sIFwiYXJ0aWNsZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gY2hpbGRyZW5baV0ubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGFyZWFfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmVhX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTphcmVhXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQXJlYV9IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyZWFfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmVhX2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJlYV9hbHRfZXhpc3RzLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxhcmVhPiBlbGVtZW50cyBpbiBhbiBpbWFnZSBtYXAgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCI8YXJlYT4gZWxlbWVudCBpbiBhbiBpbWFnZSBtYXAgaGFzIG5vIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMS4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbn1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBnZXREZXByZWNhdGVkQXJpYVJvbGVzLCBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMsIGdldFJvbGVzVW5kZWZpbmVkQnlBcmlhfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29sdW1uaGVhZGVyLCBhcmlhOmZvcm0sIGFyaWE6aGVhZGluZywgYXJpYTpyb3doZWFkZXIsIGFyaWE6dGFibGUsIGRvYy1iYWNrbGluaywgZG9jLWJpYmxpb2VudHJ5LCBkb2MtYmlibGlvcmVmLCBkb2MtZ2xvc3NyZWYsIGRvYy1ub3RlcmVmLCBkb2MtcGFnZWJyZWFrXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIjogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiQW4gYWNjZXNzaWJsZSBuYW1lIGlzIHByb3ZpZGVkIGZvciB0aGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZVwiOiBcIkVsZW1lbnQgPHswfT4gd2l0aCBcXFwiezF9XFxcIiByb2xlIGhhcyBubyBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyB3aXRoIGNlcnRhaW4gcm9sZXMgc2hvdWxkIGhhdmUgYWNjZXNzaWJsZSBuYW1lc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIHdoZW4gdGFibGUgZWxlbWVudCB3aXRoIGEgY2FwdGlvbiBhcyBmaXJzdCBjaGlsZFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gJ3RhYmxlJyBcbiAgICAgICAgICAgICYmIHJ1bGVDb250ZXh0LmZpcnN0RWxlbWVudENoaWxkICYmIHJ1bGVDb250ZXh0LmZpcnN0RWxlbWVudENoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjYXB0aW9uJ1xuICAgICAgICAgICAgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQudGV4dENvbnRlbnQgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuXG4gICAgICAgIGNvbnN0IGludmFsaWRSb2xlcyA9IGdldFJvbGVzVW5kZWZpbmVkQnlBcmlhKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGludmFsaWRSb2xlcyAmJiBpbnZhbGlkUm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRSb2xlcyA9IGdldERlcHJlY2F0ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZFJvbGVzICYmIGRlcHJlY2F0ZWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXMgJiYgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKCBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA9PT0gMCAmJiAhUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSkge1xuICAgICAgICAgICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAvL3doZW4gbXVsdGlwbGUgcm9sZXMgc3BlY2lmaWVkLCBvbmx5IHRoZSBmaXJzdCB2YWxpZCByb2xlIGlzIGFwcGxpZWQsIGFuZCB0aGUgb3RoZXJzIGp1c3QgYXMgZmFsbGJhY2tzXG4gICAgICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbMF1dICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV0ubmFtZUZyb20gJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzWzBdXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKSB7XG4gICAgICAgICAgICAgICAgLy9pZiAoIVJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAvL2V4Y2x1ZGUgdGhlIGhpZGRlbiB0ZXh0P1xuICAgICAgICAgICAgICAgIGlmICghUlBUVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZVwiLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcm9sZXNbMF1dKTsgIFxuICAgICAgICAgICAgfSBlbHNlIFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lXCIsIFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCByb2xlc1swXV0pOyAgIFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtYWN0aXZlZGVzY2VuZGFudF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0ludmFsaWRUYWJpbmRleEZvckFjdGl2ZWRlc2NlbmRhbnRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHswfT4gZWxlbWVudCB1c2luZyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBzZXQgdG8gXFxcInsxfVxcXCIgaXMgbm90IHRhYmJhYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudCB1c2luZyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBzaG91bGQgYmUgdGFiYmFibGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBSdWxlIG5vdCBzdXBwb3J0ZWQgb24gbW9iaWxlXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjbGFzc1wiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKS5zdWJzdHJpbmcoMCwgMykgPT0gXCJtYmxcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIGJ5IGRpc2FibGVkIGh0bWw1IGF0dHJpYnV0ZSBvciBhcmlhLWRpc2FibGVkOlxuICAgICAgICAvLyAgMS4gSW4gdGhlIGNhc2UgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGEgZGlzYWJsZWQgYXR0cmlidXRlIGFuZCB0aGUgZWxlbWVudCBzdXBwb3J0cyBpdCwgd2UgbWFyayB0aGlzIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAvLyAgMi4gSW4gdGhlIGNhc2UgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGEgYXJpYS1kaXNhYmxlZCBhdHRyaWJ1dGUgdGhlbiwgd2UgbWFyayB0aGlzIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAvLyBGb3IgYm90aCBvZiB0aGUgY2FzZXMgYWJvdmUgd2UgZG8gbm90IG5lZWQgdG8gcGVyZm9ybSBhbnkgZnVydGhlciBjaGVja3MsIGFzIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIGluIHNvbWUgZm9ybSBvciBhbm90aGVyLlxuICAgICAgICBpZiAoUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiB0aGUgYXR0cmlidXRlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIGlzIHZhbGlkIGZvciB0aGUgcm9sZSBvZiB0aGUgZWxlbWVudFxuICAgICAgICBcblxuICAgICAgICAvLyBJZiB0aGUgdGFiaW5kZXggYXR0cmlidXRlIGlzIHByb3ZpZGVkIHRoZW4gdmVyaWZ5IHRoYXQgaXQgaXMgMCBvciAtMVxuICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIHBhc3MgaWYgb25lIG9mIHRoZSBjaGlsZHJlbiBpcyB0YWJiYWJsZS4gaW4gdGhpcyBjYXNlLCB0aGUgdGFiIHdpbGwgc3RvcCBvbiB0aGUgZmlyc3QgdGFiYmFibGUgZWxlbWVudFxuICAgICAgICBpZiAoIXBhc3NlZCkgXG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmdldFRhYmJhYmxlQ2hpbGRyZW4ocnVsZUNvbnRleHQpID4gMDtcblxuICAgICAgICAvLyBCdWlsZCBhcnJheSBmb3Igbm9kZSB0b2tlblxuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMS5wdXNoKG5vZGVOYW1lKTtcblxuICAgICAgICAvLyBCdWlsZCBhcnJheSBmb3IgaWQgcmVmZXJlbmNlZCBieSBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIikuc3BsaXQoXCIgXCIpLmpvaW4oXCIsIFwiKSk7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtYWN0aXZlZGVzY2VuZGFudF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQWN0aXZlRGVzY2VuZGFudENoZWNrXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIkZhaWxfNFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgcHJvcGVydHkgaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIHByb3BlcnR5IHJlZmVyZW5jZXMgYSBoaWRkZW4gbm9kZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJFbGVtZW50IGlzIG5vdCBhIGNvbWJvYm94LCBhbmQgdGhlIHJlZmVyZW5jZWQgYWN0aXZlLWRlc2NlbmRhbnQgZWxlbWVudCBpcyBub3QgYSB2YWxpZCBkZXNjZW5kYW50XCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIkVsZW1lbnQgaXMgYSBjb21ib2JveCwgYW5kIHRoZSByZWZlcmVuY2VkIGFjdGl2ZS1kZXNjZW5kYW50IGVsZW1lbnQgaXMgbm90IGNvbnRyb2xsZWQgYnkgdGhpcyBjb21wb25lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgcHJvcGVydHkgbXVzdCByZWZlcmVuY2UgdGhlICdpZCcgb2YgYSBub24tZW1wdHksIG5vbi1oaWRkZW4gYWN0aXZlIGNoaWxkIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gY29tYm9ib3ggYWN0aXZlIGRlc2NlbmRhbnRzIGhhbmRsZWQgYnkgJ2NvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50J1xuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiY29tYm9ib3hcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRlc2NlbmRhbnRfaWQgPSBSUFRVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICAvLyBQT0YxOiBUaGUgYXR0cmlidXRlIGlzIGVtcHR5XG4gICAgICAgIGlmICghZGVzY2VuZGFudF9pZCB8fCBkZXNjZW5kYW50X2lkLnRyaW0oKSA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRlc2NlbmRhbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgZGVzY2VuZGFudF9pZC50cmltKCkpO1xuICAgICAgICBpZiAoIWRlc2NlbmRhbnQgfHwgRE9NVXRpbC5zYW1lTm9kZShkZXNjZW5kYW50X2lkLCBydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIC8vIFRoZSByZWZlcmVuY2VkIGVsZW1lbnQgZG9lc24ndCBleGlzdC4gV2UgbGV0IDEwNzcgdG8gdHJpZ2dlciB0aGUgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgIC8vIFBPRjI6IGFyaWEtYWN0aXZlZGVzY2VuZGFudCByZWZlcmVuY2VzIGEgaGlkZGVuIG5vZGVcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDEuIFRoZSB2YWx1ZSBvZiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgcmVmZXJzIHRvIGFuIGVsZW1lbnQgdGhhdCBpcyBlaXRoZXIgYSBkZXNjZW5kYW50IG9mIFxuICAgICAgICAvLyB0aGUgZWxlbWVudCB3aXRoIERPTSBmb2N1c1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuY29udGFpbnMoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwb2ZJZCA9IDI7XG5cbiAgICAgICAgLy8gb3IgaXMgYSBsb2dpY2FsIGRlc2NlbmRhbnQgYXMgaW5kaWNhdGVkIGJ5IHRoZSBhcmlhLW93bnMgYXR0cmlidXRlLlxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICBsZXQgb3duZWRfaWRzID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3duZWRfaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG93bmVkX2VsZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBvd25lZF9pZHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChvd25lZF9lbGUgJiYgIURPTVV0aWwuc2FtZU5vZGUob3duZWRfZWxlLCBydWxlQ29udGV4dCkgJiYgb3duZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBUaGUgZWxlbWVudCB3aXRoIERPTSBmb2N1cyBpcyBhIHRleHRib3ggd2l0aCBhcmlhLWNvbnRyb2xzIHJlZmVycmluZyB0byBhbiBlbGVtZW50IHRoYXQgXG4gICAgICAgIC8vICBzdXBwb3J0cyBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQsIGFuZCB0aGUgdmFsdWUgb2YgYXJpYS1hY3RpdmVkZXNjZW5kYW50IHNwZWNpZmllZCBmb3IgdGhlIFxuICAgICAgICAvLyAgdGV4dGJveCByZWZlcnMgdG8gZWl0aGVyIGEgZGVzY2VuZGFudCBvZiB0aGUgZWxlbWVudCBjb250cm9sbGVkIGJ5IHRoZSB0ZXh0Ym94IG9yIGlzIGEgbG9naWNhbCBcbiAgICAgICAgLy8gIGRlc2NlbmRhbnQgb2YgdGhhdCBjb250cm9sbGVkIGVsZW1lbnQgYXMgaW5kaWNhdGVkIGJ5IHRoZSBhcmlhLW93bnMgYXR0cmlidXRlLlxuICAgICAgICAvL1xuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgICAgICBwb2ZJZCA9IDM7XG4gICAgICAgICAgICBsZXQgY29udHJvbGxlZF9pZHMgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbGxlZF9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udHJvbGxlZF9lbGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgY29udHJvbGxlZF9pZHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVkX2VsZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShjb250cm9sbGVkX2VsZSwgcnVsZUNvbnRleHQpICYmIGNvbnRyb2xsZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZWRfZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duc19pZHMgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udHJvbGxlZF9lbGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnRyaW0oKSkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG93bnNfaWRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIG93bnNfaWRzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZF9lbGUgJiYgIURPTVV0aWwuc2FtZU5vZGUob3duZWRfZWxlLCBydWxlQ29udGV4dCkgJiYgb3duZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9GMzogSSdtIG5vdCBhIGNvbWJvYm94LCBhbmQgdGhlIHJlZmVyZW5jZWQgYWN0aXZlLWRlc2NlbmRhbnQgaXMgbm90IGEgZGVzY2VuZGFudCBhbmQgbm90IG93bmVkIGJ5IHRoZSBlbGVtZW50IFxuICAgICAgICAvLyB0aGF0IHJlZmVyZW5jZWQgaXQuXG4gICAgICAgIGlmIChwb2ZJZCA9PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFwcGxpY2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUFwcGxpY2F0aW9uTGFuZG1hcmtzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcHBsaWNhdGlvblwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gUlBUVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFwcGxpY2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9BcHBsaWNhdGlvbkxhbmRtYXJrTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhbiBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIG11c3QgaGF2ZSBhbiBhY2Nlc3NpYmxlIG5hbWUgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgLy8gcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTphcnRpY2xlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUFydGljbGVSb2xlc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiYXJ0aWNsZVxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImFydGljbGVcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFydGljbGVcIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gUlBUVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCA9PT0gXCJcIiB8fCAhKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDE7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9WYWxpZFByb3BlcnR5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyaWFfYXR0cmlidXRlX2FsbG93ZWQuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIGF0dHJpYnV0ZXMgbXVzdCBiZSB2YWxpZCBmb3IgdGhlIGVsZW1lbnQncyByb2xlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBhdHRyaWJ1dGUocykgJ3swfScgcmVmZXJlbmNlZCBieSB0aGUgZWxlbWVudCA8ezF9PiBpcyBub3QgYSB2YWxpZCBBUklBIHN0YXRlIG9yIHByb3BlcnR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNWY5OWE3XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgXG4gICAgICAgIC8vIFRoaXMgZ2V0cyBhbGwgZWxlbWVudHMgd2l0aCBhdHRyaWJ1dGVzIHNvIHdlIHN0aWxsIGhhdmUgc29tZVxuICAgICAgICAvLyBPdXQgb2YgU2NvcGUgc2luY2Ugbm90IGFsbCBhdHRyaWJ1dGVzIGFyZSBhcmlhIFxuXG4gICAgICAgIGlmIChjb250ZXh0QXR0cmlidXRlcykge1xuICAgICAgICAgICAgbGV0IHByb3BlcnR5RGF0YVR5cGVzID0gQVJJQURlZmluaXRpb25zLnByb3BlcnR5RGF0YVR5cGVzO1xuICAgICAgICAgICAgbGV0IGZhaWxlZFByb3BlcnRpZXMgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IHRlc3RlZFByb3BlcnRpZXMgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGNvbnRleHRBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3cgd2UganVzdCBoYXZlIGFyaWEgYXR0cmlidXRlcyB3aGljaCBjYW5cbiAgICAgICAgICAgICAgICAgICAgLy8gcGFzcyBvciBmYWlsIGJhc2VkIG9uIHdoZXRoZXIgdGhlcmUgcHJvcGVydHkgaXMgdmFsaWRcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlcyA9IHByb3BlcnR5RGF0YVR5cGVzW2F0dHJOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhVHlwZXMpIHsgLy8gaWYgcHJvcGVydHkgaXMgbm90IGluIHZhbGlkIHByb3BlcnR5IGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmYWlsZWRQcm9wZXJ0aWVzIGNvbW1hIHNlcCBsaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFpbGVkUHJvcGVydGllcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZFByb3BlcnRpZXMgPSBhdHRyTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkUHJvcGVydGllcyA9IGZhaWxlZFByb3BlcnRpZXMgKyBcIiwgXCIgKyBhdHRyTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0ZXN0ZWRQcm9wZXJ0aWVzID09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFpbGVkUHJvcGVydGllcy5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbZmFpbGVkUHJvcGVydGllcywgcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL3JldHVybiBSdWxlUGFzcygxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBKQ0ggLSBwYXNzaW5nIGlzIGJhc2VkIG9uIGFsbCBhdHRyaWJ1dGVzIG5vdCBqdXN0IGFyaWEgYXR0cmlidXRlc1xuICAgICAgICAvLyAgICAgICBsZWFkaW5nIHRvIE9WRVIgQ09VTlRJTkcgc28gbW92ZWQgcGFzcyB1cFxuICAgICAgICAvL3JldHVybiBSdWxlUGFzcygxKTtcbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzLCBnZXRDb25mbGljdEFyaWFBbmRIdG1sQXR0cmlidXRlcyB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2F0dHJpYnV0ZV9jb25mbGljdDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9jb25mbGljdFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1yZXF1aXJlZF0sIGRvbToqW2FyaWEtYXV0b2NvbXBsZXRlXSwgZG9tOipbYXJpYS1yZWFkb25seV0sIGRvbToqW2FyaWEtZGlzYWJsZWRdLCBkb206KlthcmlhLXBsYWNlaG9sZGVyXVwiIFxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1jaGVja2VkXSwgZG9tOipbYXJpYS1oaWRkZW5dLCBkb206KlthcmlhLXZhbHVlbWF4XSwgZG9tOipbYXJpYS12YWx1ZW1pbl0sIGRvbToqW2FyaWEtY29sc3Bhbl1cIlxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1yb3dzcGFuXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfY29uZmxpY3RcIjogXCJhcmlhX2F0dHJpYnV0ZV9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3QuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb25mbGljdFwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBpcyBpbiBjb25mbGljdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gQVJJQSBhdHRyaWJ1dGUgbXVzdCBub3QgY29uZmxpY3Qgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBIVE1MIGF0dHJpYnV0ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIHRoZSBBUklBIGF0dHJpYnV0ZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgICAgICBsZXQgaW52YWxpZEF0dHJpYnV0ZXMgPSBnZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZEF0dHJpYnV0ZXMgJiYgaW52YWxpZEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXMgPSBSUFRVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWFyaWFBdHRyaWJ1dGVzIHx8IGFyaWFBdHRyaWJ1dGVzLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGNvbmZsaWN0QXR0cmlidXRlcyA9IGdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25mbGljdEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9jb25mbGljdFwiLCBbY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydhcmlhQXR0ciddLCBjb25mbGljdEF0dHJpYnV0ZXNbaV1bJ2h0bWxBdHRyJ11dKSk7XG4gICAgICAgICAgICBpZiAoYXJpYUF0dHJpYnV0ZXMuaW5jbHVkZXMoY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydhcmlhQXR0ciddKSlcbiAgICAgICAgICAgICAgICBSUFRVdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QoW2NvbmZsaWN0QXR0cmlidXRlc1tpXVsnYXJpYUF0dHInXV0sIGFyaWFBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7ICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBnZXREZXByZWNhdGVkQXJpYVJvbGVzLCBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX3JvbGVcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9yb2xlX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBBUklBIHJvbGVzIGFuZCBhdHRyaWJ1dGUgYXJlIHVzZWQgcGVyIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX3JvbGVcIjogXCJUaGUgQVJJQSByb2xlIFxcXCJ7MH1cXFwiIGlzIGRlcHJlY2F0ZWQgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIGRlcHJlY2F0ZWQgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX3JvbGVfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIGRlcHJlY2F0ZWQgZm9yIHRoZSByb2xlIFxcXCJ7MX1cXFwiIGluIHRoZSBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJObyBkZXByZWNhdGVkIEFSSUEgcm9sZSBvciBhdHRyaWJ1dGUgc2hvdWxkIGJlIHVzZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjFcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkUm9sZXMgPSBnZXREZXByZWNhdGVkQXJpYVJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRSb2xlcyAmJiBkZXByZWNhdGVkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXByZWNhdGVkUm9sZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoJ2ZhaWxfYXJpYV9yb2xlJywgW2RlcHJlY2F0ZWRSb2xlc1tpXV0pKTsgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXMgJiYgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXByZWNhdGVkQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIFwicm9sZVwiOlwiYW55XCIsIFwiYXR0cmlidXRlXCI6YXJpYUF0dHJzW2ldfVxuICAgICAgICAgICAgICAgIGlmIChkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5yb2xlID09PSAnYW55JylcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoJ2ZhaWxfYXJpYV9hdHRyJywgW2RlcHJlY2F0ZWRBdHRyaWJ1dGVzW2ldLmF0dHJpYnV0ZV0pKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKCdmYWlsX3JvbGVfYXR0cicsIFtkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5hdHRyaWJ1dGUsIGRlcHJlY2F0ZWRBdHRyaWJ1dGVzW2ldLnJvbGVdKSk7XG4gICAgICAgICAgICB9ICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hdHRyaWJ1dGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfRW1wdHlQcm9wZXJ0eVZhbHVlXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIjogXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfZW1wdHlfYXR0cmlidXRlXCI6IFwiVGhlIGVsZW1lbnQgYXR0cmlidXRlKHMpOiAnezB9JyB2YWx1ZSBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIldoZW4gc3BlY2lmeWluZyBhIHJlcXVpcmVkIEFSSUEgYXR0cmlidXRlLCB0aGUgdmFsdWUgbXVzdCBub3QgYmUgZW1wdHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtcIjZhNzI4MVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IFJQVFV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICBsZXQgdGVzdGVkUHJvcGVydGllcyA9IDA7XG5cbiAgICAgICAgbGV0IHJvbGVzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvbGVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBpZiAoZGVzaWduUGF0dGVybnNbcm9sZXNbal1dICYmIFJQVFV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlc1tqXSwgcnVsZUNvbnRleHQpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWlyZWRSb2xlUHJvcHMgPSBSUFRVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZXNbal0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gcmVxdWlyZWRSb2xlUHJvcHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9IHJlcXVpcmVkUm9sZVByb3BzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShyZXF1aXJlZFJvbGVQcm9wc1tpXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLWxhYmVsbGVkYnlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyb2xlc1tpXSA9PSBcInJhZGlvZ3JvdXBcIikgJiYgKGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnRpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDApIGF0dHJOYW1lQXJyLnB1c2goXCJhcmlhLWxhYmVsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkUm9sZVByb3BzW2ldID09IFwiYXJpYS12YWx1ZW5vd1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJvbGVzW2ldID09IFwicHJvZ3Jlc3NiYXJcIikgJiYgKGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLXZhbHVldGV4dFwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkgYXR0ck5hbWVBcnIucHVzaChcImFyaWEtdmFsdWV0ZXh0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSkge1xuICAgICAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IFJQVFV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgbGV0IHBlcm1pdHRlZFJvbGVzID0gW107XG4gICAgICAgICAgICAgICAgcGVybWl0dGVkUm9sZXMucHVzaChyb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgbGV0IGFsbG93ZWRBdHRyaWJ1dGVzID0gUlBUVXRpbC5nZXRBbGxvd2VkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQsIHBlcm1pdHRlZFJvbGVzLCB0YWdQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGFsbG93ZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBhbGxvd2VkQXR0cmlidXRlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBcImFyaWEtY2hlY2tlZFwiIHx8IGF0dHJpYnV0ZSA9PSBcImFyaWEtc2VsZWN0ZWRcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlID09IFwiYXJpYS1leHBhbmRlZFwiIHx8IGF0dHJpYnV0ZSA9PSBcImFyaWEtb3JpZW50YXRpb25cIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlID09IFwiYXJpYS1sZXZlbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWUgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDAgJiYgIWF0dHJOYW1lQXJyLmluY2x1ZGVzKGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyaWJ1dGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0TXNnID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhdHRyTmFtZUFyci5sZW5ndGggPT0gMDtcbiAgICAgICAgcmV0TXNnLnB1c2goYXR0ck5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCBhdHRyTmFtZUFyciwgJycsIHJldE1zZyk7XG4gICAgICAgIGlmICh0ZXN0ZWRQcm9wZXJ0aWVzID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZW1wdHlfYXR0cmlidXRlXCIsIHJldE1zZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZVBvdGVudGlhbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBnZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMsIGdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYXR0cmlidXRlX3JlZHVuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtcmVxdWlyZWRdLCBkb206KlthcmlhLWF1dG9jb21wbGV0ZV0sIGRvbToqW2FyaWEtcmVhZG9ubHldLCBkb206KlthcmlhLWRpc2FibGVkXSwgZG9tOipbYXJpYS1wbGFjZWhvbGRlcl1cIiBcbiAgICAgICAgICAgICsgXCIsIGRvbToqW2FyaWEtY2hlY2tlZF0sIGRvbToqW2FyaWEtaGlkZGVuXSwgZG9tOipbYXJpYS12YWx1ZW1heF0sIGRvbToqW2FyaWEtdmFsdWVtaW5dLCBkb206KlthcmlhLWNvbHNwYW5dXCJcbiAgICAgICAgICAgICsgXCIsIGRvbToqW2FyaWEtcm93c3Bhbl1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JlZHVuZGFudFwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBpcyByZWR1bmRhbnQgd2l0aCB0aGUgSFRNTCBhdHRyaWJ1dGUgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBBUklBIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHVzZWQgd2hlbiB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIHRoZSBBUklBIGF0dHJpYnV0ZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgICAgICBsZXQgaW52YWxpZEF0dHJpYnV0ZXMgPSBnZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZEF0dHJpYnV0ZXMgJiYgaW52YWxpZEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGlmIGNvbmZsaWN0IGFscmVhZHkgcmVwb3J0ZWQsIGlnbm9yZSByZXBvcnRpbmcgb3ZlcmxhcFxuICAgICAgICBsZXQgY29uZmxpY3RBdHRyaWJ1dGVzID0gZ2V0Q29uZmxpY3RBcmlhQW5kSHRtbEF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoY29uZmxpY3RBdHRyaWJ1dGVzICYmIGNvbmZsaWN0QXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRvbUF0dHJpYnV0ZXMgPSBydWxlQ29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgYXJpYUF0dHJzID0gW107XG4gICAgICAgIGxldCBodG1sQXR0cnMgPSBbXTtcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTsgXG4gICAgICAgICAgICAgICAgbGV0IGF0dHJWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gJycpIGF0dHJWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJykgXG4gICAgICAgICAgICAgICAgICAgIGFyaWFBdHRycy5wdXNoKHtuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZX0pO1xuICAgICAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICAgICAgICAgIGh0bWxBdHRycy5wdXNoKHtuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGV4YW1pbmVkSHRtbEF0ck5hbWVzID0gUlBUVXRpbC5nZXRDb25mbGljdE9yT3ZlcmxhcHBpbmdIdG1sQXR0cmlidXRlKGFyaWFBdHRyc1tpXSwgaHRtbEF0dHJzLCAnb3ZlcmxhcHBpbmcnKTtcbiAgICAgICAgICAgIGlmIChleGFtaW5lZEh0bWxBdHJOYW1lcyA9PT0gbnVsbCkgY29udGludWU7XG4gICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtWydyZXN1bHQnXSA9PT0gJ1Bhc3MnKSB7IC8vcGFzc1xuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbVsncmVzdWx0J10gPT09ICdGYWlsZWQnKSB7IC8vZmFpbGVkXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9yZWR1bmRhbnRcIiwgW2FyaWFBdHRyc1tpXVsnbmFtZSddLCBpdGVtWydhdHRyJ11dKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7ICAgIFxuICAgICAgICB9ICAgIFxuICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYXR0cmlidXRlX3JlcXVpcmVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3JlcXVpcmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9SZXF1aXJlZFByb3BlcnRpZXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyaWFfYXR0cmlidXRlX3JlcXVpcmVkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyaWFfYXR0cmlidXRlX3JlcXVpcmVkLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGFyaWFfYXR0cmlidXRlX3JlcXVpcmVkLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIldoZW4gdXNpbmcgYSBBUklBIHJvbGUgb24gYW4gZWxlbWVudCwgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgZm9yIHRoYXQgcm9sZSBtdXN0IGJlIGRlZmluZWRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQW4gZWxlbWVudCB3aXRoIEFSSUEgcm9sZSAnezB9JyBkb2VzIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBBUklBIGF0dHJpYnV0ZShzKTogJ3sxfSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCI0LjEuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI0ZThhYjZcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgYXR0ck5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJvbGVzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAvL2xldCBpbXBsaWNpdFJvbGUgPSBBUklBTWFwcGVyLmVsZW1Ub0ltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBSUFRVdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgbGV0IHRlc3RlZFJvbGVzID0gMDtcblxuICAgICAgICBmb3IgKGxldCBqID0gMCwgcm9sZXNMZW5ndGggPSByb2xlcy5sZW5ndGg7IGogPCByb2xlc0xlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlLmxlbmd0aCA+IDAgJiYgaW1wbGljaXRSb2xlLmluY2x1ZGVzKHJvbGVzW2pdKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoZGVzaWduUGF0dGVybnNbcm9sZXNbal1dICYmIFJQVFV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlc1tqXSwgcnVsZUNvbnRleHQpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWlyZWRSb2xlUHJvcHMgPSBSUFRVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZXNbal0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZU1pc3NpbmdSZXFQcm9wID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGVzdGVkUm9sZXMrKztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcHJvcGVydGllc0xlbmd0aCA9IHJlcXVpcmVkUm9sZVByb3BzLmxlbmd0aDsgaSA8IHByb3BlcnRpZXNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgcmVxdWlyZWRSb2xlUHJvcHNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiBhcmlhLWxhYmVsbGVkYnkgaXNuJ3QgcHJlc2VudCwgYW4gYXJpYS1sYWJlbCB3aWxsIG1lZXQgdGhlIHJlcXVpcmVtZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkUm9sZVByb3BzW2ldID09IFwiYXJpYS1sYWJlbGxlZGJ5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbFwiKSkgfHwgKHJvbGVzW2ldICE9IFwicmFkaW9ncm91cFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKHJlcXVpcmVkUm9sZVByb3BzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU1pc3NpbmdSZXFQcm9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkUm9sZVByb3BzW2ldID09IFwiYXJpYS12YWx1ZW5vd1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtdmFsdWV0ZXh0XCIpKSB8fCAocm9sZXNbaV0gIT0gXCJwcm9ncmVzc2JhclwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKHJlcXVpcmVkUm9sZVByb3BzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU1pc3NpbmdSZXFQcm9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkUm9sZVByb3BzW2ldID09IFwiYXJpYS1jb250cm9sc1wiICYmIHJvbGVzW2pdID09IFwiY29tYm9ib3hcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBjaGVjayBzaW5jZSBhcmlhLWNvbnRyb2xzIGluIHRoZSB0ZXh0Ym94IG9mIGEgY29tYm9ib3ggaXMgYWxyZWFkeSBoYW5kbGVkIGluIHJ1bGUgSEFBQ19Db21ib2JveF9NdXN0X2hhdmVfVGV4dF9JbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKHJlcXVpcmVkUm9sZVByb3BzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlTWlzc2luZ1JlcVByb3AgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyb2xlTWlzc2luZ1JlcVByb3AgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICByb2xlTmFtZUFyci5wdXNoKHJvbGVzW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhdHRyTmFtZUFyci5sZW5ndGggPT0gMDsgLy8gb25seSBhcmlhIGF0dHJpYnV0ZXMgc28gTk8gT1VUIE9GIFNDT1BFXG4gICAgICAgIHJldFRva2VuLnB1c2gocm9sZU5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgcmV0VG9rZW4ucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sIGF0dHJOYW1lQXJyLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IHJldFRva2VuKTtcbiAgICAgICAgaWYgKHRlc3RlZFJvbGVzID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgcmV0VG9rZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRQcm9wZXJ0eVZhbHVlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIHByb3BlcnR5IHZhbHVlcyBtdXN0IGJlIHZhbGlkXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSB2YWx1ZSBcXFwiezB9XFxcIiBzcGVjaWZpZWQgZm9yIGF0dHJpYnV0ZSAnezF9JyBvbiBlbGVtZW50IDx7Mn0+IGlzIG5vdCB2YWxpZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI2YTcyODFcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdmFsdWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkYXRhVHlwZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcHJvcGVydHlEYXRhVHlwZXMgPSBBUklBRGVmaW5pdGlvbnMucHJvcGVydHlEYXRhVHlwZXM7XG4gICAgICAgIGxldCBjb250ZXh0QXR0cmlidXRlcyA9IHJ1bGVDb250ZXh0LmF0dHJpYnV0ZXM7XG4gICAgICAgIGxldCB0ZXN0ZWRQcm9wZXJ0eVZhbHVlcyA9IDA7XG5cbiAgICAgICAgaWYgKGNvbnRleHRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gY29udGV4dEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVR5cGVzID0gcHJvcGVydHlEYXRhVHlwZXNbYXR0ck5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnR5VmFsdWVzKys7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlcy52YWx1ZXMuaW5kZXhPZihub2RlVmFsdWUpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlcy52YWx1ZXMuaW5kZXhPZigndW5kZWZpbmVkJykgIT0gLTEgJiYgbm9kZVZhbHVlLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdHJhbnNsYXRlICd1bmRlZmluZWQnIHRvIG1lYW4gJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmlhLXJlbGV2YW50IGlzIHJlcHJlc2VudGVkIGFzIGEgc3BhY2UgZGVsaW1pdGVkIGxpc3Qgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbnMsIHJlbW92YWxzLCB0ZXh0OyBvciBhIHNpbmdsZSBjYXRjaC1hbGwgdmFsdWUgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzLnR5cGUgPT09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlbnNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF0dHJWYWx1ZXMgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBhbGwgaXMgc3BlY2lmaWVkLCBpdCBjYW5ub3QgaGF2ZSBhbnkgb3RoZXIgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWVzLmxlbmd0aCA+IDEgJiYgYXR0clZhbHVlcy5pbmNsdWRlcyhcImFsbFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2goY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGVBcnIucHVzaChkYXRhVHlwZXMudmFsdWVzLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGFzaCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXR0clZhbHVlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgaW5kaXZpZHVhbCB2YWx1ZSBpcyBub3QgaW4gdGhlIGxpc3Qgb2YgYWxsb3dlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZXNbal0gIT0gXCJcIiAmJiAhZGF0YVR5cGVzLnZhbHVlcy5pbmNsdWRlcyhhdHRyVmFsdWVzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNoLmhhc093blByb3BlcnR5KGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hbYXR0ck5hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2goYXR0clZhbHVlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZUFyci5wdXNoKGRhdGFUeXBlcy52YWx1ZXMudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZS5zcGxpdChcIiBcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZUFyci5wdXNoKGRhdGFUeXBlcy52YWx1ZXMudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlICYmIGRhdGFUeXBlcy50eXBlID09PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaVZhbCA9IHBhcnNlSW50KG5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4oaVZhbCkgfHwgKFwiXCIgKyBpVmFsICE9PSBub2RlVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSAmJiBkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWxcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZWYWwgPSBwYXJzZUZsb2F0KG5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4oZlZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKG5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlICYmIChkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0bXBWID0gbm9kZVZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcFYgIT09IFwidHJ1ZVwiICYmIHRtcFYgIT09IFwiZmFsc2VcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2gobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0eVZhbHVlcy0tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXRNc2cgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGF0dHJOYW1lQXJyLmxlbmd0aCA9PSAwO1xuICAgICAgICByZXRNc2cucHVzaCh2YWx1ZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICByZXRNc2cucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICByZXRNc2cucHVzaChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgLy8gcmV0TXNnLnB1c2ggKGRhdGFUeXBlQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgYXR0ck5hbWVBcnIsICcnLCByZXRNc2cpO1xuICAgICAgICBpZiAodGVzdGVkUHJvcGVydHlWYWx1ZXMgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIHJldE1zZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpiYW5uZXJcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQmFubmVyTGFuZG1hcmtzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImJhbm5lclwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IFJQVFV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBzZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCAhPT0gXCJcIiAmJiAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIHJ1bGVDb250ZXh0LCAnJywgJycsIFsgbXlMYWJlbCBdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX2Jhbm5lcl9zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9iYW5uZXJfc2luZ2xlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXSwgZG9tOmhlYWRlclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfT25lQmFubmVySW5TaWJsaW5nU2V0X0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9iYW5uZXJfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9iYW5uZXJfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Jhbm5lcl9zaW5nbGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGVyZSBpcyBtb3JlIHRoYW4gb25lIGVsZW1lbnQgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIG9uIHRoZSBwYWdlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlcmUgbXVzdCBiZSBvbmx5IG9uZSBlbGVtZW50IHdpdGggXFxcImJhbm5lclxcXCIgcm9sZSBvbiB0aGUgcGFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoIVJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImJhbm5lclwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIFJQVFV0aWwuZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LFxuICAgICAgICAgICAgICAgIFwiYmFubmVyXCIsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApID09PSBudWxsO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIFtdKTtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfY2hpbGRfdGFiYmFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jaGlsZF90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTWlzc2luZ0ZvY3VzYWJsZUNoaWxkXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nX2NoaWxkXCI6IFwiZmFpbF9taXNzaW5nX2NoaWxkXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9jaGlsZF90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbWlzc2luZ19jaGlsZFwiOiBcImFyaWFfY2hpbGRfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY2hpbGRfdGFiYmFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nX2NoaWxkXCI6IFwiTm9uZSBvZiB0aGUgZGVzY2VuZGVudCBlbGVtZW50cyB3aXRoIFxcXCJ7MX1cXFwiIHJvbGUgaXMgdGFiYmFibGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJVSSBjb21wb25lbnQgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB0YWJiYWJsZSBkZXNjZW5kYW50IGZvciBrZXlib2FyZCBhY2Nlc3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHJlcXVpcmVzIHByZXNlbnRhdGlvbmFsIGNoaWxkcmVuIG9ubHlcbiAgICAgICAgaWYgKFJQVFV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5zaG91bGRCZVByZXNlbnRhdGlvbmFsQ2hpbGQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIEFuIEFSSUEgbGlzdCBpcyBub3QgaW50ZXJhY3RpdmVcbiAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgeyBcImxpc3RcIjogdHJ1ZSwgXCJyb3dcIjogdHJ1ZSwgXCJyb3dncm91cFwiOiB0cnVlLCBcInRhYmxlXCI6IHRydWUsIFwiZ3JpZFwiOiB0cnVlIH0pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdCBhIHZhbGlkIG1lc3NhZ2UgZm9yIG1vYmlsZSBiZWNhdXNlIGFsbCBlbGVtZW50cyBhcmUgZm9jdXNhYmxlIGluIGlPUyB3aGVuIFZvaWNlT3ZlciBpcyBlbmFibGVkLlxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY2xhc3NcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikuc3Vic3RyaW5nKDAsIDMpID09IFwibWJsXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZ25vcmUgZGF0YWxpc3QgZWxlbWVudCBjaGVjayBzaW5jZSBpdCB3aWxsIGJlIHBhcnQgb2YgYSBpbnB1dCBlbGVtZW50IG9yIGhpZGRlbiBieSBkZWZhdWx0XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGF0YWxpc3QnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHJvbGVzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhpcyBpcyByZWZlcmVuY2VkIGJ5IGEgY29tYm9ib3guIElmIHNvLCBmb2N1cyBpcyBjb250cm9sbGVkIGJ5IHRoZSBjb21ib2JveFxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGlkIG9mIHRoZSBlbGVtZW50IGlzIHJlZmVyZW5jZWQgYnkgYW5vdGhlciBlbGVtZW50IHdpdGggXCJhcmlhLWNvbnRyb2xzXCIgb3IgXCJhcmlhLWV4cGFuZGVkXCIgYW5kIHdpdGggY2VydGFpbiByb2xlcy4gSWYgc28sIGZvY3VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHJlZmVyZW5jaW5nIGVsZW1lbnRcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgIGlmIChpZCAmJiBpZC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLyoqaWYgKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihgKlthcmlhLWNvbnRyb2xzPScke2lkfSddW3JvbGU9J2NvbWJvYm94J11gKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCpbYXJpYS1jb250cm9scz0nJHtpZH0nXVthcmlhLWhhc3BvcHVwPSd0cnVlJ10sICpbYXJpYS1jb250cm9scz0nJHtpZH0nXVthcmlhLWV4cGFuZGVkPSd0cnVlJ11gKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBbJ2NvbWJvYm94JywgJ2xpc3Rib3gnLCAnbWVudScsICdtZW51YmFyJywgJ3JhZGlvZ3JvdXAnLCAndHJlZScsICd0cmVlZ3JpZCddO1xuICAgICAgICAgICAgaWYgKGVsZW0gJiYgUlBUVXRpbC5pc1RhYmJhYmxlKGVsZW0pICYmIHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+MCAmJiByb2xlcy5zb21lKHI9PmNvbnRhaW5lcnMuaW5jbHVkZXMocikpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgaGFzQXR0cmlidXRlID0gUlBUVXRpbC5oYXNBdHRyaWJ1dGU7XG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBcIlwiO1xuICAgICAgICBsZXQgaW5TY29wZSA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuY29udGFpbmVycy5pbmNsdWRlcyhyb2xlc1tqXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlzYWJsZWQgPSBoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWRpc2FibGVkJykgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpIDogJyc7XG4gICAgICAgICAgICAgICAgaWYgKGRpc2FibGVkICE9ICd0cnVlJyAmJiAhaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JykgJiYgIVJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcUNoaWxkcmVuID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5yZXFDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcUNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpblNjb3BlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwID0gXCJkZXNjZW5kYW50OjoqW1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXFDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwICs9IFwiQHJvbGU9J1wiICsgcmVxQ2hpbGRyZW5baV0gKyBcIicgb3IgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB4cCA9IHhwLnN1YnN0cmluZygwLCB4cC5sZW5ndGggLSA0KSArICddJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdCA9IGRvYy5ldmFsdWF0ZSh4cCwgcnVsZUNvbnRleHQsIFJQVFV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHI6IEVsZW1lbnQgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAociAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmlzVGFiYmFibGUocik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXF1aXJlZCBjaGlsZCBpcyBub3QgZm9jdXNhYmxlIHZpYSB0YWJpbmRleC4gIFNlZSBpZiB0aGVyZSBpcyBhIGdyYW5kY2hpbGQgdGhhdCBpcyBmb2N1c2FibGUgYnkgZGVmYXVsdCBvciBieSB0YWJpbmRleC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAyID0gXCJkZXNjZW5kYW50OjoqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdDIgPSBkb2MuZXZhbHVhdGUoeHAyLCByLCBSUFRVdGlsLmRlZmF1bHROU1Jlc29sdmVyLCAwIC8qIFhQYXRoUmVzdWx0LkFOWV9UWVBFICovLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyMiAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5pc1RhYmJhYmxlKHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyID0gci5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhlIGFycmF5cy9zdHJpbmdzIGFyZSBlbXB0eSwgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIHZpb2xhdGlvbiBzbyB3ZSBjYW4gcmVzZXQgaXQgYmFjayB0byBwYXNzZWQsIHRoZSByZWFzb24gZm9yIHRoaXNcbiAgICAgICAgLy8gaXMgdGhhdCB3ZSBhcmUgc2V0dGluZyBwYXNzZWQ9ZmFsc2Ugd2hpbGUgd2UgcGVyZm9ybSBhIGxvb3Agd2hpY2ggY2F1c2VzIHZpb2xhdGlvbiB0byB0cmlnZ2VyIGV2ZW4gaWYgdGhlcmUgaXMgbm8gaXNzdWVzLiBJbnN0ZWFkIG9mXG4gICAgICAgIC8vIHVwZGF0aW5nIHRoZSB3aG9sZSBydWxlIHRvIHN3aXRjaCBmcm9tIHVzaW5nIHBhc3NlZCBpbiB0aGF0IHdheSBzaW1wbHkgZG8gdGhlIGNoZWNrIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgIGlmIChub2RlTmFtZS5sZW5ndGggPiAwICYmIHJvbGVOYW1lQXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldFRva2VuMS5wdXNoKG5vZGVOYW1lKTtcbiAgICAgICAgICAgIHJldFRva2VuMi5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yXSk7XG4gICAgICAgIGlmICghaW5TY29wZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9taXNzaW5nX2NoaWxkXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfY2hpbGRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jaGlsZF92YWxpZFwiLFxuICAgIC8vY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIC8vZGVwZW5kZW5jaWVzOiBbXCJScHRfQXJpYV9WYWxpZFJvbGVcIl0sXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3ZhbGlkXCIsIFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jaGlsZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub19jaGlsZFwiOiBcImFyaWFfY2hpbGRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfY2hpbGRcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggYSBBUklBIHJvbGUgbXVzdCBvd24gYSByZXF1aXJlZCBjaGlsZFwiLFxuICAgICAgICAgICAgXCJQYXNzXCI6IFwiQW4gZWxlbWVudCB3aXRoIGEgQVJJQSByb2xlIG93bnMgYSByZXF1aXJlZCBjaGlsZFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vX2NoaWxkXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCByb2xlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IG93biBhbnkgY2hpbGQgZWxlbWVudCB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIHJvbGUocyk6IFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9jaGlsZFwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBvd25zIHRoZSBjaGlsZCBlbGVtZW50IHdpdGggdGhlIHJvbGUgXFxcInsxfVxcXCIgdGhhdCBpcyBub3Qgb25lIG9mIHRoZSBhbGxvd2VkIHJvbGUocyk6IFxcXCJ7Mn1cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFZlcmlmeSBtYXBwaW5nXG4gICAgYWN0OiBbXCJiYzRhNzVcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCByZXF1aXJlcyBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiBvbmx5XG4gICAgICAgIGlmIChSUFRVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJvbGVzID0gIFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZXhwbGljaXQgb3IgaW1wbGljaXQgcm9sZSwgc2hvdWxkbid0IGhhcHBlblxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgZWxlbWVudCBjb250YWlucyBub25lIG9yIHByZXNlbnRhdGlvbiByb2xlXG4gICAgICAgIGxldCBwcmVzZW50YXRpb25Sb2xlcyA9IFtcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl07XG4gICAgICAgIGNvbnN0IGZvdW5kID0gcm9sZXMuc29tZShyPT4gcHJlc2VudGF0aW9uUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vICBGb3IgY29tYm9ib3gsIHdlIGhhdmUgZzExOTMgLi4uIGcxMTk5IHRvIGNoZWNrIHRoZSB2YWx1ZXMgZXRjLlxuICAgICAgICAvLyAgV2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIDExNTIgYWdhaW4uIFNvLCB3ZSBieXBhc3MgaXQgaGVyZS5cbiAgICAgICAgaWYgKHJvbGVzLmluY2x1ZGVzKFwiY29tYm9ib3hcIikpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGxldCByZXF1aXJlZENoaWxkUm9sZXMgPSBSUFRVdGlsLmdldFJlcXVpcmVkQ2hpbGRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIC8vIGEgJ2dyb3VwJyByb2xlIGlzIGFsbG93ZWQgYnV0IG5vdCByZXF1aXJlZCBmb3Igc29tZSBlbGVtZW50cyBzbyByZW1vdmUgaXQgaWYgZXhpc3RzXG4gICAgICAgIGlmIChyZXF1aXJlZENoaWxkUm9sZXMuaW5jbHVkZXMoJ2dyb3VwJykpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmRleE9mKCdncm91cCcpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgcmVxdWlyZWRDaGlsZFJvbGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8qKiAgXG4gICAgICAgICAqIGlnbm9yZSBpZiBhIHJvbGUgZG9lc24ndCByZXF1aXJlIGEgY2hpbGQgd2l0aCBhbnkgc3BlY2lmaWMgcm9sZVxuICAgICAgICAgKiB0aGUgcmV2ZXJzZSBtaWdodCBiZSBub3QgdHJ1ZSAtIHBhcmVudCB3aWxsIGJlIGNoZWNrZWQgaW4gUnB0X0FyaWFfUmVxdWlyZWRQYXJlbnRfTmF0aXZlX0hvc3RfU2VtYXRpY3MgcnVsZVxuICAgICAgICAqL1xuICAgICAgICAgaWYgKHJlcXVpcmVkQ2hpbGRSb2xlcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNoaWxkcmVuIGZyb20gYWNjZXNzaWJpbGl0eSB0cmVlLCBcbiAgICAgICAgLy8gaW5jbHVkaW5nIG9uZXMgd2l0aCBhcmlhLW93bnMgICAgXG4gICAgICAgIGxldCBkaXJlY3RBVENoaWxkcmVuID0gUlBUVXRpbC5nZXREaXJlY3RBVENoaWxkcmVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIGlmICghZGlyZWN0QVRDaGlsZHJlbiB8fCBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAvLyB0aGUgZWxlbWVudCB3aXRoIGF0IGxlYXN0IG9uZSByZXF1aXJlZCByb2xlIGRvc2VuJ3QgY29udGFpbiBhbnkgYWNjZXNzaWJsZSBjaGlsZFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBXaGVuIGEgd2lkZ2V0IGlzIG1pc3NpbmcgcmVxdWlyZWQgb3duZWQgZWxlbWVudHMgZHVlIHRvIHNjcmlwdCBleGVjdXRpb24gb3IgbG9hZGluZywgXG4gICAgICAgICAgICAgKiBhdXRob3JzIE1VU1QgbWFyayBhIGNvbnRhaW5pbmcgZWxlbWVudCB3aXRoICdhcmlhLWJ1c3knIGVxdWFsIHRvIHRydWUuIFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgbGV0IGJ1c3kgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWJ1c3lcIik7XG4gICAgICAgICAgICAgaWYgKCFidXN5IHx8IGJ1c3kgIT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJlcXVpcmVkQ2hpbGRSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX25vX2NoaWxkXCIsIHJldFRva2VuKTtcbiAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgIC8vIGl0J3MgJ2J1c3knIGxvYWRpbmcsIGlnbm9yZSBpdCBcbiAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHZpb2xhdGVFbGVtUm9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaj0wOyBqIDwgZGlyZWN0QVRDaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkUm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKGRpcmVjdEFUQ2hpbGRyZW5bal0sIGZhbHNlKTtcbiAgICAgICAgICAgIC8vIGlmIGV4cGxpY2l0IHJvbGUgZG9lc24ndCBleGlzdCwgZ2V0IHRoZSBpbXBsaWNpdCBvbmVcbiAgICAgICAgICAgIGlmICghY2hpbGRSb2xlcyB8fCBjaGlsZFJvbGVzLmxlbmd0aCA9PSAwKSBcbiAgICAgICAgICAgICAgICBjaGlsZFJvbGVzID0gIFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGRpcmVjdEFUQ2hpbGRyZW5bal0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiB3aGVuIG11bHRpcGxlIHJvbGVzIGFyZSBzcGVjaWZpZWQgYXMgcmVxdWlyZWQgb3duZWQgZWxlbWVudHMgZm9yIGEgcm9sZSwgYXQgbGVhc3Qgb25lIGluc3RhbmNlIG9mIG9uZSByZXF1aXJlZCBvd25lZCBlbGVtZW50IGlzIGV4cGVjdGVkLiBcbiAgICAgICAgICAgICAgICAgKiB0aGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFuIGluc3RhbmNlIG9mIGVhY2ggb2YgdGhlIGxpc3RlZCBvd25lZCByb2xlcy5cbiAgICAgICAgICAgICAgICAgKiB0aGVyZWZvcmUsIHRoZSByZXF1aXJlbWVudCBpcyBtZXQgaWYgaXQgaGFzIGFueSBvbmUgb2YgdGhlIHJlcXVpcmVkIHJvbGVzLiAgIFxuICAgICAgICAgICAgICAgICAqLyAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZCA9IGNoaWxkUm9sZXMuc29tZShyPT4gcmVxdWlyZWRDaGlsZFJvbGVzLmluY2x1ZGVzKHIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSBcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZUVsZW1Sb2xlcy5wdXNoKGNoaWxkUm9sZXMuam9pbihcIiwgXCIpKTsgXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZWxlbWVudCBzaW5jZSBpdCdzIG5vdCBzZW1hbnRpYywgc2hvdWxkbid0IGhhcHBlbiBcbiAgICAgICAgICAgIH0gICAgIFxuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgaWYgKHZpb2xhdGVFbGVtUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJldFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmlvbGF0ZUVsZW1Sb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHZpb2xhdGVFbGVtUm9sZXNbaV0pO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocmVxdWlyZWRDaGlsZFJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgcmV0VmFsdWVzLnB1c2goUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfY2hpbGRcIiwgcmV0VG9rZW4pKTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21wbGVtZW50YXJ5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUNvbXBsZW1lbnRhcnlMYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJjb21wbGVtZW50YXJ5XCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IFJQVFV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBzZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206YXNpZGVcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0NvbXBsZW1lbnRhcnlMYW5kbWFya0xhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgc2hvdWxkIGhhdmUgYSB2aXNpYmxlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21wbGVtZW50YXJ5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiXG4gICAgICAgICk7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tcGxlbWVudGFyeVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfQ29tcGxlbWVudGFyeVJlcXVpcmVkTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhbiBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgbXVzdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jb250ZW50X2luX2xhbmRtYXJrOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudF9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ29udGVudCBpcyBub3Qgd2l0aGluIGEgbGFuZG1hcmsgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFsbCBjb250ZW50IG11c3QgcmVzaWRlIHdpdGhpbiBhbiBlbGVtZW50IHdpdGggYSBsYW5kbWFyayByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlkXCI6IFtcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBsZXQgcGFyYW1zID0gZ2V0Q2FjaGUoY29udGV4dC5kb20ubm9kZS5vd25lckRvY3VtZW50LCBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFwYXJhbXMpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICBsYW5kbWFya3M6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFtcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImZvcm1cIiwgXCJtYWluXCIsIFwibmF2aWdhdGlvblwiLCBcInJlZ2lvblwiLCBcInNlYXJjaFwiXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwb3NzaWJsZU9ycGhhbmVkV2lkZ2V0czoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW1wiYnV0dG9uXCIsIFwiY29tYm9ib3hcIiwgXCJjaGVja2JveFwiLCBcImdyaWRcIiwgXCJoZWFkaW5nXCIsIFwibGlua1wiLCBcImxpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJyYWRpb1wiLCBcInRhYmxpc3RcIiwgXCJ0ZXh0Ym94XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHJlZWdyaWRcIlxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBvc3NpYmxlT3JwaGFuZWRFbGVtZW50czoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW1wicFwiLCBcInRhYmxlXCIsIFwiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiLCBcImJ1dHRvblwiLCBcImFcIiwgXCJvbFwiLCBcInVsXCIsIFwiZGxcIiwgXCJoMVwiLCBcImgyXCIsIFwiaDNcIiwgXCJoNFwiLCBcImg1XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImg2XCIsIFwiZW1iZWRcIiwgXCJvYmplY3RcIiwgXCJhcmVhXCJcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBub0xhbmRtYXJrZWRSb2xlczoge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSByb2xlcyBkb24ndCByZXF1aXJlIGxhbmRtYXJrc1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW1wiYWxlcnRcIiwgXCJhbGVydGRpYWxvZ1wiLCBcImRpYWxvZ1wiLCBcInRvb2x0aXBcIl0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbWFwTGFuZG1hcmtzOiB7fSxcbiAgICAgICAgICAgICAgICBtYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0czoge30sXG4gICAgICAgICAgICAgICAgbWFwUG9zc2libGVPcnBoYW5lZEVsZW1lbnRzOiB7fSxcbiAgICAgICAgICAgICAgICBtYXBOb0xhbmRtYXJrZWRSb2xlczoge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvbnZlcnQgYXJyYXlzIHRvIG1hcHNcbiAgICAgICAgICAgIHBhcmFtcy5tYXBMYW5kbWFya3MgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxhbmRtYXJrcy52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5tYXBMYW5kbWFya3NbcGFyYW1zLmxhbmRtYXJrcy52YWx1ZVtpXV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZFdpZGdldHMgPSB7fVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMucG9zc2libGVPcnBoYW5lZFdpZGdldHMudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZFdpZGdldHNbcGFyYW1zLnBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzLnZhbHVlW2ldXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkRWxlbWVudHMgPSB7fVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMucG9zc2libGVPcnBoYW5lZEVsZW1lbnRzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50c1twYXJhbXMucG9zc2libGVPcnBoYW5lZEVsZW1lbnRzLnZhbHVlW2ldXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlcyA9IHt9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5ub0xhbmRtYXJrZWRSb2xlcy52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlc1twYXJhbXMubm9MYW5kbWFya2VkUm9sZXMudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2V0Q2FjaGUoY29udGV4dC5kb20ubm9kZS5vd25lckRvY3VtZW50LCBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCAgLy8gYXZvaWQgZGlhZ25vc2luZyBnMTE1NyBmb3Igbm9uLXZpc2libGUgbm9kZXNcbiAgICAgICAgICAgIChWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPiAtMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtc1dpdGhvdXRDb250ZW50ID0gW1wiYXJlYVwiLCBcImlucHV0XCIsIFwiZW1iZWRcIiwgXCJidXR0b25cIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiXTtcbiAgICAgICAgaWYgKCFSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCkgJiYgLy9vbmx5IHRyaWdnZXIgdGhlIHJ1bGUgb24gZWxlbWVudHMgdGhhdCBoYXZlIGNvbnRlbnRcbiAgICAgICAgICAgIGVsZW1zV2l0aG91dENvbnRlbnQuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7IC8vIGEgZmV3IGVsZW1zIHdpaG91dCBjb250ZW50IHNob3VsZCBub3QgYmUgc2tpcHBlZFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2hvcnQgY2lyY3VpdCBmb3IgbGF5b3V0IHRhYmxlc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJ0YWJsZVwiICYmIFJQVFV0aWwuaXNMYXlvdXRUYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYSBwb3NzaWJsZSBvcnBoYW5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBpc1Bvc3NpYmxlT3JwaGFuZWRXaWRnZXQgPSBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cywgdHJ1ZSk7XG4gICAgICAgIC8vZXhjbHVkZSA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cInh5ei5jc3NcIj4gaW4gdGhlIDxoZWFkPiBhbmQgPGJvZHk+KCM2MDgpXG4gICAgICAgIC8vaGF2aW5nIGxpbmsgaW4gdGhlIGhlYWQgY291bGQgY2F1c2UgbG90IG9mIHZpb2xhaW9ucyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2xpbmsnKSB7XG4gICAgICAgICAgICBpc1Bvc3NpYmxlT3JwaGFuZWRXaWRnZXQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc1Bvc3NpYmxlT3JwaGFuZWRFbGVtZW50ID0gbm9kZU5hbWUgaW4gcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cztcbiAgICAgICAgaWYgKGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCB8fCBpc1Bvc3NpYmxlT3JwaGFuZWRFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBTZWUgaWYgYW5jZXN0b3IgaGFzIGxhbmRtYXJrIHJvbGVzIG9yIGltcGxpY2l0IGxhbmQgbWFyayByb2xlc1xuICAgICAgICAgICAgbGV0IHBhcmVudFJvbGVzID0gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5tYXAoaW5mbyA9PiBpbmZvLnJvbGUpO1xuICAgICAgICAgICAgcGFzc2VkID0gcGFyZW50Um9sZXMuZmlsdGVyKHJvbGUgPT4gcm9sZSBpbiBwYXJhbXMubWFwTGFuZG1hcmtzKS5sZW5ndGggPiAwXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIERvbid0IGZhaWwgZWxlbWVudHMgd2hlbiBhIHBhcmVudCBvciBzaWJsaW5nIGhhcyBmYWlsZWQgLSBjYXVzZXMgdG9vIG1hbnkgbWVzc2FnZXMuXG4gICAgICAgICAgICAgICAgbGV0IHdhbGtFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZ2V0Q2FjaGUod2Fsa0VsZW1lbnQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gcnVsZUNvbnRleHQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZ2V0Q2FjaGUod2Fsa0VsZW1lbnQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSB3YWxrRWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gcnVsZUNvbnRleHQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrRWxlbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGdldENhY2hlKHdhbGtFbGVtZW50LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gd2Fsa0VsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHRyaWdnZXIgcnVsZSBpZiBlbGVtZW50IGlzIGEgc3RhbmQtYWxvbmUgd2lkZ2V0XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGdldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudF9Ob1RyaWdnZXJcIiwgZmFsc2UpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlcywgdHJ1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDYWNoZShydWxlQ29udGV4dCwgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRfTm9UcmlnZ2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29udGVudGluZm9cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQ29udGVudGluZm9MYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCAhPT0gXCJcIiAmJiAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIHJ1bGVDb250ZXh0LCAnJywgJycsIFsgbXlMYWJlbCBdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX2NvbnRlbnRpbmZvX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV0sIGRvbTpmb290ZXIsIGRvbTphZGRyZXNzXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9Db250ZW50aW5mb1dpdGhOb01haW5fSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb250ZW50aW5mb19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50aW5mb19taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBpcyBwcmVzZW50IHdpdGhvdXQgYW4gZWxlbWVudCB3aXRoIFxcXCJtYWluXFxcIiByb2xlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBpcyBvbmx5IHBlcm1pdHRlZCB3aXRoIGFuIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vY29uc2lkZXIgaW1wbGljaXQgcm9sZVxuICAgICAgICBpZiAoIVJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbnRlbnRpbmZvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICkubGVuZ3RoID4gMDtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIFtdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jb250ZW50aW5mb19zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb250ZW50aW5mb19zaW5nbGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206Zm9vdGVyLCBkb206YWRkcmVzc1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVDb250ZW50aW5mb0luU2libGluZ1NldF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9jb250ZW50aW5mb19zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgZm91bmQgb24gYSBwYWdlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBwYWdlLCBkb2N1bWVudCBvciBhcHBsaWNhdGlvbiBzaG91bGQgb25seSBoYXZlIG9uZSBlbGVtZW50IHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vZmluZCBvdXQgaWYgPGZvb3Rlcj4gZWxlbWVudCBoYXMgc2libGluZ3MgYXMgPGZvb3Rlcj4gaGFzIGltcGxpY2l0IGNvbnRlbnRpbmZvIHJvbGVcbiAgICAgICAgaWYgKCFSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb250ZW50aW5mb1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gIVJQVFV0aWwuZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2Rlc2NlbmRhbnRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3ZhbGlkXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9jaGlsZF9leHBsaWNpdF9yb2xlXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJCcm93c2VycyBpZ25vcmUgdGhlIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCBBUklBIHJvbGVzIG9mIHRoZSBkZXNjZW5kYW50cyBvZiBjZXJ0YWluIGVsZW1lbnRzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCBjb250YWlucyB2YWxpZCBkZXNjZW5kYW50c1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfY2hpbGRfaW1wbGljaXRfcm9sZVwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBjb250YWlucyBkZXNjZW5kYW50cyB3aXRoIGltcGxpY2l0IHJvbGVzIFxcXCJ7MX1cXFwiIHdoaWNoIGFyZSBpZ25vcmVkIGJ5IGJyb3dzZXJzXCIsXG4gICAgICAgICAgICBcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBjb250YWlucyBkZXNjZW5kYW50cyB3aXRoIHJvbGVzIFxcXCJ7MX1cXFwiIHdoaWNoIGFyZSBpZ25vcmVkIGJ5IGJyb3dzZXJzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBWZXJpZnkgbWFwcGluZ1xuICAgIGFjdDogW1wiMzA3bjV6XCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCByZXF1aXJlIHByZXNlbnRhdGlvbmFsIGNoaWxkcmVuIG9ubHlcbiAgICAgICAgaWYgKCFSUFRVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJvbGVzID0gIFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZXhwbGljaXQgb3IgaW1wbGljaXQgcm9sZSwgc2hvdWxkbid0IGhhcHBlblxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gZ2V0IGFsbCB0aGUgY2hpbGRyZW4gZnJvbSBhY2Nlc3NpYmlsaXR5IHRyZWUsIFxuICAgICAgICAvLyBpbmNsdWRpbmcgb25lcyB3aXRoIGFyaWEtb3ducyAgICBcbiAgICAgICAgbGV0IGRpcmVjdEFUQ2hpbGRyZW4gPSBSUFRVdGlsLmdldERpcmVjdEFUQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGlyZWN0QVRDaGlsZHJlbiAmJiBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHdpdGggYXQgbGVhc3Qgb25lIG5vbi1wcmVzZW50YXRpb25hbCBjaGlsZHJlblxuICAgICAgICAgICAgbGV0IGV4cGxpY2l0Um9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICBmb3IgKGxldCBqPTA7IGogPCBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIDxpbWc+IGFuZCA8c3ZnPlxuICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IGRpcmVjdEFUQ2hpbGRyZW5bal0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAodGFnID09PSAnaW1nJyB8fCB0YWcgPT09ICdzdmcnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBnZXQgZXhwbGljaXQgcm9sZSBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRSb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMoZGlyZWN0QVRDaGlsZHJlbltqXSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZFJvbGVzICYmIGNoaWxkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBleHBsaWNpdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbXBsaWNpdCByb2xlIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICBjaGlsZFJvbGVzID0gIFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGRpcmVjdEFUQ2hpbGRyZW5bal0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChleHBsaWNpdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZXhwbGljaXRSb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKGV4cGxpY2l0Um9sZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWx1ZXMucHVzaChSdWxlRmFpbChcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBpbXBsaWNpdFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2goaW1wbGljaXRSb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbHVlcy5wdXNoKFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfY2hpbGRfaW1wbGljaXRfcm9sZVwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7ICAgICAgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpkb2N1bWVudFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVEb2N1bWVudFJvbGVzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIGEgXFxcImRvY3VtZW50XFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbGwgZWxlbWVudHMgd2l0aCBhIFxcXCJkb2N1bWVudFxcXCIgcm9sZSBtdXN0IGhhdmUgdW5pcXVlIGxhYmVsc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gUlBUVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgPT09IFwiXCIgfHwgIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxO1xuXG4gICAgICAgIC8vIHJldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIHJ1bGVDb250ZXh0LCAnJywgJycsIFsgbXlMYWJlbCBdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uY2xpY2tdLGRvbToqW29uYmx1cl0sIGRvbToqW29uZGJsY2xpY2tdLCBkb206KltvbmZvY3VzXSwgZG9tOipbb25rZXlkb3duXSxkb206KltvbmtleXByZXNzXSwgZG9tOipbb25rZXl1cF0sIGRvbToqW29ubW91c2Vkb3duXSwgZG9tOipbb25tb3VzZXVwXSwgZG9tOipbb25tb3VzZW1vdmVdLCBkb206Kltvbm1vdXNlb3V0XSwgZG9tOipbb25tb3VzZW92ZXJdLCBkb206KltvbnJlc2l6ZV0sIGRvbToqW29uY2hhbmdlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfRXZlbnRIYW5kbGVyTWlzc2luZ1JvbGVfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IHdpdGggJ3sxfScgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZSBzcGVjaWZpZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyB3aXRoIGV2ZW50IGhhbmRsZXJzIG11c3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciB0aGlzIGZvciBTVkcgZWxlbWVudCBmb3Igbm93IHVudGlsIGEgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlIChieSBSaWNoKVxuICAgICAgICAvLyB0byBzdXBwb3J0IFNWRyBhdCBhIHBvaW50IHdoZW4gdGhlIFNWRyBhMTF5IHNwZWMgaXMgcmVhZHkuXG4gICAgICAgIGlmIChSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInN2Z1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL3RoaXMgcnVsZSBpcyBwYXNzZWQgaWYgYSBlbGVtZW50IGhhcyBhdHRyaWJ1dCByb2xlIFxuICAgICAgICAvL2Fsc28sIHBhc3NlZCBvZiBlbGVtZW50IGhhcyBhbnkgaW1wbGljaXQgcm9sZXMuIFxuICAgICAgICBpZiAoUlBUVXRpbC5oYXNBbnlSb2xlKHJ1bGVDb250ZXh0LCB0cnVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9wYXNzIGlmIHRoaXMgZWxlbWVudCBpcyByZWNlaXZlZCBmb2N1cyBieSBkZWZhdWx0XG4gICAgICAgIGlmIChSUFRVdGlsLmlzZm9jdXNhYmxlQnlEZWZhdWx0KHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy92YWxpZGF0ZSBpZiB0aGlzIGVsZW1lbnQgaGFzIGFueSBvZiB0aGUgZ2l2ZW4gZXZlbnQgaGFuZGxlcidzXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGxldCBldmVudEFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICAvLyBGcm9tIFdDQUcyMF9TY3JpcHRfVXNlVzNDRG9tRnVuY3Rpb25zXG4gICAgICAgIC8vbGV0IGV2ZW50cyA9IFtcIm9uYmx1clwiLCBcIm9uZm9jdXNcIiwgXCJvbmNoYW5nZVwiLCBcIm9uY2xpY2tcIiwgXCJvbmNvbnRleHRtZW51XCIsIFwib25kYmxjbGlja1wiLCBcIm9ua2V5ZG93blwiLFxuICAgICAgICAvLyAgICAgICAgICAgICAgXCJvbmtleXByZXNzXCIsIFwib25rZXl1cFwiLCBcIm9ubG9hZFwiLCBcIm9ubW91c2Vkb3duXCIsIFwib25tb3VzZXVwXCIsIFwib25tb3VzZW1vdmVcIiwgXCJvbm1vdXNlb3V0XCIsXG4gICAgICAgIC8vICAgICAgICAgICAgICBcIm9ubW91c2VvdmVyXCIsIFwib25tb3VzZXdoZWVsXCIsIFwib25yZXNldFwiLCBcIm9ucGFzdGVcIiwgXCJvbnJlc2l6ZVwiLCBcIm9uc2Nyb2xsXCIsXG4gICAgICAgIC8vICAgICAgICAgICAgICBcIm9uc2VsZWN0XCIsIFwib25zdWJtaXRcIiwgXCJvbmFjdGl2YXRlXCIsIFwib25kZWFjdGl2YXRlXCIsIFwib25tb3VzZWVudGVyXCIsIFwib25tb3VzZWxlYXZlXCJdO1xuICAgICAgICBsZXQgZXZlbnRzID0gW1wib25ibHVyXCIsIFwib25mb2N1c1wiLCBcIm9uY2hhbmdlXCIsIFwib25jbGlja1wiLCBcIm9uZGJsY2xpY2tcIiwgXCJvbmtleWRvd25cIixcbiAgICAgICAgICAgIFwib25rZXlwcmVzc1wiLCBcIm9ua2V5dXBcIiwgXCJvbm1vdXNlZG93blwiLCBcIm9ubW91c2V1cFwiLCBcIm9ubW91c2Vtb3ZlXCIsIFwib25tb3VzZW91dFwiLFxuICAgICAgICAgICAgXCJvbm1vdXNlb3ZlclwiLCBcIm9ucmVzaXplXCJcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoZXZlbnRzW2ldKSlcbiAgICAgICAgICAgICAgICBldmVudEFyci5wdXNoKGV2ZW50c1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChldmVudEFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChmYWxzZSwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlRm9ybUxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiZm9ybVxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImZvcm1cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gUGVyIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE3L05PVEUtd2FpLWFyaWEtcHJhY3RpY2VzLTEuMS0yMDE3MTIxNC9leGFtcGxlcy9sYW5kbWFya3MvSFRNTDUuaHRtbFxuICAgICAgICAvLyBmb3JtIGVsZW1lbnQgc2hvdWxkIG9ubHkgYmUgY29uc2lkZXJlZCBpZiBpdCBoYXMgYW4gYXJpYSBsYWJlbCBvciB0aXRsZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpID09PSBcImZvcm1cIiB8fFxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fFxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpIHx8XG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgICAgIGxldCBsYW5kbWFya3MgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJmb3JtXCIsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmXG4gICAgICAgICAgICAgICAgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9ncmFwaGljX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpncmFwaGljcy1kb2N1bWVudCxhcmlhOmdyYXBoaWNzLXN5bWJvbFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BcmlhX1N2Z0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggYSBncmFwaGljcyByb2xlIG11c3QgaGF2ZSBhIG5vbi1lbXB0eSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcInswfVxcXCIgZ3JhcGhpY3Mgcm9sZSBoYXMgbm8gbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJ7MH1cXFwiIGdyYXBoaWNzIHJvbGUgaGFzIG5vIGxhYmVsIG9yIGFuIGVtcHR5IGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkVsZW1lbnQgd2l0aCBcXFwiezB9XFxcIiBncmFwaGljcyByb2xlIG1pc3Npbmcgbm9uLWVtcHR5ICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sIC8qQ2hhbmdlIG1hcHBpbmcgdG8gMS4xLjEgZnJvbSA0LjEuMiAqL1xuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiN2Q2NzM0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpIHx8ICFydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLmluY2x1ZGVzKFwiZ3JhcGhpY3MtXCIpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvKiByZW1vdmVkIHRoZSByb2xlIGNoZWNrIHJvbGU9IHByZXNlbnRhdGlvbiBzaW5jZSBpZiBhbiBlbGVtZW50IGhhcyByb2xlPWltZywgdGhlbiB0aGVyZSBuZWVkcyB0byBiZSBhIGNoZWNrIGZvciBhbHQgYXR0cmlidXRlIHJlZ2FyZGxlc3Mgb2YgdGhlIHByZXNlY25lIG9mIHJvbGU9cHJlc2VudGF0aW9uXG4gICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwicHJlc2VudGF0aW9uXCIpIHx8IFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJub25lXCIpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgICAgIH0qL1xuXG4gICAgICAgIC8vIElmIHJvbGUgPT09IGltZywgeW91IG11c3QgdXNlIGFuIGFyaWEgbGFiZWxcbiAgICAgICAgLy9jaGVjayBhdHRyaWJ1dGVzIGFyaWEtbGFiZWwgYW5kIGFyaWEtbGFiZWxsZWRieSBmb3Igb3RoZXIgdGFncyAoZS5nLiA8ZGl2PiwgPHNwYW4+LCBldGMpXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN2Z1wiKSB7XG4gICAgICAgICAgICBsZXQgc3ZnVGl0bGUgPSBydWxlQ29udGV4dC5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIik7XG4gICAgICAgICAgICBwYXNzZWQgPSBzdmdUaXRsZSAmJiBSUFRVdGlsLmhhc0lubmVyQ29udGVudChzdmdUaXRsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy9jaGVjayB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgICAgICAvLyBXZSBzaG91bGQgZ3VpZGUgcGVvcGxlIHRvIHVzZSBhbHQgb3IgbGFiZWwgLSB0aGlzIGlzIGp1c3QgYSBzZWNvbmRhcnkgYXBwcm9hY2ggdG8gc2lsZW5jZSB0aGUgcnVsZS5cbiAgICAgICAgICAgIC8vIFNvLCB3ZSBzaG91bGQga2VlcCB0aGUgUE9GIGZyb20gYWJvdmUuXG4gICAgICAgICAgICAvLyBpZiAoIXBhc3NlZCkgUE9GID0gXCJGYWlsXzNcIjtcbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIFtdKTtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpXSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBhcmlhX2hpZGRlbl9ub250YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2hpZGRlbl9ub250YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1oaWRkZW49dHJ1ZV0sIGRvbToqW2FyaWEtaGlkZGVuPXRydWVdIGRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX2hpZGRlbl9mb2N1c19taXN1c2VcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2hpZGRlbl9ub250YWJiYWJsZS5odG1sYCwgXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXJpYV9oaWRkZW5fbm9udGFiYmFibGUuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJpYV9oaWRkZW5fbm9udGFiYmFibGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBoaWRkZW4gZWxlbWVudCBzaG91bGQgbm90IGNvbnRhaW4gYW55IHRhYmJhYmxlIGVsZW1lbnRzXCIsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IFxcXCJ7MH1cXFwiIHNob3VsZCBub3QgYmUgZm9jdXNhYmxlIHdpdGhpbiB0aGUgc3VidHJlZSBvZiBhbiBlbGVtZW50IHdpdGggYW4gJ2FyaWEtaGlkZGVuJyBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSAndHJ1ZSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogW1wiMS4zLjFcIiwgXCI0LjEuMlwiXSwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IEhhbmRsZSB0ZXN0Y2FzZSB3aXRoIGZvY3VzIGp1bXBpbmcgYXdheVxuICAgIGFjdDogXCI2Y2ZhODRcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChSUFRVdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfaWRfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfaWRfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRJZFJlZlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfaWRfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlICdpZCcgXFxcInswfVxcXCIgc3BlY2lmaWVkIGZvciB0aGUgQVJJQSBwcm9wZXJ0eSAnezF9JyB2YWx1ZSBpcyBub3QgdmFsaWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgQVJJQSBwcm9wZXJ0eSBtdXN0IHJlZmVyZW5jZSBhIG5vbi1lbXB0eSB1bmlxdWUgaWQgb2YgYW4gZXhpc3RpbmcgZWxlbWVudCB0aGF0IGlzIHZpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IDZhNzI4MSAtIE5lZWQgYSBzZXBhcmF0ZSByZWFzb24gY29kZSB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgcmVxdWlyZWQuIEFDVCBzYXlzIGl0J3Mgb2theSB0byBiZVxuICAgIC8vIGludmFsaWQgd2hlbiBub3QgcmVxdWlyZWQuIEkgdGhpbmsgd2Ugc2hvdWxkIHN0aWxsIGZhaWwsIGJ1dCBmbGFnIGl0IGFzIGEgZGlmZmVyZW50IHJlYXNvbiBzbyB0aGF0IHdlIGNhbiBoYXZlIGEgc3Vic2V0XG4gICAgLy8gYWxpZ25zIHdpdGggQUNULlxuICAgIGFjdDogW1wiNTk3OTZmXCIsIFwiNmE3MjgxXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBub25FeGlzdGFudElEcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgb3duZXJEb2N1bWVudCA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IGlkVG9rZW5zID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCB0ZXN0ZWRSZWZlcmVuY2VzID0gMDtcblxuICAgICAgICBpZiAoY29udGV4dEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBhdHRyTGVuZ3RoID0gY29udGV4dEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgYXR0ckxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlcyA9IEFSSUFEZWZpbml0aW9ucy5wcm9wZXJ0eURhdGFUeXBlc1thdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0c09uZUlEUmVmID0gKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZcIikgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBkYXRhIHR5cGUgc3VwcG9ydHMgb25lIG9yIG1vcmUgaWQgcmVmcyBkbyBlcnJvciBjaGVja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRzT25lSURSZWYgfHwgKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUmVmZXJlbmNlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWVMZW5ndGggPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkQXJyYXkgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUuc3BsaXQoXCIgXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGFuIGVtcHR5IElEIFJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWVMZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChcIlxcXCJcIiArIGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZSArIFwiXFxcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRvbyBtYW55IElEUmVmc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN1cHBvcnRzT25lSURSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBoYXMgdG9vIG1hbnkgSURSZWZzIGl0IGlzIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWVMZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNhcHR1cmUgYWxsIHRoZSBJRFJlZnMgZm9yIGlkVG9rZW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IDAsIGxlbmd0aCA9IGlkQXJyYXkubGVuZ3RoOyB6IDwgbGVuZ3RoOyArK3opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbel0gIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChpZEFycmF5W3pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgaWQgcmVmcyBhcmUgaW52YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzICYmIG5vZGVWYWx1ZUxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwLCBsZW5ndGggPSBpZEFycmF5Lmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRBcnJheVtqXS5sZW5ndGggPiAwKSB7IC8vIGl0IGlzIGFuIGVtcHR5IHN0cmluZyBpZiBzcGFjZXMgYXJlIG9uZSBhZnRlciB0aGUgb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGVsZW1lbnQgYnkgSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudEJ5SWQgPSBvd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkQXJyYXlbal0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpZiB0aGUgZWxlbWVudCBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZWxlbWVudEJ5SWQgIT0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGV4aXN0cyBhbmQgdGhpcyBpcyBhbiBhcmlhIGF0dHJpYnV0ZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBoaWRkZW4gSUQgcmVmZXJlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBwZXJmb3JtIGEgaXNOb2RlVmlzaWJsZSBjaGVjaywgaW4gdGhlIGNhc2UgdGhlIG5vZGUgaXMgbm90IHZpc2libGUgdGhlbiB3ZSByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSBhbmQgdHJ1ZSBvdGhlcndpc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgJiYgIWRhdGFUeXBlcy5oaWRkZW5JRFJlZlN1cHBvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnRCeUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbal0gIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChpZEFycmF5W2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IG9uZSBvZiB0aGUgaWQgcmVmZXJlbmNlcyBuZWVkIHRvIGJlIHZhbGlkIHRvIG1hcmsgdGhlIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSBpZiB3ZSBmaW5kIGEgc2luZ2xlIHZpc2libGUgZWxlbWVudCB0aGVuIHN0b3AgY2hlY2tpbmcgYW5kIG1hcmsgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3MpIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFzc2VkID0gYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7XG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcmV0VG9rZW4zID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG5cbiAgICAgICAgICAgIHJldFRva2VuMi5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICByZXRUb2tlbjMucHVzaChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmIChpZFRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0VG9rZW4xLnB1c2goaWRUb2tlbnMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgYXR0ck5hbWVBcnIsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yLCByZXRUb2tlbjNdKTtcbiAgICAgICAgaWYgKHRlc3RlZFJlZmVyZW5jZXMgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCksIHJldFRva2VuMy50b1N0cmluZygpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfaW1nX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfaW1nX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmltZ1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BcmlhX0ltZ0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZWxlbWVudCB3aXRoIFxcXCJpbWdcXFwiIHJvbGUgbXVzdCBoYXZlIGEgbm9uLWVtcHR5IGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiaW1nXFxcIiByb2xlIGhhcyBubyBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJFbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBoYXMgbm8gbGFiZWwgb3IgYW4gZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJpbWdcXFwiIHJvbGUgbWlzc2luZyBub24tZW1wdHkgJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSwgLypDaGFuZ2UgbWFwcGluZyB0byAxLjEuMSBmcm9tIDQuMS4yICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW1wiMjNhMmE4XCIsIHtcbiAgICAgICAgXCI3ZDY3MzRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgLy8gSWYgbm8gcm9sZSwgdGhpcyBpcyBpbXBsaWNpdCwgYW5kIGNvdmVyZWQgYnkgV0NBRzIwX0ltZ19IYXNBbHRcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8qIHJlbW92ZWQgdGhlIHJvbGUgY2hlY2sgcm9sZT0gcHJlc2VudGF0aW9uIHNpbmNlIGlmIGFuIGVsZW1lbnQgaGFzIHJvbGU9aW1nLCB0aGVuIHRoZXJlIG5lZWRzIHRvIGJlIGEgY2hlY2sgZm9yIGFsdCBhdHRyaWJ1dGUgcmVnYXJkbGVzcyBvZiB0aGUgcHJlc2VjbmUgb2Ygcm9sZT1wcmVzZW50YXRpb25cbiAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJwcmVzZW50YXRpb25cIikgfHwgUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcIm5vbmVcIikpe1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcygxKTtcbiAgICAgICAgfSovXG5cbiAgICAgICAgLyogSkNIIC0gUG9pbnRzIG9mIGZhaWx1cmVcbiAgICAgICAgICogICAgMC4gTWlzc2luZyBhbHQgYXR0ciB3aXRoIHZhbHVlXG4gICAgICAgICAqICAgIDEuIE1pc3NpbmcgYXJpYS1sYWJlbCBvciBhcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICogICAgMi4gTWlzc2luZyB0aXRsZSBhdHRyIHdpdGggdmFsdWVcbiAgICAgICAgICovXG4gICAgICAgIFxuICAgICAgICAvLyBJZiByb2xlID09PSBpbWcsIHlvdSBtdXN0IHVzZSBhbiBhcmlhIGxhYmVsXG4gICAgICAgIC8vY2hlY2sgYXR0cmlidXRlcyBhcmlhLWxhYmVsIGFuZCBhcmlhLWxhYmVsbGVkYnkgZm9yIG90aGVyIHRhZ3MgKGUuZy4gPGRpdj4sIDxzcGFuPiwgZXRjKVxuICAgICAgICBsZXQgcGFzc2VkID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIikge1xuICAgICAgICAgICAgbGV0IHN2Z1RpdGxlID0gcnVsZUNvbnRleHQucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpO1xuICAgICAgICAgICAgcGFzc2VkID0gc3ZnVGl0bGUgJiYgUlBUVXRpbC5oYXNJbm5lckNvbnRlbnQoc3ZnVGl0bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vY2hlY2sgdGl0bGUgYXR0cmlidXRlXG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGd1aWRlIHBlb3BsZSB0byB1c2UgYWx0IG9yIGxhYmVsIC0gdGhpcyBpcyBqdXN0IGEgc2Vjb25kYXJ5IGFwcHJvYWNoIHRvIHNpbGVuY2UgdGhlIHJ1bGUuXG4gICAgICAgICAgICAvLyBTbywgd2Ugc2hvdWxkIGtlZXAgdGhlIFBPRiBmcm9tIGFib3ZlLlxuICAgICAgICAgICAgLy8gaWYgKCFwYXNzZWQpIFBPRiA9IFwiRmFpbF8zXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NaXNzaW5nS2V5Ym9hcmRIYW5kbGVyXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcInBvdGVudGlhbF9ub19rZXlib2FyZF9hY2Nlc3NcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcIlZlcmlmeSB0aGUgPHswfT4gZWxlbWVudCB3aXRoIFxcXCJ7MX1cXFwiIHJvbGUgaGFzIGtleWJvYXJkIGFjY2Vzc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkludGVyYWN0aXZlIFdBSV9BUklBIFVJIGNvbXBvbmVudHMgbXVzdCBwcm92aWRlIGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHNhdmVkUGFzc2VkID0gcGFzc2VkO1xuICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICBsZXQgcm9sZXMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIFxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvL2lmIGFuIGV4cGxpY2l0IHJvbGUgaXMgc3BlY2lmaWVkLCB0aGUgJ2FyaWFfcm9sZV9yZWR1bmRhbnQnIHJ1bGUgc2hvdWxkIGJlIHRyaWdnZXJlZCBhbmQgYWRkcmVzc2VkIGZpcnN0LFxuICAgICAgICAvLyBhbmQgdGhlIGN1cnJlbnQgcnVsZSBzaG91bGQgYmUgaWdub3JlZFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcgJiYgcm9sZXMgJiYgcm9sZXMuaW5jbHVkZXMoXCJsaXN0Ym94XCIpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IFJQVFV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICAvLyBDb21wb3NpdGUgdXNlciBpbnRlcmZhY2Ugd2lkZ2V0IHJvbGVzLiBUaGV5IGFjdCBhcyBjb250YWluZXJzIHRoYXQgbWFuYWdlIG90aGVyLCBjb250YWluZWQgd2lkZ2V0cy5cbiAgICAgICAgbGV0IHJvbGVDb250YWluZXJzID0gW1wiY29tYm9ib3hcIiwgXCJncmlkXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0cmVlXCIsIFwidHJlZWdyaWRcIl07XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZU5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvbGVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBsZXQgcGF0dGVybiA9IGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXTtcbiAgICAgICAgICAgIGlmIChyb2xlQ29udGFpbmVycy5pbmRleE9mKHJvbGVzW2pdKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRpc2FibGVkID0gaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCAnYXJpYS1kaXNhYmxlZCcpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1kaXNhYmxlZFwiKSA6ICcnO1xuICAgICAgICAgICAgICAgIGlmICghZGlzYWJsZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBrZXlib2FyZCBldmVudCBoYW5kbGVyIG9uIHRoZSBwYXJlbnQgZWxlbWVudC5cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5ZG93blwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBObyBrZXlib2FyZCBldmVudCBoYW5kbGVyIGZvdW5kIG9uIHBhcmVudC4gIFNlZSBpZiBrZXlib2FyZCBldmVudCBoYW5kbGVycyBhcmUgb24gcmVxdWlyZWQgY2hpbGQgZWxlbWVudHMuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcUNoaWxkcmVuID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5yZXFDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxQ2hpbGRyZW4pIHsgLyogU01GIFRPRE8gbWVudWJhciBkb2VzIG5vdCBoYXZlIGFueSByZXFDaGlsZHJlbiAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcmVxdWlyZWRDaGlsZHJlbkxlbmd0aCA9IHJlcUNoaWxkcmVuLmxlbmd0aDsgaSA8IHJlcXVpcmVkQ2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwID0gXCIqW2NvbnRhaW5zKEByb2xlLCdcIiArIHJlcUNoaWxkcmVuW2ldICsgXCInKV1cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdCA9IGRvYy5ldmFsdWF0ZSh4cCwgcnVsZUNvbnRleHQsIFJQVFV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocikge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKHIuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHIuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGlsZCBkaWQgbm90IGhhdmUgYSBrZXkgaGFuZGxlci4gIFNlZSBpZiBhbnkgb2YgdGhlIGdyYW5kY2hpbGRyZW4gZG8uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cDIgPSBcImRlc2NlbmRhbnQ6OipcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0MiA9IGRvYy5ldmFsdWF0ZSh4cDIsIHIsIFJQVFV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcjI6IEVsZW1lbnQgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocjIgJiYgIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMS4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocjIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmlzVGFiYmFibGUocjIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5ZG93blwiKSB8fCByMi5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhpcyBhbiBhY3Rpb24gbGluaz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJhXCIgJiYgcjIuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhyZWYgPSByMi5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aW9uIGxpbmsgbXVzdCBzdGFydCB3aXRoIFwiamF2YXNjcmlwdDpcIiwgbXVzdCBub3QgY29udGFpbiBhIFwidm9pZFwiIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGEgZnVuY3Rpb24gbmFtZSBmb2xsb3dpbmcgXCJqYXZhc2NyaXB0OlwiIChpLmUuLCBocmVmLmxlbmd0aCA+IDExKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKGhyZWYuc3RhcnRzV2l0aChcImphdmFzY3JpcHQ6XCIpICYmIGhyZWYuaW5kZXhPZihcInZvaWRcIikgPT0gLTEgJiYgaHJlZi5sZW5ndGggPiAxMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgdGhlIHJlcXVpcmVkIGNoaWxkcmVuIChvciBhbnkgZGVzY2VuZGFudHMgb2YgdGhlIHJlcXVpcmVkIGNoaWxkcmVuKSBtdXN0IGhhdmUga2V5cHJlc3Mva2V5ZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QsIGl0IGlzIGEgZmFpbHVyZSwgbm8gbmVlZCB0byBrZWVwIGNoZWNraW5nIGFueSBtb3JlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGVsZW1lbnQgZmFpbGVkIHRoZSBrZXlkb3duL2tleXByZXNzLCBhbmQgaXQgZG9lcyBub3QgaGF2ZSByZXF1aXJlZCBjaGlsZHJlbiwgc3VjaCBhcyBtZW51YmFyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQncyBjaGVjayBpdHMgZGVzY2VuZGFudHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cDIgPSBcImRlc2NlbmRhbnQ6OipcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0MiA9IGRvYy5ldmFsdWF0ZSh4cDIsIHJ1bGVDb250ZXh0LCBSUFRVdGlsLmRlZmF1bHROU1Jlc29sdmVyLCAwIC8qIFhQYXRoUmVzdWx0LkFOWV9UWVBFICovLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHIyICYmICFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHIyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5pc1RhYmJhYmxlKHIyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyMi5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikgfHwgcjIuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhpcyBhbiBhY3Rpb24gbGluaz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocjIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImFcIiAmJiByMi5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBocmVmID0gcjIuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpb24gbGluayBtdXN0IHN0YXJ0IHdpdGggXCJqYXZhc2NyaXB0OlwiLCBtdXN0IG5vdCBjb250YWluIGEgXCJ2b2lkXCIgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIG5hbWUgZm9sbG93aW5nIFwiamF2YXNjcmlwdDpcIiAoaS5lLiwgaHJlZi5sZW5ndGggPiAxMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKGhyZWYuc3RhcnRzV2l0aChcImphdmFzY3JpcHQ6XCIpICYmIGhyZWYuaW5kZXhPZihcInZvaWRcIikgPT0gLTEgJiYgaHJlZi5sZW5ndGggPiAxMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRyaWJ1dGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgaXMgc3BlY2lmaWVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyLnB1c2gocm9sZXNbal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQgJiYgc2F2ZWRQYXNzZWQpIHtcbiAgICAgICAgICAgICAgICBzYXZlZFBhc3NlZCA9IHBhc3NlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4yLnB1c2gocm9sZU5hbWVBcnIuam9pbihcIiwgXCIpKTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhpcyBpcyByZWZlcmVuY2VkIGJ5IGEgY29tYm9ib3guIElmIHNvLCBsZWF2ZSBpdCB0byB0aGUgY29tYm9ib3ggcnVsZXMgdG8gY2hlY2tcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgIGlmIChpZCAmJiBpZC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihgKlthcmlhLWNvbnRyb2xzPScke2lkfSddW3JvbGU9J2NvbWJvYm94J11gKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzYXZlZFBhc3NlZCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbm9fa2V5Ym9hcmRfYWNjZXNzXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tcGxlbWVudGFyeSwgYXJpYTpiYW5uZXIsIGFyaWE6Y29udGVudGluZm8sIGFyaWE6bWFpbiwgYXJpYTpuYXZpZ2F0aW9uLCBhcmlhOnJlZ2lvbiwgYXJpYTpzZWFyY2gsIGFyaWE6Zm9ybVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwibGFuZG1hcmtfbmFtZV91bmlxdWVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8wXCI6IFwiRmFpbF8wXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8wXCI6IFwiYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIk11bHRpcGxlIFxcXCJ7MH1cXFwiIGxhbmRtYXJrcyB3aXRoIHRoZSBzYW1lIHBhcmVudCByZWdpb24gYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdW5pcXVlICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiLFxuICAgICAgICAgICAgXCJGYWlsXzBcIjogXCJNdWx0aXBsZSBcXFwiezB9XFxcIiBsYW5kbWFya3Mgd2l0aCB0aGUgc2FtZSBwYXJlbnQgcmVnaW9uIGFyZSBub3QgZGlzdGluZ3Vpc2hlZCBmcm9tIG9uZSBhbm90aGVyIGJlY2F1c2UgdGhleSBoYXZlIHRoZSBzYW1lIFxcXCJ7MX1cXFwiIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTXVsdGlwbGUgbGFuZG1hcmtzIHNob3VsZCBoYXZlIGEgdW5pcXVlICdhcmlhLWxhYmVsbGVkYnknIG9yICdhcmlhLWxhYmVsJyBvciBiZSBuZXN0ZWQgaW4gYSBkaWZmZXJlbnQgcGFyZW50IHJlZ2lvbnNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIFRPRE8gZG8gSSBuZWVkIHRvIGZpdGVyIG91dCBiYWQgY29udGVudGluZm8gbm9kZXM6IFRoZSBmb290ZXIgZWxlbWVudCBpcyBub3QgYSBjb250ZW50aW5mbyBsYW5kbWFyayB3aGVuIGl0IGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgZm9sbG93aW5nIEhUTUw1IHNlY3Rpb25pbmcgZWxlbWVudHM6IGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE3L05PVEUtd2FpLWFyaWEtcHJhY3RpY2VzLTEuMS0yMDE3MTIxNC9leGFtcGxlcy9sYW5kbWFya3MvSFRNTDUuaHRtbFxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIENoZWNraW5nIGlmIHRoaXMgbGFuZG1hcmsgaXMgaW5zaWRlIGEgZGlhbG9nIGVsZW1lbnQuIElmIGl0IGlzIHdlIGFyZSBnb2luZyB0byBza2lwIGNoZWNraW5nIGl0LiBcbiAgICAgICAgdmFyIGNvcHlPZlJ1bGVDb250ZXh0ID0gcnVsZUNvbnRleHQ7XG4gICAgICAgIHZhciBwYXJuZXROb2Rlc09mUnVsZUNvbnRleHQgPSBbXTtcbiAgICAgICAgd2hpbGUgKGNvcHlPZlJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICBwYXJuZXROb2Rlc09mUnVsZUNvbnRleHQudW5zaGlmdChjb3B5T2ZSdWxlQ29udGV4dCk7XG4gICAgICAgICAgICBjb3B5T2ZSdWxlQ29udGV4dCA9IGNvcHlPZlJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcGFybmV0Tm9kZXNPZlJ1bGVDb250ZXh0LmZvckVhY2goZWxlbSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLnRhZ05hbWUgPT0gXCJESUFMT0dcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZSgncm9sZScpID09IFwiZGlhbG9nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgLy8gU2tpcHBpbmcgY2hlY2tpbmcgbGFuZG1hcmtzIHRoYXQgaGFwcGVuIHRvIGJlIGluc2lkZSBkaWFsb2cgZWxlbWVudHNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gQmVnaW5pbmcgZm9ybUNhY2hlIHdvcmtcbiAgICAgICAgbGV0IG93bmVyRG9jdW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBmb3JtQ2FjaGUgOiB7XG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXM6IGFueVtdLFxuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50czogYW55W10sXG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kOiBzdHJpbmdbXVxuICAgICAgICB9ID0gZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZm9ybUNhY2hlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLUVOVEVSSU5HIEZPUk0gQ0FDSEVcIilcbiAgICAgICAgICAgIGZvcm1DYWNoZSA9IHtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXM6IFtdLFxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzOiBbXSxcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzOiBbXSxcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNUZW1wID0gb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgICAgICdhc2lkZSxbcm9sZT1cImNvbXBsZW1lbnRhcnlcIl0sIGZvb3Rlcixbcm9sZT1cImNvbnRlbnRpbmZvXCJdLCBoZWFkZXIsW3JvbGU9XCJiYW5uZXJcIl0sIG1haW4sW3JvbGU9XCJtYWluXCJdLCBuYXYsW3JvbGU9XCJuYXZpZ2F0aW9uXCJdLCBmb3JtLFtyb2xlPVwiZm9ybVwiXSwgc2VjdGlvbixbcm9sZT1cInJlZ2lvblwiXSxbcm9sZT1cInNlYXJjaFwiXSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzID0gQXJyYXkuZnJvbShuYXZpZ2F0aW9uTm9kZXNUZW1wKTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzID0gW107XG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZCA6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgICAgIC8vIFRoaXMgYmxvY2sgb2YgY29kZSBmaWx0ZXJzIG91dCBhbnkgbmF2IGVsZW1lbnRzIHRoYXQgYXJlIHVuZGVyIGFuIGRpYWxvZy4gQXMgdGhvc2UgYXJlIG5vdCBvbmVzIHdlIHdhbnQgdG8gdGVzdCBhZ2FpbnN0IGFzIHdlIGNvbnNpZGVyIGRpYWxvZ3MgYXJlIHNlcGFyYXRlIGxvY2F0aW9ucyBmcm9tIHRoZSByZXN0IG9mIHRoZSBtYWluIHBhZ2UuICAgIFxuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc1dpdGhvdXREaWFsb2dzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhID0gbmF2aWdhdGlvbk5vZGVzW2ldO1xuICAgICAgICAgICAgICAgIGxldCBkaWFsb2dOb2RlRm91bmRGbGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGEpIHtcbiAgICAgICAgICAgICAgICAgICAgYSA9IGEucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLnRhZ05hbWUgPT0gXCJESUFMT0dcIiB8fCBhLmdldEF0dHJpYnV0ZSgncm9sZScpID09IFwiZGlhbG9nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2dOb2RlRm91bmRGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWRpYWxvZ05vZGVGb3VuZEZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzV2l0aG91dERpYWxvZ3MucHVzaChuYXZpZ2F0aW9uTm9kZXNbaV0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzID0gbmF2aWdhdGlvbk5vZGVzV2l0aG91dERpYWxvZ3M7XG5cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgIGxldCBlbHMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgYSA9IG5hdmlnYXRpb25Ob2Rlc1tpXS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHdoaWxlIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIGVscy5wdXNoKGEpO1xuICAgICAgICAgICAgICAgICAgICBhID0gYS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIHBhcmVudHMgb2YgdGhlIGxhbmRtYXJrIG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgbmVhcmVzdCBsYW5kbWFyayBwYXJlbnQgYmFzZWQgb24gdGhlIHRhZ05hbWUgb3IgdGhlIHJvbGUgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdOYW1lVHJpZ2dlciA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQVNJREVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRk9PVEVSXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkZPUk1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiSEVBREVSXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk1BSU5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTkFWXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlNFQ1RJT05cIixcbiAgICAgICAgICAgICAgICAgICAgXS5pbmNsdWRlcyhlbHNbal0udGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlTmFtZVRyaWdnZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsc1tqXS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlTmFtZVRyaWdnZXIgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb21wbGVtZW50YXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb250ZW50aW5mb1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZm9ybVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFubmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYXZpZ2F0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZWdpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNlYXJjaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmNsdWRlcyhlbHNbal0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSk7IC8vIFRPRE8gd2UgYXJlIG5vdCBjb3ZlcmluZyB0aGUgY2FzZSB3aGVyZSBhIGVsZW1lbmVudCB3aXRoIG11bHRpcGxlIHJvbGVzLiBFLmcuIHJvbGUgPSBcImZvcm0gYmFubmVyXCIuIFRoaXMgaXMgYSBpbXByb3ZtZW50IHdlIG1pZ2h0IHdhbnQgdG8gYWRkIGluIHRoZSBmdXR1cmUuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ05hbWVUcmlnZ2VyIHx8IHJvbGVOYW1lVHJpZ2dlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVhcmVzdCBwYXJlbnQtbGFuZG1hcmsgZm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMucHVzaChlbHNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGVscy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG5vZGUgaXMgYXQgdGhlIGhlYWQgb2YgdGhlIGZpbGUgc28gaXQgZG9lcyBub3QgaGF2ZSBhIHBhcmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50cy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIuY29tcHV0ZU5hbWUobmF2aWdhdGlvbk5vZGVzW2ldKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBwYXJlbnRzIG9mIHRoZSBsYW5kbWFyayBub2RlcyB0byBmaW5kIGR1cGxpY2F0ZXNcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBwYXNzXzBfZmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmF2aWdhdGlvbk5vZGVzUGFyZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PT0gaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gY29tcGFyZSBhZ2FpbnN0IG91cnNlbGZzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaWYgc3RhdGVtZW50IGZvY3VzIG9uIHRoZSBjYXNlIHdoZXJlIHRoZSBwYXJlbnQgbGFuZG1hcmsgaXMgbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2ldID09PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2pdID09PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGxvb2tpbmcgYXQgdHdvIHJvb3Qgbm9kZXMsIHNvIHdlIHNob3VsZCBjb21wYXJlIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tpXSkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tqXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdGggbm9kZXMgaGF2ZSB0aGUgc2FtZSByb2xlIEFORFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaGF2ZSB0aGUgc2FtZSAoY29tcHV0ZWQpIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpXSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJGYWlsXzBcIik7IC8vIEZhaWwgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHBhcmVudHMgJiYgc2FtZSBub2RlIHJvbGVzIEJVVCBkaWZmZXJlbnQgY29tcHV0ZWQgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhdCBsZWFzdCBhIFBhc3NfMC4gQnV0IHdlIG5lZWQgdG8gY2hlY2sgYWxsIG5vZGVzIHRvIHNlZSBpZiBhbm90aGVyIG9uZSBmYWlscy4gU28gc2V0IGEgZmxhZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc18wX2ZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzIGJ1dCBkaWZmZXJlbnQgbm9kZSByb2xlcyAvLyBOb3QgYXBwbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tpXSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tqXSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBsb29raW5nIGF0IGEgc2luZ2xlIHJvb3Qgbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlmIHN0YXRlbWVudCBmb2N1cyBvbiB0aGUgY2FzZSB3aGVyZSB0aGUgcGFyZW50IGxhbmRtYXJrIGlzIE5PVCBudWxsXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIERPTVV0aWwuc2FtZU5vZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0aGUgc2FtZSBwYXJlbnQtbGFuZG1hcmsgQU5EXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tpXSkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tqXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdGggbm9kZXMgaGF2ZSB0aGUgc2FtZSByb2xlIEFORFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaGF2ZSB0aGUgc2FtZSAoY29tcHV0ZWQpIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpXSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJGYWlsXzBcIik7IC8vIEZhaWwgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHBhcmVudHMgJiYgc2FtZSBub2RlIHJvbGVzIEJVVCBkaWZmZXJlbnQgY29tcHV0ZWQgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhdCBsZWFzdCBhIFBhc3NfMC4gQnV0IHdlIG5lZWQgdG8gY2hlY2sgYWxsIG5vZGVzIHRvIHNlZSBpZiBhbm90aGVyIG9uZSBmYWlscy4gU28gc2V0IGEgZmxhZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc18wX2ZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzIGJ1dCBkaWZmZXJlbnQgbm9kZSByb2xlcyAvLyBOb3QgYXBwbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlmZmVyZW50IHBhcmVudHMgLy8gTm90IGFwcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NfMF9mbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJQYXNzXzBcIik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJudWxsXCIpOyAvLyBUaGlzIGlzIG5vdCB0aGUga2V5d29yZCBudWxsIG9uIHB1cnBvc2UuIEl0IGlzIGEgc3BhY2Vob2xkZXIgaW4gdGhlIGFycmF5IHNvIGluZGV4ZXMgbWF0Y2ggdXAuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHMgPVxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2RlcyA9IG5hdmlnYXRpb25Ob2RlcztcbiAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNQYXJlbnRzID0gbmF2aWdhdGlvbk5vZGVzUGFyZW50cztcbiAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kID0gbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZDtcbiAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZm9ybUNhY2hlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBUT0RPIEFkZCB2YWxpZGF0aW9uIHRoYXQgYWxsIDMgYXJyYXlzIGFyZSB0aGUgc2FtZSBsZW5ndGhcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tLS0tLUVuZCBmb3JtQ2FjaGVcIilcbiAgICAgICAgfSAvLyBFbmQgZm9ybUNhY2hlXG5cbiAgICAgICAgbGV0IGluZGV4VG9DaGVjayA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5pc1NhbWVOb2RlKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgaW5kZXhUb0NoZWNrID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXhUb0NoZWNrID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kW2luZGV4VG9DaGVja10gPT09IFwiUGFzc18wXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1tpbmRleFRvQ2hlY2tdXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZFtpbmRleFRvQ2hlY2tdID09PSBcIkZhaWxfMFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzBcIixcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNbaW5kZXhUb0NoZWNrXVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaW5kZXhUb0NoZWNrXSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGFyaWFfbWFpbl9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9tYWluX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTptYWluXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZU1haW5zUmVxdWlyZUxhYmVsX0ltcGxpY2l0XzJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9tYWluX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9tYWluX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcIm1haW5cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIHdpdGggXFxcIm1haW5cXFwiIHJvbGUgbXVzdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNvbnRleHRMYWJlbCA9IFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcblxuICAgICAgICBsZXQgcGFyZW50RG9jUm9sZSA9IFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LFxuICAgICAgICAgICAgXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBsZXQgbWFpbnMgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwibWFpblwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFpbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChtYWluc1tpXSA9PT0gcnVsZUNvbnRleHQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmVzdWx0ID0gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICBsZXQgdGhpc1BhcmVudERvY1JvbGUgPSBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoXG4gICAgICAgICAgICAgICAgbWFpbnNbaV0sXG4gICAgICAgICAgICAgICAgXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodGhpc1BhcmVudERvY1JvbGUgPT09IHBhcmVudERvY1JvbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5nZXRBcmlhTGFiZWwobWFpbnNbaV0pID09PSBjb250ZXh0TGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9tYWluX2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZU1haW5zVmlzaWJsZUxhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX21haW5fbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJtYWluXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSB2aXNpYmxlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJtYWluXFxcIiByb2xlIHNob3VsZCBoYXZlIGEgdW5pcXVlIHZpc2libGUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvL2NhbGwgZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4gd2l0aCBjb25zaWRlckltcGxpY2l0IGZsYWcgYXMgdHJ1ZVxuICAgICAgICAvL3NvIHRoYXQgdGhlIG1ldGhvZCByZXR1cnMgPG1haW4+IGVsZW1lbnRzXG4gICAgICAgIGxldCBsYW5kbWFya3MgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwibWFpblwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gUlBUVXRpbC5oYXNVbmlxdWVBcmlhTGFiZWxsZWRieShsYW5kbWFya3MpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOm5hdmlnYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlTmF2aWdhdGlvbkxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwibmF2aWdhdGlvblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcIm5hdmlnYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcIm5hdmlnYXRpb25cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gUlBUVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCAhPT0gXCJcIiAmJiAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIHJ1bGVDb250ZXh0LCAnJywgJycsIFsgbXlMYWJlbCBdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfcGFyZW50X3JlcXVpcmVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcGFyZW50X3JlcXVpcmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9SZXF1aXJlZFBhcmVudF9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcGFyZW50X3JlcXVpcmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9wYXJlbnRfcmVxdWlyZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3BhcmVudF9yZXF1aXJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZWxlbWVudCB3aXRoIGFuIGltcGxpY2l0IG9yIGV4cGxpY2l0IHJvbGUgbXVzdCBiZSBjb250YWluZWQgd2l0aGluIGEgdmFsaWQgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgaXMgbm90IGNvbnRhaW5lZCBpbiBvciBvd25lZCBieSBhbiBlbGVtZW50IHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgcm9sZXM6IFxcXCJ7MX1cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBDaGVjayBGYWlsIDNcbiAgICBhY3Q6IFwiZmY4OWM5XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGEgcHJlc2VudGF0aW9uYWwgY2hpbGQgb2YgYW4gZWxlbWVudFxuICAgICAgICBpZiAoUlBUVXRpbC5zaG91bGRCZVByZXNlbnRhdGlvbmFsQ2hpbGQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb3IgcHJlc2VudGF0aW9uIHJvbGVcbiAgICAgICAgbGV0IHByZXNlbnRhdGlvblJvbGVzID0gW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXTtcbiAgICAgICAgY29uc3QgZm91bmQgPSByb2xlcy5zb21lKHI9PiBwcmVzZW50YXRpb25Sb2xlcy5pbmNsdWRlcyhyKSk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBjb250YWluZXJSb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgdGVzdGVkQ29udGFpbmVyID0gMDtcblxuICAgICAgICBsZXQgYW5jZXN0b3JSb2xlcyA9IGNvbnRleHRIaWVyYXJjaGllc1tcImFyaWFcIl0ubWFwKGluZm8gPT4gaW5mby5yb2xlKTtcbiAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBhbmNlc3RvclJvbGVzW2FuY2VzdG9yUm9sZXMubGVuZ3RoIC0gMl07XG4gICAgICAgIGxldCBjb3VudCA9IDI7XG4gICAgICAgIHdoaWxlIChwYXJlbnRSb2xlID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICBwYXJlbnRSb2xlID0gYW5jZXN0b3JSb2xlc1thbmNlc3RvclJvbGVzLmxlbmd0aCAtIGNvdW50XTtcblxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSAwLCBsZW5ndGggPSByb2xlcy5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0uY29udGFpbmVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0ZXN0ZWRDb250YWluZXIrKztcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb250YWluZXJSb2xlcyA9IGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5jb250YWluZXI7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNvbnRhaW5lcnNMZW5ndGggPSBjb250YWluZXJSb2xlcy5sZW5ndGg7ICFwYXNzZWQgJiYgaSA8IGNvbnRhaW5lcnNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXJlbnRSb2xlID09PSBjb250YWluZXJSb2xlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXNzZWQgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gocm9sZU5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChjb250YWluZXJSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMl0pO1xuICAgICAgICBpZiAodGVzdGVkQ29udGFpbmVyID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpyZWdpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlUmVnaW9uc1VuaXF1ZUxhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIGEgXFxcInJlZ2lvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gUGVyIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE3L05PVEUtd2FpLWFyaWEtcHJhY3RpY2VzLTEuMS0yMDE3MTIxNC9leGFtcGxlcy9sYW5kbWFya3MvSFRNTDUuaHRtbFxuICAgICAgICAvLyBmb3JtIGVsZW1lbnQgc2hvdWxkIG9ubHkgYmUgY29uc2lkZXJlZCBpZiBpdCBoYXMgYW4gYXJpYSBsYWJlbCBvciB0aXRsZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpID09PSBcInJlZ2lvblwiIHx8XG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpIHx8XG4gICAgICAgICAgICAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFSUFRVdGlsLmlzSWRSZWZlclRvU2VsZihydWxlQ29udGV4dCwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSkgfHxcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcInJlZ2lvblwiLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGR1cGVzID0gZ2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBkdXBlc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbXlMYWJlbCA9IFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiZcbiAgICAgICAgICAgICAgICAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtteUxhYmVsXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX3JlZ2lvbl9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpyZWdpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1JlZ2lvbkxhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggYSBcXFwicmVnaW9uXFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYW4gYWNjZXNzaWJsZSBuYW1lXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBpcyBub3QgbGFiZWxlZCB3aXRoIGFuICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZSB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBnZXRSb2xlc1VuZGVmaW5lZEJ5QXJpYSB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX3JvbGVfYWxsb3dlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JvbGVfYWxsb3dlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1ZhbGlkUm9sZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIG11c3QgaGF2ZSBhIHZhbGlkICdyb2xlJyBwZXIgQVJJQSBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSByb2xlICd7MH0nIGRlZmluZWQgb24gdGhlIGVsZW1lbnQgaXMgbm90IHZhbGlkIHBlciBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJTb21lIG9mIHRoZSByb2xlcywgJ3swfScsIGRlZmluZWQgb24gdGhlIGVsZW1lbnQgYXJlIG5vdCB2YWxpZCBwZXIgQVJJQSBzcGVjaWZpY2F0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFJlY2hlY2tcbiAgICBhY3Q6IFwiNjc0YjEwXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHJvbGVTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAocm9sZVN0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaW52YWxpZFJvbGVzID0gZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGlmICghaW52YWxpZFJvbGVzIHx8IGludmFsaWRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJvbGVzID0gcm9sZVN0ci5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgaWYgKGludmFsaWRSb2xlcy5sZW5ndGggPT09IHJvbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsXCIpXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGludmFsaWRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsXCIpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IGlzVGFibGVEZXNjZW5kYW50LCBhcmVSb2xlc0RlZmluZWQgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9yb2xlX3JlZHVuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JvbGVfcmVkdW5kYW50XCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkFuIGV4cGxpY2l0bHktYXNzaWduZWQgQVJJQSByb2xlIGlzIG5vdCByZWR1bmRhbnQgd2l0aCB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JlZHVuZGFudFwiOiBcIlRoZSBleHBsaWNpdGx5LWFzc2lnbmVkIEFSSUEgcm9sZSBcXFwiezB9XFxcIiBpcyByZWR1bmRhbnQgd2l0aCB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVudCA8ezF9PlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGV4cGxpY2l0bHktYXNzaWduZWQgQVJJQSByb2xlIHNob3VsZCBub3QgYmUgcmVkdW5kYW50IHdpdGggdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBlbGVtTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBhcmlhUm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCBmYWxzZSk7XG4gICAgICAgIGlmICghYXJpYVJvbGVzIHx8IGFyaWFSb2xlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICAvLyB0aGUgaW52YWxpZCByb2xlIGNhc2U6IGhhbmRsZWQgYnkgUnB0X0FyaWFfVmFsaWRSb2xlLiBJZ25vcmUgdG8gYXZvaWQgZHVwbGljYXRlZCByZXBvcnRcbiAgICAgICAgbGV0IHJvbGVfZGVmaW5lZCA9IGFyZVJvbGVzRGVmaW5lZChhcmlhUm9sZXMpO1xuICAgICAgICBpZiAoIXJvbGVfZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIGl0J3MgYWxyZWFkeSBmYWlsZWQgaW4gdGhlIHBhcmVudCByZWxhdGlvbiwgdGhlbiBza2lwIHRoaXMgY2hlY2tcbiAgICAgICAgaWYgKFtcInRkXCIsIFwidGhcIiwgXCJ0clwiXS5pbmNsdWRlcyhlbGVtTmFtZSkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRSb2xlID0gaXNUYWJsZURlc2NlbmRhbnQoY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRSb2xlICE9PSBudWxsICYmIHBhcmVudFJvbGUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpbXBsaWNpdFJvbGVzID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMgfHwgaW1wbGljaXRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYVJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMuaW5jbHVkZXMoYXJpYVJvbGVzW2ldKSkgIFxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICBlbHNlICAgICBcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfcmVkdW5kYW50XCIsIFthcmlhUm9sZXNbaV0sIGVsZW1OYW1lXSkpO1xuICAgICAgICB9ICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSAgXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDsgICAgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6c2VhcmNoXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZVNlYXJjaExhbmRtYXJrc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwic2VhcmNoXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwic2VhcmNoXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcInNlYXJjaFwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IFJQVFV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBzZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCAhPT0gXCJcIiAmJiAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcblxuICAgICAgICAvLyByZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMsIGFyZVJvbGVzRGVmaW5lZCwgaXNUYWJsZURlc2NlbmRhbnQsIGdldEludmFsaWRSb2xlcywgZ2V0RGVwcmVjYXRlZEFyaWFSb2xlcywgZ2V0RGVwcmVjYXRlZEFyaWFBdHRyaWJ1dGVzLCBnZXRSb2xlc1VuZGVmaW5lZEJ5QXJpYSB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX3JvbGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9yb2xlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImFyaWFfc2VtYW50aWNzX3JvbGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImFyaWFfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9yb2xlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIEFSSUEgcm9sZSAnezB9JyBpcyBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+XCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSBBUklBIHJvbGUgJ3swfScgaXMgbm90IHZhbGlkIGZvciB0aGUgZWxlbWVudCA8ezF9PiBhbmQgbWF5IGJlIGlnbm9yZWQgYnkgdGhlIGJyb3dzZXIgc2luY2UgdGhlIGVsZW1lbnQgaXMgZm9jdXNhYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVJJQSByb2xlcyBtdXN0IGJlIHZhbGlkIGZvciB0aGUgZWxlbWVudCB0byB3aGljaCB0aGV5IGFyZSBhc3NpZ25lZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIG9ubHkgY2hlayBlbGVtZW50ICgxKSBhbmQgZnJhZ21lbnQgbm9kZXMgKDExKVxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IGFyaWFfcm9sZV9hbGxvd2VkLiBJZ25vcmUgdG8gYXZvaWQgZHVwbGljYXRlZCByZXBvcnRcbiAgICAgICAgY29uc3QgdW5kZWZpbmVkUm9sZXMgPSBnZXRSb2xlc1VuZGVmaW5lZEJ5QXJpYShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICh1bmRlZmluZWRSb2xlcyAmJiB1bmRlZmluZWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZFJvbGVzID0gZ2V0RGVwcmVjYXRlZEFyaWFSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkUm9sZXMgJiYgZGVwcmVjYXRlZFJvbGVzLmxlbmd0aCA+IDApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkQXR0cmlidXRlcyA9IGdldERlcHJlY2F0ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkQXR0cmlidXRlcyAmJiBkZXByZWNhdGVkQXR0cmlidXRlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBkZXBlbmRlbmN5IGNoZWNrOiBpZiBpdCdzIGFscmVhZHkgZmFpbGVkLCB0aGVuIHNraXBcbiAgICAgICAgaWYgKFtcInRkXCIsIFwidGhcIiwgXCJ0clwiXS5pbmNsdWRlcyh0YWdOYW1lKSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBpc1RhYmxlRGVzY2VuZGFudChjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgaWYgKHBhcmVudFJvbGUgIT09IG51bGwgJiYgcGFyZW50Um9sZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRvbVJvbGVzOiBzdHJpbmdbXSA9IFJQVFV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghZG9tUm9sZXMgfHwgZG9tUm9sZXMubGVuZ3RoID09PTApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBjaGVjayB0aGUgJ2dlbmVyaWMnIHJvbGUgZmlyc3RcbiAgICAgICAgaWYgKGRvbVJvbGVzLmluY2x1ZGVzKCdnZW5lcmljJykpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW1wiZ2VuZXJpY1wiLCB0YWdOYW1lXSk7XG4gICAgICAgIFxuICAgICAgICBsZXQgaW52YWxpZFJvbGVzID0gZ2V0SW52YWxpZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGludmFsaWRSb2xlcyA9PT0gbnVsbCB8fCBpbnZhbGlkUm9sZXMubGVuZ3RoID09PTApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIiwgW2RvbVJvbGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZV0pO1xuXG4gICAgICAgIGlmIChpbnZhbGlkUm9sZXMuaW5jbHVkZXMoXCJwcmVzZW50YXRpb25cIikgfHwgaW52YWxpZFJvbGVzLmluY2x1ZGVzKFwibm9uZVwiKSAmJiBSUFRVdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaW52YWxpZFJvbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2ludmFsaWRSb2xlcy5qb2luKFwiLCBcIiksIHRhZ05hbWVdKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChkb21Sb2xlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFtkb21Sb2xlcy5qb2luKFwiLCBcIiksIHRhZ05hbWVdKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuLy8gVGhpcyBydWxlIGlzIGluIHRoZSBzYW1lIGZpbGUgYmVjYXVzZSB0aGVyZSBpcyBhIGRlcGVuZGVuY3kgdGhhdCBhcmlhX3JvbGVfdmFsaWQgcnVucyBmaXJzdCxcbi8vIGFuZCB0aGUgaW5mbyBpcyBwYXNzZWQgYnkgY2FjaGUsIGJ1dCB0aGVyZSBpc24ndCBhIGRlcGVuZGVuY3kgaW4gdGhlIEZhaWxfMiBzY2VuYXJpbywgc28gcmVndWxhclxuLy8gZGVwZW5kZW5jeSBjYW5ub3QgYmUgdXNlZFxuZXhwb3J0IGxldCBhcmlhX2F0dHJpYnV0ZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICAvLyBUaGUgdGhlIEFSSUEgcm9sZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiLCBcImFyaWFfcm9sZV92YWxpZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCI6IFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFSSUEgYXR0cmlidXRlcyBtdXN0IGJlIHZhbGlkIGZvciB0aGUgZWxlbWVudCBhbmQgQVJJQSByb2xlIHRvIHdoaWNoIHRoZXkgYXJlIGFzc2lnbmVkXCIsXG4gICAgICAgICAgICBcIlBhc3NcIjogXCJBUklBIGF0dHJpYnV0ZXMgYXJlIHZhbGlkIGZvciB0aGUgZWxlbWVudCBhbmQgQVJJQSByb2xlXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGVzIFxcXCJ7MH1cXFwiIGFyZSBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+IHdpdGggQVJJQSByb2xlIFxcXCJ7Mn1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGVzIFxcXCJ7MH1cXFwiIGFyZSBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+IHdpdGggaW1wbGljaXQgQVJJQSByb2xlIFxcXCJ7Mn1cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCI1YzAxZWFcIiwgeyBcIjQ2Y2E3ZlwiOiB7IFwiUGFzc1wiOiBcInBhc3NcIiwgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiZmFpbFwiLCBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIjogXCJmYWlsXCJ9fV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gb25seSBjaGVrIGVsZW1lbnQgKDEpXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpZiBubyBhcmlhIGF0dHJpYnV0ZVxuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXM6c3RyaW5nW10gPSBSUFRVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoYXJpYUF0dHJpYnV0ZXMgPT09IG51bGwgfHwgYXJpYUF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgICAgIGxldCByb2xlczogc3RyaW5nW10gPSBSUFRVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgZXhwbGljaXQgPSB0cnVlO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgICAgICBpZiAoIWFyZVJvbGVzRGVmaW5lZChyb2xlcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL25vIGV4cGxpY2l0IHJvbGUgZGVmaW5lZFxuICAgICAgICAgICAgcm9sZXMgPSAgUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZXhwbGljaXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBmYWlsZWRBdHRyaWJ1dGVzID0gZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFmYWlsZWRBdHRyaWJ1dGVzIHx8IGZhaWxlZEF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiLCBbYXJpYUF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCByb2xlcy5qb2luKFwiLCBcIildKTtcblxuICAgICAgICBpZiAocm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGV4cGxpY2l0KVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIiwgW2ZhaWxlZEF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCByb2xlcy5qb2luKFwiLCBcIildKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCIsIFtmYWlsZWRBdHRyaWJ1dGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZSwgcm9sZXMuam9pbihcIiwgXCIpXSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIiwgW2ZhaWxlZEF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCBcIm5vbmVcIl0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6dG9vbGJhclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVUb29sYmFyVW5pcXVlTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIHRvb2xiYXIgY29tcG9uZW50cyBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWxsIHRvb2xiYXIgY29tcG9uZW50cyBvbiBhIHBhZ2UgbXVzdCBoYXZlIHVuaXF1ZSBsYWJlbHMgc3BlY2lmaWVkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJ0b29sYmFyXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IFJQVFV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBzZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfd2lkZ2V0X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfV2lkZ2V0TGFiZWxzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV93aWRnZXRfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3dpZGdldF9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbnRlcmFjdGl2ZSBjb21wb25lbnQgbXVzdCBoYXZlIGEgcHJvZ3JhbW1hdGljYWxseSBhc3NvY2lhdGVkIG5hbWVcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSW50ZXJhY3RpdmUgY29tcG9uZW50IHdpdGggQVJJQSByb2xlICd7MH0nIGRvZXMgbm90IGhhdmUgYSBwcm9ncmFtbWF0aWNhbGx5IGFzc29jaWF0ZWQgbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCJtNmIxcTNcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvKiByZW1vdmVkIHRoZSByb2xlIGNoZWNrIHJvbGU9IHByZXNlbnRhdGlvbiBhbmQgcm9sZT1ub25lIHNpbmNlIHRoZXNlIDIgcm9sZXMgYXJlIG5vdCBpbiB0aGUgbGlzdCBvZiB3aWRnZXQgdHlwZSByb2xlcyAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJlxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiaGlkZGVuXCIpIHx8XG4gICAgICAgICAgICAoUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpICYmXG4gICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSB8fFxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJzZWFyY2hib3hcIilcbiAgICAgICAgICAgICAgICApKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZGlhZ25vc2UgdGhhdCBhIGNvbWJvYm94IGlucHV0IHRleHRib3ggaGFzIGEgbGFiZWwoZ2l0aHViIGlzc3VlICMxMTA0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbVJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSGFuZGxlZCBieSBpbnB1dF9sYWJlbF9leGlzdHNcbiAgICAgICAgbGV0IHNraXBSb2xlcyA9IFtcbiAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcImNoZWNrYm94XCIsXG4gICAgICAgICAgICBcImNvbWJvYm94XCIsXG4gICAgICAgICAgICBcImxpc3Rib3hcIixcbiAgICAgICAgICAgIFwibWVudWl0ZW1jaGVja2JveFwiLFxuICAgICAgICAgICAgXCJtZW51aXRlbXJhZGlvXCIsXG4gICAgICAgICAgICBcInJhZGlvXCIsXG4gICAgICAgICAgICBcInNlYXJjaGJveFwiLFxuICAgICAgICAgICAgXCJzbGlkZXJcIixcbiAgICAgICAgICAgIFwic3BpbmJ1dHRvblwiLFxuICAgICAgICAgICAgXCJzd2l0Y2hcIixcbiAgICAgICAgICAgIFwidGV4dGJveFwiLFxuICAgICAgICAgICAgXCJwcm9ncmVzc2JhclwiLFxuICAgICAgICAgICAgXCJsaW5rXCIsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChza2lwUm9sZXMuaW5jbHVkZXMoZWxlbVJvbGUpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFnTmFtZSA9PT0gXCJvdXRwdXRcIiB8fFxuICAgICAgICAgICAgKHRhZ05hbWUgPT09IFwiaW5wdXRcIiAmJlxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiZmlsZVwiKVxuICAgICAgICApIHtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIC8vIEZvcm0vaW5wdXQgZWxlbWVudHMgYXJlIGNoZWNrZWQgYnkgRzQxLCB3ZSBza2lwIHRoZW0gZnJvbSB0aGlzIHJ1bGUuIEdpdGh1YiBpc3N1ZSA0NDlcbiAgICAgICAgICAgIGxldCBza2lwRWxlbWVudHMgPSBbXG4gICAgICAgICAgICAgICAgXCJpbnB1dFwiLFxuICAgICAgICAgICAgICAgIFwidGV4dGFyZWFcIixcbiAgICAgICAgICAgICAgICBcInNlbGVjdFwiLFxuICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgXCJkYXRhbGlzdFwiLFxuICAgICAgICAgICAgICAgIFwib3B0Z3JvdXBcIixcbiAgICAgICAgICAgICAgICBcIm9wdGlvblwiLFxuICAgICAgICAgICAgICAgIFwia2V5Z2VuXCIsXG4gICAgICAgICAgICAgICAgXCJvdXRwdXRcIixcbiAgICAgICAgICAgICAgICBcInByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgXCJtZXRlclwiLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBza2lwRWxlbWVudHMuaW5kZXhPZihydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSAhPVxuICAgICAgICAgICAgICAgIC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF2b2lkIGRpYWdub3NpbmcgdGhlIHBvcHVwIGxpc3Qgb2YgYSBjb21ib2JveC5cbiAgICAgICAgbGV0IHJvbGVzVG9DaGVjayA9IFtcImxpc3Rib3hcIiwgXCJ0cmVlXCIsIFwiZ3JpZFwiLCBcImRpYWxvZ1wiXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlc1RvQ2hlY2subGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgcm9sZXNUb0NoZWNrW2pdKSkge1xuICAgICAgICAgICAgICAgIGxldCBjb21ib2JveGVzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICAgICAgXCJjb21ib2JveFwiLFxuICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbWJvYm94ZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ID0gY29tYm9ib3hlc1trXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyaWFfb3ducyA9IFJQVFV0aWwuZ2V0RWxlbWVudEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJvYm94LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhcmlhLW93bnNcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJpYV9vd25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3ducyA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhX293bnMudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICApLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ducy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25lZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duc1tpXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHByb2hpYml0ZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICAvL2dldCBhdHRyaWJ1dGUgcm9sZXMgYXMgd2VsbCBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIGxldCBudW1XaWRnZXRzVGVzdGVkID0gMDtcbiAgICAgICAgbGV0IGludGVyYWN0aXZlUm9sZVR5cGVzID0gW1wid2lkZ2V0XCIsIFwibGl2ZVJlZ2lvblwiLCBcIndpbmRvd1wiXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJvbGVzLmxlbmd0aDsgcGFzc2VkICYmIGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tpXV07XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwYXR0ZXJuICYmXG4gICAgICAgICAgICAgICAgcGF0dGVybi5uYW1lUmVxdWlyZWQgJiZcbiAgICAgICAgICAgICAgICBwYXR0ZXJuLnJvbGVUeXBlICYmXG4gICAgICAgICAgICAgICAgaW50ZXJhY3RpdmVSb2xlVHlwZXMuaW5jbHVkZXMocGF0dGVybi5yb2xlVHlwZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICsrbnVtV2lkZ2V0c1Rlc3RlZDtcblxuICAgICAgICAgICAgICAgIC8vIEFsbCB3aWRnZXRzIG1heSBoYXZlIGFuIGF1dGhvciBzdXBwbGllZCBhY2Nlc3NpYmxlIG5hbWUuXG4gICAgICAgICAgICAgICAgLy8gVGl0bGUgaXMgbGVnYWwsIGJ1dCBkb24ndCBhZHZlcnRpc2UgaXRzIHVzZSBpbiBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgICAgICAgIC8vIEVuY291cmFnZSB1c2Ugb2YgYXJpYS1sYWJlbCwgYXJpYS1sYWJlbGxlZGJ5IG9yIGh0bWwgbGFiZWwgZWxlbWVudC5cbiAgICAgICAgICAgICAgICBwYXNzZWQgPVxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSB8fFxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICFwYXNzZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5uYW1lRnJvbSAmJlxuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLm5hbWVGcm9tLmluZGV4T2YoXCJjb250ZW50c1wiKSA+PSAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBpZiB3aWRnZXQncyBhY2Nlc3NpYmxlIG5hbWUgaXMgc3VwcGxpZWQgYnkgZWxlbWVudCdzIGlubmVyIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLy8gbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaGFzSW5uZXJDb250ZW50T3JBbHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGhhcyBpbXBsaWNpdCBsYWJlbCwgbGlrZSA8bGFiZWw+PGlucHV0IC4uLi4+YWJjIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaGFzSW1wbGljaXRMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhcGFzc2VkICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIERPTVV0aWwuY2xlYW5XaGl0ZXNwYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgKS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5uYW1lRnJvbS5pbmRleE9mKFwicHJvaGliaXRlZFwiKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2hpYml0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChudW1XaWRnZXRzVGVzdGVkID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2VsZW1Sb2xlXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1RPRE9cbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYXNjaWlhcnRfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhc2NpaWFydF9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206cHJlLCBkb206bGlzdGluZywgZG9tOnhtcCwgZG9tOnBsYWludGV4dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1ByZV9BU0NJSUFydFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhc2NpaWFydF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJhc2NpaWFydF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhc2NpaWFydF9hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBBU0NJSSBhcnQgaGFzIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFTQ0lJIGFydCBtdXN0IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogRGVjaXNpb24gaW4gcGxhbm5pbmcgOS83LzIzIHRoYXQgdGhpcyBydWxlIGNhdXNlcyBtb3JlIHJldmlld3MgdGhhdCB3ZSBzZWUgYWN0dWFsIHByb2JsZW1zIGluIGNvbnRlbnQsIHNvIHR1cm4gdGhlc2UgcnVsZXMgb2ZmXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgKi9cbiAgICBydWxlc2V0czogW10sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIEZpeCBmb3IgSURXQiB3cml0ZXJzLiBEb24ndCB0cmlnZ2VyIGlmIGNvbnRlbnQgaXMgaW4gYSBjb2RlIGVsZW1lbnQuICBUaGUgY29kZSBlbGVtZW50IGlzIHNlYXJjaGVkIGZvclxuICAgICAgICAvLyBpbiB2YXJpb3VzIHBsYWNlcyBiZWNhdXNlIG9mIHRoZSB3ZWlyZCB3YXkgdmFyaW91cyBicm93c2VycyByZW5kZXIgPGNvZGU+PHByZT48L3ByZT48L2NvZGUuICBGaXJlZm94LFxuICAgICAgICAvLyBIdG1sVW5pdCBhbmQgQ2hyb21lIGFsbCByZW5kZXIgZGlmZmVyZW50bHkuICBGaXJlZm94OiA8Y29kZT48L2NvZGU+PHByZT48L3ByZT4gIEh0bWxVbml0OiA8L2NvZGU+PHByZT48Y29kZT48L2NvZGU+PC9wcmU+XG4gICAgICAgIC8vIFNlZSB1bml0IHRlc3QgQ29kZUVsZW1lbnRBYm92ZVByZUVsZW1lbnQuaHRtbC4gIERvbid0IGtub3cgaG93IFJQVCByZW5kZXJzLCBzbyBjb3ZlciBhbGwgdGhlIGJhc2VzLlxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInByZVwiKSB7XG4gICAgICAgICAgICBpZiAoKHJ1bGVDb250ZXh0LnByZXZpb3VzU2libGluZyAmJiBydWxlQ29udGV4dC5wcmV2aW91c1NpYmxpbmcubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImNvZGVcIikgfHxcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNvZGVcIikubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgIFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiY29kZVwiKSkge1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0eHRWYWx1ZSA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgPSAwO1xuICAgICAgICBsZXQgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IDA7XG4gICAgICAgIGxldCBsYXN0Q2hhcmFjdGVyID0gXCJcIjtcblxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHRleHQgY29udGVudFxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBwYXNzZWQgJiYgKGlkeCA8IHR4dFZhbHVlLmxlbmd0aCk7ICsraWR4KSB7XG4gICAgICAgICAgICBsZXQgY2hTdHIgPSB0eHRWYWx1ZS5zdWJzdHIoaWR4LCAxKTtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGFscGhhbnVtZXJpYyBvciBwdW5jdHVhdGlvblxuICAgICAgICAgICAgaWYgKC9bXFx3IUAjJCUmXFwqKCkuLD9cXFtcXF17fTw+PVwiOlxcL1xcXFwtXS8udGVzdChjaFN0cikpIHtcbiAgICAgICAgICAgICAgICAvLyBEZXRlY3Qgc2FtZSBjaGFyYWN0ZXIgc2VxdWVuY2VcbiAgICAgICAgICAgICAgICBpZiAobGFzdENoYXJhY3RlciA9PSBjaFN0cikge1xuICAgICAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCArIDE7O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL1xccy8udGVzdChjaFN0cikpIHtcbiAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9uQWxwaGFOdW1lcmljTm9yU3BhY2VDb3VudCA9IG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgKyAxO1xuICAgICAgICAgICAgICAgIGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdENoYXJhY3RlciA9IGNoU3RyO1xuXG4gICAgICAgICAgICAvLyBNYWtlIHRoZSBkZWNpc2lvblxuICAgICAgICAgICAgaWYgKG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgPj0gNSB8fCBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID49IDQpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYmxpbmtfY3NzX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJibGlua19jc3NfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0JsaW5rX0NTU1RyaWdnZXIxXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYmxpbmtfY3NzX3Jldmlldy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBibGlua19jc3NfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYmxpbmtfY3NzX3Jldmlldy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJEbyBub3QgdXNlIHRoZSBcXFwiYmxpbmtcXFwiIHZhbHVlIG9mIHRoZSAndGV4dC1kZWNvcmF0aW9uJyBwcm9wZXJ0eSBmb3IgbG9uZ2VyIHRoYW4gZml2ZSBzZWNvbmRzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ2hlY2sgdGhlIFxcXCJibGlua1xcXCIgdmFsdWUgb2YgdGhlIENTUyAndGV4dC1kZWNvcmF0aW9uJyBwcm9wZXJ0eSBpcyBub3QgdXNlZCBmb3IgbW9yZSB0aGFuIHRoYW4gZml2ZSBzZWNvbmRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIyLjIuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHRleHRWYWx1ZSA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZSgnc3R5bGUnKSkge1xuICAgICAgICAgICAgdGV4dFZhbHVlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRleHRWYWx1ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJ0ZXh0LWRlY29yYXRpb246YmxpbmtcIikgPT0gLTE7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgYmxpbmtfZWxlbV9kZXByZWNhdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImJsaW5rX2VsZW1fZGVwcmVjYXRlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJsaW5rXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQmxpbmtfQWx3YXlzVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYmxpbmtfZWxlbV9kZXByZWNhdGVkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGJsaW5rX2VsZW1fZGVwcmVjYXRlZC5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBibGlua19lbGVtX2RlcHJlY2F0ZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29udGVudCB0aGF0IGJsaW5rcyBwZXJzaXN0ZW50bHkgbXVzdCBub3QgYmUgdXNlZFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDb250ZW50IGZvdW5kIHRoYXQgYmxpbmtzIHBlcnNpc3RlbnRseVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgbnVtOiBcIjIuMi4yXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgfVxufVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBibG9ja3F1b3RlX2NpdGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpibG9ja3F1b3RlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfQmxvY2txdW90ZV9IYXNDaXRlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IDxibG9ja3F1b3RlPiBzaG91bGQgbm90IGJlIHVzZWQgb25seSBmb3IgcXVvdGF0aW9ucywgbm90IGluZGVudGF0aW9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlIDxibG9ja3F1b3RlPiBvbmx5IGZvciBxdW90YXRpb25zLCBub3QgaW5kZW50YXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiY2l0ZVwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCBjaXRlRWxlbXMgPSBSUFRVdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiY2l0ZVwiKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNpdGVFbGVtcyAhPSBudWxsICYmIGNpdGVFbGVtcy5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmNhbnZhc1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19DYW52YXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJjYW52YXNfY29udGVudF9kZXNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGFjY2Vzc2liaWxpdHkgb2YgdGhlIDxjYW52YXM+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgPGNhbnZhcz4gZWxlbWVudCBtYXkgbm90IGJlIGFjY2Vzc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCIsIFwiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0LmlubmVySFRNTC50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgY2FwdGlvbl90cmFja19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY2FwdGlvbl90cmFja19leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTp2aWRlb1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19WaWRlb19IYXNOb1RyYWNrXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImNhcHRpb25fdHJhY2tfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJjYXB0aW9uX3RyYWNrX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY2FwdGlvbl90cmFja19leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGNhcHRpb25zIGFyZSBhdmFpbGFibGUgZm9yIGFueSBtZWFuaW5nZnVsIGF1ZGlvIG9yIHByb3ZpZGUgYSBjYXB0aW9uIHRyYWNrIGZvciB0aGUgPHZpZGVvPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8dmlkZW8+IGVsZW1lbnQgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZSBmb3IgYW55IG1lYW5pbmdmdWwgYXVkaW8gY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4yLjFcIiwgXCIxLjIuMlwiLCBcIjEuMi40XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxWaWRlb0VsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBpZ25vcmUgZGVjb3JhdGl2ZSB2aWRlbyBpZiB1c2VyIHVzZXMgYXJpYS1oaWRkZW5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHJhY2tzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0cmFja1wiKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcGFzc2VkID0gcGFzc2VkIHx8IHRyYWNrc1tpXS5nZXRBdHRyaWJ1dGUoXCJraW5kXCIpID09PSAnY2FwdGlvbnMnO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrcyBmb3IgYWRkaXRpb24gb2YgZHluYW1pYyB0cmFja3NcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRleHRUcmFja3MgJiYgcnVsZUNvbnRleHQudGV4dFRyYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJ1bGVDb250ZXh0LnRleHRUcmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgcnVsZUNvbnRleHQudGV4dFRyYWNrc1tpXS5raW5kID09PSAnY2FwdGlvbnMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IGdldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX21pc3NpbmdcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm90X2luX3BvcHVwXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2FjdGl2ZV9yb2xlX2ludmFsaWRcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCInYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBpcyB1c2VkIGFwcHJvcHJpYXRlbHkgZm9yIHRoaXMgY29tYm9ib3hcIixcbiAgICAgICAgICAgIFwiRmFpbF9taXNzaW5nXCI6IFwiVGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBcXFwiezB9XFxcIiBkb2VzIG5vdCBleGlzdFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF9pbl9wb3B1cFwiOiBcIlRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgXFxcInswfVxcXCIgZG9lcyBub3QgZXhpc3Qgd2l0aGluIHRoZSBwb3B1cCByZWZlcmVuY2VkIGJ5ICdpZCcgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfcm9sZV9pbnZhbGlkXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIHJlZmVyZW5jZXMgYW4gZWxlbWVudCB3aXRoIHRoZSByb2xlcyBcXFwiezF9XFxcIiwgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZSBvZiAnb3B0aW9uJywgJ2dyaWRjZWxsJywgJ3JvdycsIG9yICd0cmVlaXRlbSdcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfbm90X3NlbGVjdGVkXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIHJlZmVyZW5jZXMgYW4gZWxlbWVudCB0aGF0IGRvZXMgbm90IGhhdmUgJ2FyaWEtc2VsZWN0ZWQnIHNldCB0byB0cnVlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgbXVzdCBiZSB1c2VkIHRvIGRlZmluZSBmb2N1cyB3aXRoaW4gdGhlIGNvbWJvYm94IHBvcHVwLCBleGNlcHQgd2hlbiB1c2luZyBhIGRpYWxvZyBwb3B1cFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNhY2hlID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGxldCBjYWNoZWRFbGVtID0gY2FjaGVbY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aF07XG4gICAgICAgIGlmICghY2FjaGVkRWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHsgcG9wdXBFbGVtZW50LCBwb3B1cElkIH0gPSBjYWNoZWRFbGVtO1xuICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGRlZmluZWQsIHRoZSBjb21ib2JveCBpcyBwcm9iYWJseSBjb2xsYXBzZWQuIEEgcmVmZXJlbmNlIGVycm9yIGlzXG4gICAgICAgIC8vIGRldGVjdGVkIGluIGNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVxuICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gVGhpcyBydWxlIG9ubHkgYXBwbGllcyBpZiB0aGUgYWN0aXZlZGVzY2VuZGFudCBpcyBzcGVjaWZpZWRcbiAgICAgICAgbGV0IGFjdGl2ZUlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICBpZiAoIWFjdGl2ZUlkIHx8IGFjdGl2ZUlkLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFjdGl2ZUVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgYWN0aXZlSWQpO1xuICAgICAgICBpZiAoIWFjdGl2ZUVsZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfbWlzc2luZ1wiLCBbYWN0aXZlSWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGV4YW1pbmUgdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChwb3B1cEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHBvcHVwRWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAoIWZvdW5kICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBwb3B1cEVsZW1lbnQgJiYgbncubm9kZSAhPSBwb3B1cEVsZW1lbnQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwiaWRcIikgPT09IGFjdGl2ZUlkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcblxuICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlUGFzcyhcIkZhaWxfbm90X2luX3BvcHVwXCIsIFthY3RpdmVJZCwgcG9wdXBJZF0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhY3RpdmVSb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMoYWN0aXZlRWxlbSwgdHJ1ZSk7XG4gICAgICAgIGxldCB2YWxpZFJvbGVzID0gW1wib3B0aW9uXCIsIFwiZ3JpZGNlbGxcIiwgXCJyb3dcIiwgXCJ0cmVlaXRlbVwiXS5maWx0ZXIoKHZhbGlkUm9sZSkgPT4gYWN0aXZlUm9sZXMuaW5jbHVkZXModmFsaWRSb2xlKSk7XG4gICAgICAgIGlmICh2YWxpZFJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX2FjdGl2ZV9yb2xlX2ludmFsaWRcIiwgW2FjdGl2ZUlkLCBhY3RpdmVSb2xlcy5qb2luKFwiLFwiKV0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3RpdmVFbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgIT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiLCBbYWN0aXZlSWRdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBOb2RlV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJjb21ib2JveF9hdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbmxpbmVcIjogXCJGYWlsX2lubGluZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW5saW5lXCI6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiVGhlIGNvbWJvYm94IGRvZXMgbm90IHVzZSAnYXJpYS1hdXRvY29tcGxldGUnIHZhbHVlICdcXFwiaW5saW5lXFxcIicgbm9yIGRvZXMgaXQgaGF2ZSAnYXJpYS1hdXRvY29tcGxldGUnIGRlZmluZWQgd2l0aGluIHRoZSBwb3B1cFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgY29tYm9ib3ggaGFzIHRoZSAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSBpbmNvcnJlY3RseSBzZXQgb24gYW4gZWxlbWVudCB3aXRoaW4gdGhlIHBvcHVwIHJlZmVyZW5jZWQgYnkgXFxcInswfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbmxpbmVcIjogXCJUaGUgY29tYm9ib3ggZG9lcyBub3Qgc3VwcG9ydCBhbiAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgdG8gJ1xcXCJpbmxpbmVcXFwiJyBcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGNvbWJvYm94IHRoYXQgc3VwcG9ydHMgYXV0b2NvbXBsZXRpb24gYmVoYXZpb3IgbXVzdCBoYXZlIHRoZSAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSBvbmx5IG9uIGl0cyB0ZXh0IGlucHV0IGVsZW1lbnQgd2l0aCBhIHZhbGlkIHZhbHVlOyBhIHZhbHVlIG9mICdcXFwiaW5saW5lXFxcIicgaXMgbm90IHN1cHBvcnRlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgY2FjaGUgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgbGV0IGNhY2hlZEVsZW0gPSBjYWNoZVtjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoXTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cElkLCBwb3B1cEVsZW1lbnQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYXV0b2NvbXBsZXRlXCIpID09PSBcImlubGluZVwiKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfaW5saW5lXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlOyBcbiAgICAgICAgLy8gZXhhbWluZSB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKHBvcHVwRWxlbWVudCAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgLy8gaWYgcG9wdXBFbGVtZW50IGl0c2VsZiBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBwYXNzZWQgPSAhcG9wdXBFbGVtZW50Lmhhc0F0dHJpYnV0ZShcImFyaWEtYXV0b2NvbXBsZXRlXCIpO1xuICAgICAgICAgICAgLy8gaWYgYW55IGNoaWxkIG9mIHBvcHVwRWxlbWVudCBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBpZiAocGFzc2VkICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbiAmJiBwb3B1cEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHBvcHVwRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiBudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gIW53LmVsZW0oKS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWF1dG9jb21wbGV0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudy5iRW5kVGFnICYmIG53Lm5vZGUgPT09IHBvcHVwRWxlbWVudC5sYXN0RWxlbWVudENoaWxkKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfMVwiLCBbcG9wdXBJZF0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmZ1bmN0aW9uIHBhdHRlcm5EZXRlY3QoZWxlbTogRWxlbWVudCk6IFN0cmluZyB7XG4gICAgLy8gY2hlY2sgJ2V4cGxpY2l0JyByb2xlIGNvbWJvYm94IGFuZCB0aGF0IGl0IGlzIG5vdCA8c2VsZWN0Pi4gXG4gICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNlbGVjdFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSAhPT0gXCJjb21ib2JveFwiKSB7XG4gICAgICAgIHJldHVybiBcImltcGxpY2l0XCI7XG4gICAgfSBlbHNlIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIlxuICAgICAgICAmJiAoIWVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwidGV4dFwiKVxuICAgICAgICAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSAmJiAhZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgIC8vIExvb2tzIGxpa2UgdGhpcyBpcyBhbiBBUklBIDEuMCBwYXR0ZXJuLCB3aGljaCB0aGUgQVJJQSAxLjIgc3BlYyBzYXlzIHRvIGNvbnRpbnVlIHRvIGFsbG93XG4gICAgICAgIHJldHVybiBcIjEuMFwiO1xuICAgIH0gZWxzZSBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImlucHV0XCJcbiAgICAgICAgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikgJiYgIWVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSkge1xuICAgICAgICAvLyBMb29rcyBsaWtlIHRoaXMgaXMgYW4gQVJJQSAxLjEgcGF0dGVybiwgd2hpY2ggdGhlIEFSSUEgMS4yIHNwZWMgc2F5cyBpcyBub3cgaW52YWxpZFxuICAgICAgICByZXR1cm4gXCIxLjFcIjtcbiAgICB9XG4gICAgLy8gQXNzdW1lIHRoZXkncmUgdHJ5aW5nIHRvIGRvIHRoZSBsYXRlc3QsIDEuMiBwYXR0ZXJuXG4gICAgcmV0dXJuIFwiMS4yXCI7XG59XG5cbmV4cG9ydCBsZXQgY29tYm9ib3hfZGVzaWduX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiY29tYm9ib3hfdmVyc2lvblwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMS4wXCI6IFwiUGFzc18xLjBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjFcIjogXCJGYWlsXzEuMVwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMlwiOiBcIlBhc3NfMS4yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMFwiOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4xXCI6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMS4wXCI6IFwiVGhlIGNvbWJvYm94IGRlc2lnbiBwYXR0ZXJuIGlzIGRldGVjdGVkIGFzIEFSSUEgMS4wLCB3aGljaCBpcyBhbGxvd2VkIGJ5IEFSSUEgMS4yXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4xXCI6IFwiVGhlIGNvbWJvYm94IGRlc2lnbiBwYXR0ZXJuIGlzIGRldGVjdGVkIGFzIEFSSUEgMS4xLCB3aGljaCBpcyBub3QgYWxsb3dlZCBieSBBUklBIDEuMlwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMlwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBpcyBkZXRlY3RlZCBhcyBBUklBIDEuMlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBtdXN0IGJlIHZhbGlkIGZvciBBUklBIDEuMlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXR0ZXJuID0gcGF0dGVybkRldGVjdChydWxlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gV2UgZG9uJ3QgYXNzZXNzIG5hdGl2ZSBzZWxlY3QgZWxlbWVudHMgaGVyZVxuICAgICAgICBpZiAocGF0dGVybiA9PT0gXCJpbXBsaWNpdFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgZXhwYW5kZWQgPSAoUlBUVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtZXhwYW5kZWRcIikgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgICBsZXQgZWRpdGFibGUgPSB0YWdOYW1lID09PSBcImlucHV0XCIgJiYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpIHx8IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIpO1xuXG4gICAgICAgIGxldCBrZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBsZXQgY2FjaGUgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgICAgIGNhY2hlW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgXCJpbnB1dEVsZW1lbnRcIjogZWRpdGFibGUgPyBydWxlQ29udGV4dCA6IG51bGwsXG4gICAgICAgICAgICAgICAgXCJwYXR0ZXJuXCI6IHBhdHRlcm4sXG4gICAgICAgICAgICAgICAgXCJleHBhbmRlZFwiOiBleHBhbmRlZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwgY2FjaGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8geHBhdGg/XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcIjEuMFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzEuMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMlwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50czogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub3RfdGFiYmFibGVcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX3RhYmJhYmxlX2NoaWxkXCI6IFwiY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiRE9NIGZvY3VzIGlzIGFsbG93ZWQgb25seSBvbiB0aGUgY29tYm9ib3ggZWxlbWVudCBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF90YWJiYWJsZVwiOiBcIlRoZSBjb21ib2JveCBlbGVtZW50IGRvZXMgbm90IGFsbG93IERPTSBmb2N1cyBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX3RhYmJhYmxlX2NoaWxkXCI6IFwiVGhlIHBvcHVwIG9mIHRoZSBjb21ib2JveCBoYXMgRE9NIGZvY3VzIG9yIGhhcyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBkZWZpbmVkLCB3aGljaCBpcyBub3QgYWxsb3dlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRhYmJhYmxlIGZvY3VzIGZvciB0aGUgY29tYm9ib3ggbXVzdCBiZSBhbGxvd2VkIG9ubHkgb24gdGhlIHRleHQgaW5wdXQsIGV4Y2VwdCB3aGVuIHVzaW5nIGEgZGlhbG9nIHBvcHVwXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBjYWNoZSA9IGdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBsZXQgY2FjaGVkRWxlbSA9IGNhY2hlW2NvbnRleHRbXCJkb21cIl0ucm9sZVBhdGhdO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwRWxlbWVudCwgZXhwYW5kZWQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIGNvbWJvYm94IGlzIHByb2JhYmx5IGNvbGxhcHNlZC4gQSByZWZlcmVuY2UgZXJyb3IgaXNcbiAgICAgICAgLy8gZGV0ZWN0ZWQgaW4gY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXG4gICAgICAgIGlmICghcG9wdXBFbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBwb3B1cFJvbGUgPSBSUFRVdGlsLmdldFJvbGVzKHBvcHVwRWxlbWVudCwgdHJ1ZSlbMF07XG5cbiAgICAgICAgbGV0IHJldFZhbCA9IFtdXG4gICAgICAgIGlmICghUlBUVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX25vdF90YWJiYWJsZVwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IG1ha2VzIHNlbnNlIHRvIGNoZWNrIHRoZSBwb3B1cCB3aGVuIGV4cGFuZGVkXG4gICAgICAgIC8vIHRoaXMgZG9lcyBub3QgYXBwbHkgdG8gZGlhbG9ncywgcmV0dXJuIHBhc3Mgc2luY2UgdGhlIG1haW4gZWxlbWVudCB3YXMgZm9jdXNhYmxlIGFib3ZlXG4gICAgICAgIGlmIChleHBhbmRlZCA9PT0gZmFsc2UgfHwgcG9wdXBSb2xlID09PSBcImRpYWxvZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gZXhhbWluZSB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKHBvcHVwRWxlbWVudCAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBvcHVwRWxlbWVudCkpIHtcbiAgICAgICAgICAgIC8vIGlmIHBvcHVwRWxlbWVudCBpdHNlbGYgaGFzIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCJcbiAgICAgICAgICAgIHBhc3NlZCA9ICFSUFRVdGlsLmlzVGFiYmFibGUocG9wdXBFbGVtZW50KSAmJiAhUlBUVXRpbC5nZXRBcmlhQXR0cmlidXRlKHBvcHVwRWxlbWVudCwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7O1xuICAgICAgICAgICAgLy8gaWYgYW55IGNoaWxkIG9mIHBvcHVwRWxlbWVudCBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBpZiAocGFzc2VkICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbiAmJiBwb3B1cEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHBvcHVwRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiBudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gIVJQVFV0aWwuaXNUYWJiYWJsZShudy5ub2RlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFSUFRVdGlsLmdldEFyaWFBdHRyaWJ1dGUobncubm9kZSwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobncuYkVuZFRhZyAmJiBudy5ub2RlID09PSBwb3B1cEVsZW1lbnQubGFzdEVsZW1lbnRDaGlsZCkgYnJlYWs7ICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF90YWJiYWJsZV9jaGlsZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBjb21ib2JveF9oYXNwb3B1cF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiY29tYm9ib3hfaGFzcG9wdXBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiOiBcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwiOiBcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIjogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwiOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIChBUklBIDEuMikgb3IgJ2FyaWEtb3ducycgKEFSSUEgMS4wKSBhcHByb3ByaWF0ZWx5IHJlZmVyZW5jZXMgYSB2YWxpZCBwb3B1cCAnaWQnIHZhbHVlXCIsXG4gICAgICAgICAgICBcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCI6IFwiVGhlICdyb2xlJyB2YWx1ZSBcXFwiezB9XFxcIiBvZiB0aGUgcG9wdXAgZWxlbWVudCBcXFwiezF9XFxcIiBzaG91bGQgYmUgb25lIG9mIFxcXCJsaXN0Ym94XFxcIiwgXFxcImdyaWRcXFwiLCBcXFwidHJlZVxcXCIgb3IgXFxcImRpYWxvZ1xcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCI6IFwiVGhlIHZhbHVlIG9mIHRoZSBjb21ib2JveCAnYXJpYS1oYXNwb3B1cCcgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IG1hdGNoIHRoZSAncm9sZScgdmFsdWUgb2YgdGhlIHBvcHVwIGVsZW1lbnQgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgY29tYm9ib3ggYXR0cmlidXRlICdhcmlhLWhhc3BvcHVwJyB2YWx1ZSBtdXN0IGJlIGFwcHJvcHJpYXRlIGZvciB0aGUgcm9sZSBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2VkIGJ5ICdhcmlhLWNvbnRyb2xzJyAoQVJJQSAxLjIpIG9yICdhcmlhLW93bnMnIChBUklBIDEuMClcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBjb25zdCBjYWNoZWRFbGVtID0gY2FjaGVbY2FjaGVLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwRWxlbWVudCwgcG9wdXBJZCB9ID0gY2FjaGVkRWxlbTtcbiAgICAgICAgLy8gSWYgdGhpcyBpc24ndCBkZWZpbmVkLCB0aGUgY29tYm9ib3ggaXMgcHJvYmFibHkgY29sbGFwc2VkLiBBIHJlZmVyZW5jZSBlcnJvciBpc1xuICAgICAgICAvLyBkZXRlY3RlZCBpbiBjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcbiAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBDaGVjayB0aGF0IHBvcHVwIHJvbGUgaXMgbGlzdGJveCwgZ3JpZCwgdHJlZSwgb3IgZGlhbG9nIGFuZCB0aGF0IGl0IG1hdGNoZXMgdGhlIGNvbWJvYm94XG4gICAgICAgIGxldCBwb3B1cFJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhwb3B1cEVsZW1lbnQsIHRydWUpO1xuICAgICAgICBsZXQgdmFsaWRSb2xlcyA9IFtcImxpc3Rib3hcIiwgXCJncmlkXCIsIFwidHJlZVwiLCBcImRpYWxvZ1wiXS5maWx0ZXIoKHZhbGlkUm9sZSkgPT4gcG9wdXBSb2xlcy5pbmNsdWRlcyh2YWxpZFJvbGUpKTtcbiAgICAgICAgaWYgKHZhbGlkUm9sZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiLCBbcG9wdXBSb2xlcy5qb2luKFwiLFwiKSwgcG9wdXBJZF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBvcHVwUm9sZSA9IHZhbGlkUm9sZXNbMF07XG4gICAgICAgICAgICBsZXQgaGFzcG9wdXBWYWwgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIpIHx8IFwibGlzdGJveFwiO1xuICAgICAgICAgICAgLy8gUG9wdXAgcm9sZSBtdXN0IG1hdGNoIGFyaWEtaGFzcG9wdXAgdW5sZXNzIHBvcHVwUm9sZSBpcyBsaXN0Ym94LCB0aGVuIGFyaWEtaGFzcG9wdXAgc2hvdWxkIG5vdCBiZSBkZWZpbmVkICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGhhc3BvcHVwVmFsICE9PSBwb3B1cFJvbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9wdXBSb2xlICE9PSBcImxpc3Rib3hcIiB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwiLCBbaGFzcG9wdXBWYWwsIHBvcHVwUm9sZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBjb21ib2JveF9wb3B1cF9yZWZlcmVuY2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9kZXNpZ25fdmFsaWRcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMF9leHBhbmRlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2NvbGxhcHNlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2V4cGFuZGVkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfY29sbGFwc2VkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfY29sbGFwc2VkX3Zpc2libGVcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnYXJpYS1jb250cm9scycgKGZvciBBUklBIDEuMikgb3IgdGhlICdhcmlhLW93bnMnIChmb3IgQVJJQSAxLjApIGF0dHJpYnV0ZSBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggbXVzdCByZWZlcmVuY2UgYSB2YWxpZCBwb3B1cCAnaWQnIHZhbHVlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2V4cGFuZGVkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIHJlZmVyZW5jZWQgYnkgJ2FyaWEtb3ducycgKEFSSUEgMS4wKSBleGlzdHMgYW5kIGlzIHZpc2libGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfY29sbGFwc2VkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIGluIGl0cyBjb2xsYXBzZWQgc3RhdGUgZG9lcyBub3QgcmVmZXJlbmNlIGFueSB2aXNpYmxlIHBvcHVwIGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2V4cGFuZGVkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIHJlZmVyZW5jZWQgYnkgJ2FyaWEtY29udHJvbHMnIChBUklBIDEuMikgZXhpc3RzIGFuZCBpcyB2aXNpYmxlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiOiBcIlRoZSBjb21ib2JveCBwb3B1cCBpbiBpdHMgY29sbGFwc2VkIHN0YXRlIGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgdmlzaWJsZSBwb3B1cCBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIjogXCJUaGUgJ2FyaWEtb3ducycgYXR0cmlidXRlIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBpcyBtaXNzaW5nXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIGF0dHJpYnV0ZSBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggaXMgbWlzc2luZ1wiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcIlRoZSAnYXJpYS1vd25zJyBhdHRyaWJ1dGUgXFxcInswfVxcXCIgb2YgdGhlIGV4cGFuZGVkIGNvbWJvYm94IGRvZXMgbm90IHJlZmVyZW5jZSBhIHZhbGlkIHBvcHVwICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggZG9lcyBub3QgcmVmZXJlbmNlIGEgdmFsaWQgcG9wdXAgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcIlRoZSBjb21ib2JveCAnYXJpYS1leHBhbmRlZCcgYXR0cmlidXRlIGlzIHRydWUsIGJ1dCB0aGUgY29tYm9ib3ggcG9wdXAgaXMgbm90IHZpc2libGVcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9jb2xsYXBzZWRfdmlzaWJsZVwiOiBcIlRoZSBjb21ib2JveCAnYXJpYS1leHBhbmRlZCcgYXR0cmlidXRlIGlzIGZhbHNlLCBidXQgdGhlIGNvbWJvYm94IHBvcHVwIGlzIHZpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiNGU4YWI2XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBfZXhwYW5kZWRcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2NvbGxhcHNlZFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfZXhwYW5kZWRcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2NvbGxhcHNlZF92aXNpYmxlXCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aDtcbiAgICAgICAgY29uc3QgY2FjaGVkRWxlbSA9IGNhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwYXR0ZXJuLCBleHBhbmRlZCB9ID0gY2FjaGVkRWxlbTtcblxuICAgICAgICBsZXQgcG9wdXBJZDtcbiAgICAgICAgbGV0IHBvcHVwRWxlbWVudDtcbiAgICAgICAgaWYgKHBhdHRlcm4gPT09IFwiMS4wXCIpIHtcbiAgICAgICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbWJvYm94IGlzbid0IGV4cGFuZGVkLCB0aGlzIGF0dHJpYnV0ZSBpc24ndCByZXF1aXJlZFxuICAgICAgICAgICAgICAgIHJldHVybiAhZXhwYW5kZWQgPyBudWxsIDogUnVsZUZhaWwoXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3B1cElkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpO1xuICAgICAgICAgICAgcG9wdXBFbGVtZW50ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIHBvcHVwSWQpO1xuICAgICAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tYm9ib3ggaXNuJ3QgZXhwYW5kZWQsIHRoaXMgYXR0cmlidXRlIGlzbid0IHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuICFleHBhbmRlZCA/IG51bGwgOiBSdWxlRmFpbChcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCIsIFtwb3B1cElkXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PT0gXCIxLjJcIikge1xuICAgICAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbWJvYm94IGlzbid0IGV4cGFuZGVkLCB0aGlzIGF0dHJpYnV0ZSBpc24ndCByZXF1aXJlZFxuICAgICAgICAgICAgICAgIHJldHVybiAhZXhwYW5kZWQgPyBudWxsIDogUnVsZUZhaWwoXCJGYWlsXzEuMl9taXNzaW5nX2NvbnRyb2xzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9wdXBJZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIik7XG4gICAgICAgICAgICBwb3B1cEVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgcG9wdXBJZCk7XG4gICAgICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb21ib2JveCBpc24ndCBleHBhbmRlZCwgdGhpcyBhdHRyaWJ1dGUgaXNuJ3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gIWV4cGFuZGVkID8gbnVsbCA6IFJ1bGVGYWlsKFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIiwgW3BvcHVwSWRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgaGF2ZSBhbiBlbGVtZW50LCBzdGljayBpdCBpbiB0aGUgY2FjaGUgYW5kIHRoZW4gY2hlY2sgaXRzIHJvbGVcbiAgICAgICAgY2FjaGVkRWxlbS5wb3B1cElkID0gcG9wdXBJZDtcbiAgICAgICAgY2FjaGVkRWxlbS5wb3B1cEVsZW1lbnQgPSBwb3B1cEVsZW1lbnQ7XG5cblxuICAgICAgICBpZiAoZXhwYW5kZWQgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShwb3B1cEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiKTtcbiAgICAgICAgfSBlbHNlIGlmICghZXhwYW5kZWQgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBvcHVwRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfY29tYm9ib3hfY29sbGFwc2VkX3Zpc2libGVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0dGVybiA9PT0gXCIxLjBcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKGV4cGFuZGVkID8gXCJQYXNzXzEuMF9leHBhbmRlZFwiIDogXCJQYXNzXzEuMF9jb2xsYXBzZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoZXhwYW5kZWQgPyBcIlBhc3NfMS4yX2V4cGFuZGVkXCIgOiBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBkZWJ1Z19wYXRoczogUnVsZSA9IHtcbiAgICBpZDogXCJkZWJ1Z19wYXRoc1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIkRFQlVHXCJdLFxuICAgICAgICBudW06IFwiMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LklORk9STUFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgcnVsZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiZG9tUGF0aFwiLCBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoKTtcbiAgICAgICAgcnVsZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiYXJpYVBhdGhcIiwgY29udGV4dFtcImFyaWFcIl0ucm9sZVBhdGgpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgZGV0ZWN0b3JfdGFiYmFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZGV0ZWN0b3JfdGFiYmFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJFWFRFTlNJT05TXCJdLFxuICAgICAgICBudW06IFwiMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LklORk9STUFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFSUFRVdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGllckNvbnRleHQgPSBjb250ZXh0SGllcmFyY2hpZXMuYXJpYVtjb250ZXh0SGllcmFyY2hpZXMuYXJpYS5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFtdLCBbe1xuICAgICAgICAgICAgbmFtZTogaGllckNvbnRleHQuYXR0cmlidXRlcy5uYW1lLFxuICAgICAgICAgICAgcm9sZTogaGllckNvbnRleHQucm9sZSxcbiAgICAgICAgICAgIHRhYmluZGV4OiBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBcIjBcIilcbiAgICAgICAgfV0pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBkaXJfYXR0cmlidXRlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImRpcl9hdHRyaWJ1dGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2Rpcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlZhbGVyaWVfRWxlbV9EaXJWYWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImRpcl9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJkaXJfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJkaXJfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSW52YWxpZCB2YWx1ZSB1c2VkIGZvciB0aGUgJ2RpcicgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiJ2RpcicgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgXFxcImx0clxcXCIsIFxcXCJydGxcXFwiLCBvciBcXFwiYXV0b1xcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGRpclN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImRpclwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gZGlyU3RyID09IFwibHRyXCIgfHwgZGlyU3RyID09IFwicnRsXCIgfHwgZGlyU3RyID09IFwiYXV0b1wiO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206YVtocmVmXSxkb206YXJlYVtocmVmXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19NZWRpYV9Eb2N1bWVudFRyaWdnZXIyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImRvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBmaWxlIGRvd25sb2FkIG1lY2hhbmlzbSBkb2VzIG5vdCBjYXVzZSBhIGtleWJvYXJkIHRyYXBcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJGaWxlIGRvd25sb2FkIG1lY2hhbmlzbXMgc2hvdWxkIGJlIGtleWJvYXJkLW9wZXJhYmxlIGFuZCBwcmVzZXJ2ZSBwYWdlIGZvY3VzIGxvY2F0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGhyZWYgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICBsZXQgZXh0ID0gUlBUVXRpbC5nZXRGaWxlRXh0KGhyZWYpO1xuICAgICAgICBsZXQgcGFzc2VkID0gIVtcIi5kb2N4XCIsIFwiLmRvY1wiLCBcIi5wZGZcIiwgXCIub2R0XCJdLmluY2x1ZGVzKGV4dCk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgbGV0IGVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlthY2Nlc3NrZXldXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FjY2Vzc2tleV9OZWVkTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVGhlIEhUTUwgZWxlbWVudCB3aXRoIGFuIGFzc2lnbmVkICdhY2Nlc3NrZXknIGF0dHJpYnV0ZSBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBIVE1MIGVsZW1lbnQgd2l0aCBhbiBhc3NpZ25lZCAnYWNjZXNza2V5JyBhdHRyaWJ1dGUgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsXCIpKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKFJQVFV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKHJ1bGVDb250ZXh0LCB0cnVlKSkgeyAvLyBpZ25vcmUgaGlkZGVuXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICAvLyBhc3N1bWUgdGhlIHZhbGlkaXR5IG9mIHRoZSBpZCAob2YgYXJpYS1sYWJlbGxlZGJ5KSBpcyBjaGVja2VkIGJ5IGEgZGlmZmVyZW50IHJ1bGVcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiXG4gICAgICAgICAgICAmJiBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJsYWJlbFwiKSB7XG4gICAgICAgICAgICAvLyBhc3N1bWUgdGhlIHZhbGlkaXR5IG9mIHRoZSBsYWJlbCwgZS5nLiBlbXB0eSBsYWJlbCwgaXMgY2hlY2tlZCBieSBhIGRpZmZlcmVudCBydWxlXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGdldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYWNjZXNza2V5XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0VsZW1fVW5pcXVlQWNjZXNzS2V5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCInYWNjZXNza2V5JyBhdHRyaWJ1dGUgdmFsdWUgb24gdGhlIGVsZW1lbnQgaXMgbm90IHVuaXF1ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidhY2Nlc3NrZXknIGF0dHJpYnV0ZSB2YWx1ZXMgb24gZWFjaCBlbGVtZW50IG11c3QgYmUgdW5pcXVlIGZvciB0aGUgcGFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbWFwID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWVcIiwge30pO1xuXG4gICAgICAgIGxldCBrZXkgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhY2Nlc3NrZXlcIik7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9ICEoa2V5IGluIG1hcCk7XG4gICAgICAgIG1hcFtrZXldID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmNvbnN0IERFUFJFQ0FURURfRUxFTUVOVFMgPSBbXG4gICAgLyoqIG9yaWdpbmFsICovXG4gICAgXCJhcHBsZXRcIiwgXCJiYXNlZm9udFwiLCBcImNlbnRlclwiLCBcImRpclwiLCBcImZvbnRcIiwgXCJpc2luZGV4XCIsIFwibGlzdGluZ1wiLFxuICAgIFwicGxhaW50ZXh0XCIsIFwic3BhY2VyXCIsIFwic1wiLCBcInN0cmlrZVwiLCBcInVcIiwgXCJ4bXBcIixcbiAgICAvKiogYWRkZWQgZnJvbSBodHRwczovL2Rldi53My5vcmcvaHRtbDUvcGYtc3VtbWFyeS9vYnNvbGV0ZS5odG1sICovXG4gICAgXCJhY3JvbnltXCIsIFwiZnJhbWVcIiwgXCJmcmFtZXNldFwiLCBcIm5vZnJhbWVzXCIsIFwibm9lbWJlZFwiLCBcImJpZ1wiLCBcImJsaW5rXCIsIFwibWFycXVlZVwiLCBcInR0XCIsXG5cbl1cblxuY29uc3QgREVQUkVDQVRFRF9IVE1MX0dMT0JBTF9BVFRSSUJVVEVTID0gW1xuICAgIC8qKiBvcmlnaW5hbCAqL1xuICAgIFwiYWxpZ25cIiwgXCJsaW5rXCIsIFwiYXJjaGl2ZVwiLCBcImJhY2tncm91bmRcIiwgXCJiZ2NvbG9yXCIsIFwiY2xlYXJcIiwgXCJjb2RlXCIsIFwiY29sb3JcIixcbiAgICBcImNvbXBhY3RcIiwgXCJmYWNlXCIsIFwiaHNwYWNlXCIsIFwibGFuZ3VhZ2VcIiwgXCJsaW5rXCIsIFwibm9zaGFkZVwiLCBcIm5vd3JhcFwiLCBcIm9iamVjdFwiLFxuICAgIFwicHJvbXB0XCIsIFwic3RhcnRcIiwgXCJ0ZXh0XCIsIFwidmVyc2lvblwiLCBcInZsaW5rXCIsIFwidnNwYWNlXCJcbl1cblxuY29uc3QgREVQUkVDQVRFRF9FTEVNRU5UX0FUVFJJQlVURVMgPSB7XG4gICAgLyoqIG9yaWdpbmFsICovXG4gICAgXCJ0ZFwiOiBbXCJoZWlnaHRcIiwgXCJ3aWR0aFwiLCBcImFiYnJcIiwgXCJheGlzXCIsIFwiY2hhclwiLCBcImNoYXJvZmZcIiwgXCJoZWlnaHRcIiwgXCJub3dyYXBcIiwgXCJ2YWxpZ25cIiwgXCJ3aWR0aFwiLCBcImFsaWduXCIsIFwiYmdjb2xvclwiXSxcbiAgICBcInRoXCI6IFtcImhlaWdodFwiLCBcIndpZHRoXCIsIFwiYWJiclwiLCBcImF4aXNcIiwgXCJjaGFyb2ZmXCIsIFwiaGVpZ2h0XCIsIFwiYmdjb2xvclwiLCBcImFsaWduXCIsIFwibm93cmFwXCIsIFwiY2hhclwiLCBcInZhbGlnblwiLCBcIndpZHRoXCJdLFxuICAgIFwibGlcIjogW1widHlwZVwiLCBcInZhbHVlXCIsIFwidHlwZVwiXSxcbiAgICBcInVsXCI6IFtcInR5cGVcIiwgXCJjb21wYWN0XCJdLFxuICAgIFwicHJlXCI6IFtcIndpZHRoXCJdLFxuXG4gICAgLyoqIGFkZGVkIGZyb20gaHR0cHM6Ly9kZXYudzMub3JnL2h0bWw1L3BmLXN1bW1hcnkvb2Jzb2xldGUuaHRtbCAqL1xuICAgIFwibWV0YVwiOiBbXCJodHRwLWVxdWl2XCJdLFxuICAgIFwiYVwiOiBbXCJjaGFyc2V0XCIsIFwiY29vcmRzXCIsIFwic2hhcGVcIiwgXCJyZXZcIiwgXCJzY2hlbWVcIl0sXG4gICAgXCJsaW5rXCI6IFtcInJldlwiLCBcImNoYXJzZXRcIiwgXCJ0YXJnZXRcIl0sXG4gICAgXCJpbWdcIjogW1wibmFtZVwiLCBcImxvbmdkZXNjXCIsIFwiYWxpZ25cIiwgXCJoc3BhY2VcIiwgXCJ2c3BhY2VcIiwgXCJib3JkZXJcIl0sXG4gICAgXCJhcmVhXCI6IFtcIm5vaHJlZlwiXSxcbiAgICBcImhlYWRcIjogW1wicHJvZmlsZVwiXSxcbiAgICBcImh0bWxcIjogW1widmVyc2lvblwiXSxcbiAgICBcImlmcmFtZVwiOiBbXCJsb25nZGVzY1wiLCBcImFsaWduXCIsIFwiZnJhbWVib3JkZXJcIiwgXCJtYXJnaW5oZWlnaHRcIiwgXCJtYXJnaW53aWR0aFwiLCBcInNjcm9sbGluZ1wiXSxcbiAgICBcIm9iamVjdFwiOiBbXCJhcmNoaXZlXCIsIFwiY29kZVwiLCBcImNvZGViYXNlXCIsIFwiY29kZXR5cGVcIiwgXCJkZWNsYXJlXCIsIFwic3RhbmRieVwiLCBcImFsaWduXCIsIFwiaHNwYWNlXCIsIFwidnNwYWNlXCIsIFwiYm9yZGVyXCJdLFxuICAgIFwicGFyYW1cIjogW1widHlwZVwiLCBcInZhbHVldHlwZVwiXSxcbiAgICBcInNjcmlwdFwiOiBbXCJsYW5ndWFnZVwiXSxcbiAgICBcImJvZHlcIjogW1wiYWxpbmtcIiwgXCJiYWNrZ3JvdW5kXCIsIFwiYmdjb2xvclwiLCBcImxpbmtcIiwgXCJ0ZXh0XCIsIFwidmxpbmtcIl0sXG4gICAgXCJiclwiOiBbXCJjbGVhclwiXSxcbiAgICBcImNhcHRpb25cIjogW1wiYWxpZ25cIl0sXG4gICAgXCJjb2xcIjogW1wiYWxpZ25cIiwgXCJjaGFyXCIsIFwiY2hhcm9mZlwiLCBcInZhbGlnblwiLCBcIndpZHRoXCJdLFxuICAgIFwiZGl2XCI6IFtcImFsaWduXCJdLFxuICAgIFwiZGxcIjogW1wiY29tcGFjdFwiXSxcbiAgICBcImhyXCI6IFtcImFsaWduXCIsIFwibm9zaGFkZVwiLCBcInNpemVcIiwgXCJ3aWR0aFwiLCBcImFsaWduXCJdLFxuICAgIFwiaDJcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJoM1wiOiBbXCJhbGlnblwiXSxcbiAgICBcImg0XCI6IFtcImFsaWduXCJdLFxuICAgIFwiaDVcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJoNlwiOiBbXCJhbGlnblwiXSxcbiAgICBcImlucHV0XCI6IFtcImFsaWduXCIsIFwidXNlbWFwXCJdLFxuICAgIFwibGVnZW5kXCI6IFtcImFsaWduXCJdLFxuICAgIFwibWVudVwiOiBbXCJjb21wYWN0XCJdLFxuICAgIFwib2xcIjogW1wiY29tcGFjdFwiLCBcInR5cGVcIiwgXCJ0eXBlXCJdLFxuICAgIFwicFwiOiBbXCJhbGlnblwiXSxcbiAgICBcInRhYmxlXCI6IFtcImJnY29sb3JcIiwgXCJjZWxscGFkZGluZ1wiLCBcImNlbGxzcGFjaW5nXCIsIFwiZnJhbWVcIiwgXCJydWxlc1wiLCBcIndpZHRoXCIsIFwiYWxpZ25cIl0sXG4gICAgXCJ0Ym9keVwiOiBbXCJhbGlnblwiLCBcImNoYXJcIiwgXCJ2YWxpZ25cIiwgXCJjaGFyb2ZmXCJdLFxuICAgIFwidGZvb3RcIjogW1wiYWxpZ25cIiwgXCJjaGFyb2ZmXCIsIFwiY2hhclwiLCBcInZhbGlnblwiXSxcbiAgICBcInRoZWFkXCI6IFtcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwidmFsaWduXCIsIFwiYWxpZ25cIl0sXG4gICAgXCJ0clwiOiBbXCJhbGlnblwiLCBcImJnY29sb3JcIiwgXCJjaGFyXCIsIFwiY2hhcm9mZlwiLCBcInZhbGlnblwiXVxufVxuXG5mdW5jdGlvbiBhcnJheVRvQ29udGV4dFN0cihvYmosIHR5cGUpIHtcbiAgICBsZXQgc3RyID0gXCJcIjtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2Ygb2JqKSB7XG4gICAgICAgIGlmIChzdHIgIT09ICcnICYmICFzdHIuZW5kc1dpdGgoJywgJykpIHN0ciArPSBcIiwgXCI7XG4gICAgICAgIGlmICh0eXBlID09PSAnSFRNTF9FTEVNRU5UUycpXG4gICAgICAgICAgICBzdHIgKz0gJ2RvbTonICsgcHJvcDtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ0hUTUxfQVRUUklCVVRFUycpXG4gICAgICAgICAgICBzdHIgKz0gJ2RvbToqWycgKyBwcm9wICsgXCJdXCI7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5cbmZ1bmN0aW9uIG9ialRvQ29udGV4dFN0cihvYmosIHR5cGU6IHN0cmluZykge1xuICAgIGxldCBzdHIgPSBcIlwiO1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgaWYgKHN0ciAhPT0gJycgJiYgIXN0ci5lbmRzV2l0aCgnLCAnKSkgc3RyICs9IFwiLCBcIjtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdIVE1MX0VMRU1FTlRfQVRUUklCVVRFUycpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBvYmpbcHJvcF0gYXMgU3RyaW5nW10pIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyICE9PSAnJyAmJiAhc3RyLmVuZHNXaXRoKFwiLCBcIikpIHN0ciArPSBcIiwgXCI7XG4gICAgICAgICAgICAgICAgc3RyICs9ICdkb206JyArIHByb3AgKyAnWycgKyBpdGVtICsgJ10nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IFxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuXG5leHBvcnQgbGV0IGVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFwcGxldCwgZG9tOmJhc2Vmb250LCBkb206Y2VudGVyLCBkb206ZGlyLCBkb206Zm9udCwgZG9tOmlzaW5kZXgsIGRvbTpsaXN0aW5nLCBkb206bWVudSwgZG9tOnBsYWludGV4dCwgZG9tOnNwYWNlciwgZG9tOnMsIGRvbTpzdHJpa2UsIGRvbTp1LCBkb206eG1wLCBkb206YWNyb255bSwgZG9tOmZyYW1lLCBkb206ZnJhbWVzZXQsIGRvbTpub2ZyYW1lcywgZG9tOm5vZW1iZWQsIGRvbTpiaWcsIGRvbTpibGluaywgZG9tOm1hcnF1ZWUsIGRvbTp0dE5hTmRvbToqW2FsaWduXSwgZG9tOipbbGlua10sIGRvbToqW2FyY2hpdmVdLCBkb206KltiYWNrZ3JvdW5kXSwgZG9tOipbYmdjb2xvcl0sIGRvbToqW2NsZWFyXSwgZG9tOipbY29kZV0sIGRvbToqW2NvbG9yXSwgZG9tOipbY29tcGFjdF0sIGRvbToqW2ZhY2VdLCBkb206Kltoc3BhY2VdLCBkb206KltsYW5ndWFnZV0sIGRvbToqW2xpbmtdLCBkb206Kltub3NoYWRlXSwgZG9tOipbbm93cmFwXSwgZG9tOipbb2JqZWN0XSwgZG9tOipbcHJvbXB0XSwgZG9tOipbc3RhcnRdLCBkb206Klt0ZXh0XSwgZG9tOipbdmVyc2lvbl0sIGRvbToqW3ZsaW5rXSwgZG9tOipbdnNwYWNlXU5hTmRvbTp0ZFtoZWlnaHRdLCBkb206dGRbd2lkdGhdLCBkb206dGRbYWJicl0sIGRvbTp0ZFtheGlzXSwgZG9tOnRkW2NoYXJdLCBkb206dGRbY2hhcm9mZl0sIGRvbTp0ZFtoZWlnaHRdLCBkb206dGRbbm93cmFwXSwgZG9tOnRkW3ZhbGlnbl0sIGRvbTp0ZFt3aWR0aF0sIGRvbTp0ZFthbGlnbl0sIGRvbTp0ZFtiZ2NvbG9yXSwgZG9tOnRoW2hlaWdodF0sIGRvbTp0aFt3aWR0aF0sIGRvbTp0aFthYmJyXSwgZG9tOnRoW2F4aXNdLCBkb206dGhbY2hhcm9mZl0sIGRvbTp0aFtoZWlnaHRdLCBkb206dGhbYmdjb2xvcl0sIGRvbTp0aFthbGlnbl0sIGRvbTp0aFtub3dyYXBdLCBkb206dGhbY2hhcl0sIGRvbTp0aFt2YWxpZ25dLCBkb206dGhbd2lkdGhdLCBkb206bGlbdHlwZV0sIGRvbTpsaVt2YWx1ZV0sIGRvbTpsaVt0eXBlXSwgZG9tOnVsW3R5cGVdLCBkb206dWxbY29tcGFjdF0sIGRvbTpwcmVbd2lkdGhdLCBkb206bWV0YVtodHRwLWVxdWl2XSwgZG9tOmFbY2hhcnNldF0sIGRvbTphW2Nvb3Jkc10sIGRvbTphW3NoYXBlXSwgZG9tOmFbcmV2XSwgZG9tOmFbc2NoZW1lXSwgZG9tOmxpbmtbcmV2XSwgZG9tOmxpbmtbY2hhcnNldF0sIGRvbTpsaW5rW3RhcmdldF0sIGRvbTppbWdbbmFtZV0sIGRvbTppbWdbbG9uZ2Rlc2NdLCBkb206aW1nW2FsaWduXSwgZG9tOmltZ1toc3BhY2VdLCBkb206aW1nW3ZzcGFjZV0sIGRvbTppbWdbYm9yZGVyXSwgZG9tOmFyZWFbbm9ocmVmXSwgZG9tOmhlYWRbcHJvZmlsZV0sIGRvbTpodG1sW3ZlcnNpb25dLCBkb206aWZyYW1lW2xvbmdkZXNjXSwgZG9tOmlmcmFtZVthbGlnbl0sIGRvbTppZnJhbWVbZnJhbWVib3JkZXJdLCBkb206aWZyYW1lW21hcmdpbmhlaWdodF0sIGRvbTppZnJhbWVbbWFyZ2lud2lkdGhdLCBkb206aWZyYW1lW3Njcm9sbGluZ10sIGRvbTpvYmplY3RbYXJjaGl2ZV0sIGRvbTpvYmplY3RbY29kZV0sIGRvbTpvYmplY3RbY29kZWJhc2VdLCBkb206b2JqZWN0W2NvZGV0eXBlXSwgZG9tOm9iamVjdFtkZWNsYXJlXSwgZG9tOm9iamVjdFtzdGFuZGJ5XSwgZG9tOm9iamVjdFthbGlnbl0sIGRvbTpvYmplY3RbaHNwYWNlXSwgZG9tOm9iamVjdFt2c3BhY2VdLCBkb206b2JqZWN0W2JvcmRlcl0sIGRvbTpwYXJhbVt0eXBlXSwgZG9tOnBhcmFtW3ZhbHVldHlwZV0sIGRvbTpzY3JpcHRbbGFuZ3VhZ2VdLCBkb206Ym9keVthbGlua10sIGRvbTpib2R5W2JhY2tncm91bmRdLCBkb206Ym9keVtiZ2NvbG9yXSwgZG9tOmJvZHlbbGlua10sIGRvbTpib2R5W3RleHRdLCBkb206Ym9keVt2bGlua10sIGRvbTpicltjbGVhcl0sIGRvbTpjYXB0aW9uW2FsaWduXSwgZG9tOmNvbFthbGlnbl0sIGRvbTpjb2xbY2hhcl0sIGRvbTpjb2xbY2hhcm9mZl0sIGRvbTpjb2xbdmFsaWduXSwgZG9tOmNvbFt3aWR0aF0sIGRvbTpkaXZbYWxpZ25dLCBkb206ZGxbY29tcGFjdF0sIGRvbTpoclthbGlnbl0sIGRvbTpocltub3NoYWRlXSwgZG9tOmhyW3NpemVdLCBkb206aHJbd2lkdGhdLCBkb206aHJbYWxpZ25dLCBkb206aDJbYWxpZ25dLCBkb206aDNbYWxpZ25dLCBkb206aDRbYWxpZ25dLCBkb206aDVbYWxpZ25dLCBkb206aDZbYWxpZ25dLCBkb206aW5wdXRbYWxpZ25dLCBkb206aW5wdXRbdXNlbWFwXSwgZG9tOmxlZ2VuZFthbGlnbl0sIGRvbTptZW51W2NvbXBhY3RdLCBkb206b2xbY29tcGFjdF0sIGRvbTpvbFt0eXBlXSwgZG9tOm9sW3R5cGVdLCBkb206cFthbGlnbl0sIGRvbTp0YWJsZVtiZ2NvbG9yXSwgZG9tOnRhYmxlW2NlbGxwYWRkaW5nXSwgZG9tOnRhYmxlW2NlbGxzcGFjaW5nXSwgZG9tOnRhYmxlW2ZyYW1lXSwgZG9tOnRhYmxlW3J1bGVzXSwgZG9tOnRhYmxlW3dpZHRoXSwgZG9tOnRhYmxlW2FsaWduXSwgZG9tOnRib2R5W2FsaWduXSwgZG9tOnRib2R5W2NoYXJdLCBkb206dGJvZHlbdmFsaWduXSwgZG9tOnRib2R5W2NoYXJvZmZdLCBkb206dGZvb3RbYWxpZ25dLCBkb206dGZvb3RbY2hhcm9mZl0sIGRvbTp0Zm9vdFtjaGFyXSwgZG9tOnRmb290W3ZhbGlnbl0sIGRvbTp0aGVhZFtjaGFyXSwgZG9tOnRoZWFkW2NoYXJvZmZdLCBkb206dGhlYWRbdmFsaWduXSwgZG9tOnRoZWFkW2FsaWduXSwgZG9tOnRyW2FsaWduXSwgZG9tOnRyW2JnY29sb3JdLCBkb206dHJbY2hhcl0sIGRvbTp0cltjaGFyb2ZmXSwgZG9tOnRyW3ZhbGlnbl1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbVwiOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2F0dHJcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbGVtX2F0dHJcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IGlzIGRlcHJlY2F0ZWQgaW4gSFRNTCA1XCIsXG4gICAgICAgICAgICBcImZhaWxfYXR0clwiOiBcIlRoZSBIVE1MIGF0dHJpYnV0ZShzKSBcXFwiezB9XFxcIiBpcyBkZXByZWNhdGVkIGluIEhUTUwgNVwiLFxuICAgICAgICAgICAgXCJmYWlsX2VsZW1fYXR0clwiOiBcIlRoZSBIVE1MIGF0dHJpYnV0ZShzKSBcXFwiezB9XFxcIiBpcyBkZXByZWNhdGVkIGZvciB0aGUgPHsxfT4gZWxlbWVudCBpbiBIVE1MIDVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdm9pZCB1c2Ugb2Ygb2Jzb2xldGUgZmVhdHVyZXMgaWYgcG9zc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjFcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIEhUTUxVbml0IGF1dG8gYWRkcyBhIHRib2R5W2FsaWduPWxlZnRdIHRvIHRhYmxlcyBpZiB0Ym9keSBpcyBtaXNzaW5nIVxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0Ym9keVwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsaWduXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSB3ZWJjb21wb25lbnQgZWxlbWVudCwgSFRNTCBkb2Vzbid0IGRlZmluZSB3aGF0J3MgZGVwcmVjYXRlZFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICAvLyBjaGVjayBpZiBpdCdzIGEgZGVwcmVjYXRlZCBlbGVtZW50XG4gICAgICAgIGlmIChERVBSRUNBVEVEX0VMRU1FTlRTLmluY2x1ZGVzKG5vZGVOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9lbGVtXCIsIFtub2RlTmFtZV0pO1xuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBpdCdzIGEgZGVwcmVjYXRlZCBIVE1MIGdsb2JhbCBhdHRyaWJ1dGVcbiAgICAgICAgY29uc3QgYXR0cnMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGVOYW1lcygpO1xuICAgICAgICBsZXQgdmlvbGF0aW9ucyA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0cnMpIHtcbiAgICAgICAgICAgIGlmIChERVBSRUNBVEVEX0hUTUxfR0xPQkFMX0FUVFJJQlVURVMuaW5jbHVkZXMoYXR0cikpIHtcbiAgICAgICAgICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHZpb2xhdGlvbnMgKz0gJywgJztcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zICs9IGF0dHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpb2xhdGlvbnMgIT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2F0dHJcIiwgW3Zpb2xhdGlvbnNdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBkZXByZWNhdGVkIEhUTUwgZWxlbWVudCAmIGF0dHJpYnV0ZVxuICAgICAgICB2aW9sYXRpb25zID0gJyc7XG4gICAgICAgIGlmIChub2RlTmFtZSBpbiBERVBSRUNBVEVEX0VMRU1FTlRfQVRUUklCVVRFUykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGF0dHJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTW25vZGVOYW1lXSAmJiBERVBSRUNBVEVEX0VMRU1FTlRfQVRUUklCVVRFU1tub2RlTmFtZV0uaW5jbHVkZXMoYXR0cikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpb2xhdGlvbnMgIT09ICcnKSB2aW9sYXRpb25zICs9ICcsICc7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMgKz0gYXR0cjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2VsZW1fYXR0clwiLCBbdmlvbGF0aW9ucywgbm9kZU5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuXG5leHBvcnQgbGV0IGVsZW1lbnRfaWRfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfaWRfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJkb206KltpZF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9FbGVtX1VuaXF1ZUlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJlbGVtZW50X2lkX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50ICdpZCcgYXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHswfT4gZWxlbWVudCBoYXMgdGhlIGlkIFxcXCJ7MX1cXFwiIHRoYXQgaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgaGFzIHRoZSBpZCBcXFwiezF9XFxcIiB0aGF0IGlzIGFscmVhZHkgaW4gdXNlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiM2VhMGM4XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgaWQgaXMgZW1wdHkgd2Ugc2hvdWxkIHRyaWdnZXIgYSB2aW9sYXRpb24gcmlnaHQgYXdheSB3aXRoIG91dCBjaGVja2luZyBcbiAgICAgICAgLy8gZm9yIHVuaXF1ZW5lc3MuXG4gICAgICAgIGlmIChpZCA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQoZmFsc2UsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbWVudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBpZCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBlbGVtZW50ID09PSBydWxlQ29udGV4dDtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIGVSdWxlQ29uZmlkZW5jZSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgTGFuZ1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGFuZ1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmNvbnN0IHZhbGlkYXRlTGFuZyA9IChjb250ZXh0OiBSdWxlQ29udGV4dCk6IG51bWJlciA9PiB7XG4gICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJsYW5nXCIpKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJodG1sXCIgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8gSXQncyBva2F5IHRvIGhhdmUgYSBsYW5nPVwiXCIgaWYgbm90IG9uIGh0bWxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYW5nU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKTtcbiAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nU3RyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5pc0JjcDQ3KGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInhtbDpsYW5nXCIpKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJodG1sXCIgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIikgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIEl0J3Mgb2theSB0byBoYXZlIGEgbGFuZz1cIlwiIGlmIG5vdCBvbiBodG1sXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFuZ1N0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIUxhbmdVdGlsLmlzQmNwNDcobGFuZ1N0cikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGxldCBodG1sX2xhbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFtsYW5nXSwgZG9tOmh0bWxbeG1sOmxhbmddXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJMYW5nIGhhcyBhIHZhbGlkIHByaW1hcnkgbGFuZyBhbmQgY29uZm9ybXMgdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGNvbmZvcm0gdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBpbmNsdWRlIGEgdmFsaWQgcHJpbWFyeSBsYW5ndWFnZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJTcGVjaWZpZWQgJ3htbDpsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiB0aGUgcGFnZSBtdXN0IGJlIHZhbGlkIGFuZCBzcGVjaWZpZWQgaW4gYWNjb3JkYW5jZSB3aXRoIEJDUCA0N1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9LFxuICAgICAgICBcImJmMDUxYVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgLy8gVE9ETzogQUNUOiBNaXNtYXRjaCBiZWNhdXNlIHRoZXkgZG9uJ3QgY2hlY2sgdGhlIGh0bWwgZWxlbWVudCBpbiB0aGUgc2FtZSBydWxlXG4gICAgICAgIC8vIFwiZGU0NmU0XCI6IHtcbiAgICAgICAgLy8gICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIC8vIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBsZXQgcmVhc29uQ29kZSA9IHZhbGlkYXRlTGFuZyhjb250ZXh0KTtcbiAgICAgICAgLy8gVGhpcyBpcyBkb25lIGhlcmUgaW5zdGVhZCBvZiBpbiB2YWxpZGF0ZUxhbmcgc28gdGhhdCB0aGUgZ2VuSGVscCBjb2RlIHdpbGwgcGljayBpdCB1cFxuICAgICAgICBsZXQgcmV0QXJyID0gW1xuICAgICAgICAgICAgUnVsZVBhc3MoXCJQYXNzXzBcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfMVwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8yXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzNcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfNFwiKVxuICAgICAgICBdXG4gICAgICAgIHJldHVybiByZXRBcnJbcmVhc29uQ29kZV07XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IGVsZW1lbnRfbGFuZ192YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2xhbmdfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2xhbmddLCBkb206Klt4bWw6bGFuZ11cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkxhbmcgaGFzIGEgdmFsaWQgcHJpbWFyeSBsYW5nIGFuZCBjb25mb3JtcyB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgaW5jbHVkZSBhIHZhbGlkIHByaW1hcnkgbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiU3BlY2lmaWVkICd4bWw6bGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBjb25mb3JtIHRvIEJDUCA0N1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjaGFuZ2UgaW4gbGFuZ3VhZ2Ugb2Ygc3BlY2lmaWMgY29udGVudCBtdXN0IGJlIHZhbGlkIGFuZCBzcGVjaWZpZWQgaW4gYWNjb3JkYW5jZSB3aXRoIEJDUCA0N1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICAvLyBcImI1YzNmOFwiOiB7XG4gICAgICAgIC8vICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIFwiYmYwNTFhXCI6IHtcbiAgICAgICAgLy8gICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBUT0RPOiBBQ1Q6IE1pc21hdGNoIGJlY2F1c2UgdGhleSBkb24ndCBjaGVjayB0aGUgaHRtbCBlbGVtZW50IGluIHRoZSBzYW1lIHJ1bGVcbiAgICAgICAgXCJkZTQ2ZTRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIElmIGl0J3MgdGhlIEhUTUwgbm9kZSwgdGhhdCdzIGhhbmRsZWQgYnkgaHRtbF9sYW5nX3ZhbGlkXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJodG1sXCIpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcmVhc29uQ29kZSA9IHZhbGlkYXRlTGFuZyhjb250ZXh0KTtcbiAgICAgICAgLy8gVGhpcyBpcyBkb25lIGhlcmUgaW5zdGVhZCBvZiBpbiB2YWxpZGF0ZUxhbmcgc28gdGhhdCB0aGUgZ2VuSGVscCBjb2RlIHdpbGwgcGljayBpdCB1cFxuICAgICAgICBsZXQgcmV0QXJyID0gW1xuICAgICAgICAgICAgUnVsZVBhc3MoXCJQYXNzXzBcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfMVwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8yXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzNcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfNFwiKVxuICAgICAgICBdXG4gICAgICAgIGxldCByZXRWYWwgPSByZXRBcnJbcmVhc29uQ29kZV07XG4gICAgICAgIGlmIChyZXRWYWwudmFsdWVbMV0gIT09IGVSdWxlQ29uZmlkZW5jZS5QQVNTKSB7XG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGVyZSdzIGFjdHVhbGx5IGNvbnRlbnQgb2YgdGhpcyBlbGVtZW50IC0gc2tpcCBzdWJ0cmVlcyB0aGF0IGhhdmUgb3RoZXIgbGFuZyBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBsZXQgaGFzQ29udGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBudy5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50KSB8fCBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImxhbmdcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IGhhc0NvbnRlbnQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJiBBUklBTWFwcGVyLmNvbXB1dGVOYW1lKGVsZW1lbnQpLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IGhhc0NvbnRlbnQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbncubm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaGFzQ29udGVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25kYmxjbGlja10sIGRvbToqW29ubW91c2Vtb3ZlXSwgZG9tOipbb25tb3VzZWRvd25dLCBkb206Kltvbm1vdXNldXBdLCBkb206Kltvbm1vdXNlb3Zlcl0sIGRvbToqW29ubW91c2VvdXRdLCBkb206KltvbmNsaWNrXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VsZW1fRXZlbnRNb3VzZUFuZEtleVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJDb25maXJtIHRoZSA8ezB9PiBlbGVtZW50IHdpdGggbW91c2UgZXZlbnQgaGFuZGxlcihzKSAnezF9JyBoYXMgYSBjb3JyZXNwb25kaW5nIGtleWJvYXJkIGhhbmRsZXIocylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbGwgaW50ZXJhY3RpdmUgY29udGVudCB3aXRoIG1vdXNlIGV2ZW50IGhhbmRsZXJzIG11c3QgaGF2ZSBlcXVpdmFsZW50IGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSB8fFxuICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmRibGNsaWNrXCIpICYmXG4gICAgICAgICAgICAgICAgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vtb3ZlXCIpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlZG93blwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNldXBcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXl1cFwiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2VvdmVyXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZm9jdXNcIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3V0XCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uYmx1clwiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uY2xpY2tcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSB8fFxuICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSA9PSBcImFcIiB8fCBub2RlTmFtZSA9PSBcImJ1dHRvblwiKSk7XG5cbiAgICAgICAgbGV0IGZhaWxlZE1vdXNlRXZlbnRzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvL3N0b3JlIGFuZCBkaXNwbGF5IGV2ZW50IG5hbWUgYW5kIG5vZGUgbmFtZSBpbiB0aGUgdG9rZW5zXG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25kYmxjbGlja1wiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbmRibGNsaWNrXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vtb3ZlXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2Vtb3ZlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vkb3duXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZWRvd25cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZXVwXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXVwXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2V1cFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3ZlclwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25mb2N1c1wiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbm1vdXNlb3ZlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3V0XCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmJsdXJcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZW91dFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmNsaWNrXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEobm9kZU5hbWUgPT0gXCJhXCIgfHwgbm9kZU5hbWUgPT0gXCJidXR0b25cIikpXG4gICAgICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbmNsaWNrXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiLCBbbm9kZU5hbWUsIGZhaWxlZE1vdXNlRXZlbnRzLmpvaW4oXCIsIFwiKV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGdldERlZmluZWRTdHlsZXMsIHNlbGVjdG9yTWF0Y2hlc0VsZW0sIGdldE1lZGlhT3JpZW50YXRpb25UcmFuc2Zvcm0sIGdldFJvdGF0aW9uRGVncmVlfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvY2tlZFwiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgaXMgbm90IHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCIsXG4gICAgICAgICAgICBcImZhaWxfbG9ja2VkXCI6IFwiVGhlIGVsZW1lbnQgPHswfT4gaXMgcmVzdHJpY3RlZCB0byBlaXRoZXIgbGFuZHNjYXBlIG9yIHBvcnRyYWl0IG9yaWVudGF0aW9uIHVzaW5nIENTUyB0cmFuc2Zvcm0gcHJvcGVydHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyBzaG91bGQgbm90IGJlIHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuNFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbJ2IzM2VmZiddLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCBpbnZpc2libGUgZWxlbWVudFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCBlbGVtZW50c1xuICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wic2NyaXB0XCIsIFwibWV0YVwiLCBcInRpdGxlXCJdKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsgICAgXG4gICAgICAgIFxuICAgICAgICAvLyBjYWNoZSB0aGUgb3JpZW50YXRpb24gcmVzdWx0IGZvciBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCkgYXMgYW55O1xuICAgICAgICBsZXQgb3JpZW50YXRpb25UcmFuc2Zvcm1zID0gZ2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfTUVESUFfT1JJRU5UQVRJT05fVFJBTlNGUk9NXCIsIG51bGwpO1xuICAgICAgICBpZiAoIW9yaWVudGF0aW9uVHJhbnNmb3Jtcykge1xuICAgICAgICAgICAgb3JpZW50YXRpb25UcmFuc2Zvcm1zID0gZ2V0TWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybShkb2MpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfTUVESUFfT1JJRU5UQVRJT05fVFJBTlNGUk9NXCIsIG9yaWVudGF0aW9uVHJhbnNmb3Jtcyk7XG4gICAgICAgIH0gXG4gICAgICAgIFxuICAgICAgICAvLyBmaW5kIGlmIHRoZSBlbGVtZW50IG1hdGNoZXMgb3JpZW50YXRpb24gc2VsZWN0b3IocylcbiAgICAgICAgbGV0IG1lZGlhX3RyYW5zZm9ybXMgPSBbXTtcbiAgICAgICAgT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvcmllbnRhdGlvblRyYW5zZm9ybXNba2V5XSkuZm9yRWFjaCh0YWcgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhvcmllbnRhdGlvblRyYW5zZm9ybXNba2V5XVt0YWddKS5sZW5ndGggPiAwICYmIHNlbGVjdG9yTWF0Y2hlc0VsZW0ocnVsZUNvbnRleHQsIHRhZykpXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhX3RyYW5zZm9ybXMucHVzaChvcmllbnRhdGlvblRyYW5zZm9ybXNba2V5XVt0YWddLnRyYW5zZm9ybSk7ICAgIFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIG5vIG1hdGNoLCB0aGUgZWxlbWVudCBpcyBub3QgaW4gbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtXG4gICAgICAgIGlmIChtZWRpYV90cmFuc2Zvcm1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG1lZGlhX3RyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1lZGlhX3RyYW5zZm9ybSA9IG1lZGlhX3RyYW5zZm9ybXNbaV07XG4gICAgICAgICAgICBsZXQgY29udGFpbnNSb3RhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgWydyb3RhdGUnLCAncm90YXRlM2QnLCAncm90YXRlWicsICdtYXRyaXgnLCAnbWF0cml4M2QnXS5mb3JFYWNoKHJvdGF0aW9uID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobWVkaWFfdHJhbnNmb3JtLmluY2x1ZGVzKHJvdGF0aW9uKSkgY29udGFpbnNSb3RhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIG5vIHJvdGF0aW9uIHRyYW5zZm9ybSwgc2tpcFxuICAgICAgICAgICAgaWYgKCFjb250YWluc1JvdGF0aW9uKSBjb250aW51ZTtcblxuICAgICAgICAgICAgbGV0IGRlZ3JlZSA9IGdldFJvdGF0aW9uRGVncmVlKG1lZGlhX3RyYW5zZm9ybSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIG5vIG9yIDM2MG4gZGVncmVlIHJvdGF0aW9uIFxuICAgICAgICAgICAgaWYgKGRlZ3JlZSA9PT0gMCkgeyBcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBjYWxjdWxhdGUgdGhlIG9yaWdpbmFsIHBhZ2Ugcm90YXRpb24gdHJhbnNmb3JtYXRpb24sIGV4YW1wbGVcbiAgICAgICAgICAgICAqICBodG1sIHsgdHJhbnNmb3JtOiByb3RhdGUoMi41ZGVnKTsgfVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGRlZmluZWRTdHlsZSA9IGdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiogXG4gICAgICAgICAgICAgKiBjb21wZW5zYXRlIHRoZSBtZWRpYSBvcmllbnRhdGlvbiB3aXRoIHRoZSBwYWdlIG9yaWVudGF0aW9uXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChkZWZpbmVkU3R5bGVbJ3RyYW5zZm9ybSddKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZV9kZWdyZWUgPSBnZXRSb3RhdGlvbkRlZ3JlZShkZWZpbmVkU3R5bGVbJ3RyYW5zZm9ybSddKTtcbiAgICAgICAgICAgICAgICBkZWdyZWUgLT0gcGFnZV9kZWdyZWU7XG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBhbGxvdyAxIGRlZ3JlZSBmbG9hdGluZyByYW5nZSBmb3IgdGhlIHJpZ2h0IGFuZ2xlXG4gICAgICAgICAgICBpZiAoKGRlZ3JlZSA+IDg5ICYmIGRlZ3JlZSA8IDkxKSB8fCAoZGVncmVlID4gLTkxICYmIGRlZ3JlZSA8IC04OSkpXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX2xvY2tlZFwiLCBbbm9kZU5hbWVdKSk7XG4gICAgICAgICAgICBlbHNlIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSAgXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDsgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IGdldENvbXB1dGVkU3R5bGUsIGdldFBpeGVsc0Zyb21TdHlsZSB9IGZyb20gXCIuLi8vdXRpbC9DU1NVdGlsXCI7XG5cbmV4cG9ydCBsZXQgZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc190YWJiYWJsZVwiOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfaW50ZXJhY3RpdmVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcm9sbGFibGUgZWxlbWVudHMgc2hvdWxkIGJlIHRhYmJhYmxlIG9yIGNvbnRhaW4gdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwYXNzX3RhYmJhYmxlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBpcyB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJwYXNzX2ludGVyYWN0aXZlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBoYXMgdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJUaGUgc2Nyb2xsYWJsZSBlbGVtZW50IDx7MH0+IHdpdGggbm9uLWludGVyYWN0aXZlIGNvbnRlbnQgaXMgbm90IHRhYmJhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIG51bTogW1wiMi4xLjFcIl0sXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtcIm9zc3c5a1wiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIGVsZW1lbnRzXG4gICAgICAgIGlmIChSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJpZnJhbWVcIiwgXCJzdmdcIiwgXCJzY3JpcHRcIiwgXCJtZXRhXCJdKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vc2tpcCBpZiBubyB2aXNpYmxlIGNvbnRlbnRcbiAgICAgICAgaWYgKCFSUFRVdGlsLmhhc0lubmVyQ29udGVudChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBub3Qgc2Nyb2xsYWJsZSwgaW5hcHBsaWNhYmxlXG4gICAgICAgIGlmICgoc3R5bGVzLm92ZXJmbG93WCA9PT0gJ3Zpc2libGUnIHx8IHN0eWxlcy5vdmVyZmxvd1ggPT09ICdoaWRkZW4nKVxuICAgICAgICAgICAgJiYgKHN0eWxlcy5vdmVyZmxvd1kgPT09ICd2aXNpYmxlJyB8fCBzdHlsZXMub3ZlcmZsb3dZID09PSAnaGlkZGVuJykpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIG92ZXJhbGwgc2Nyb2xsYWJsZSBlbGVtZW50IChjbGllbnRXaWR0aCArIHNjcm9sbGJhcldpZHRoIGFuZCBjbGllbnRIZWlnaHQgKyBzY3JvbGxiYXJIZWlnaHQpIGlzIHRvbyBzbWFsbCB0byBiZSB2aXNpYmxlIG9uIHNjcmVlblxuICAgICAgICBpZiAoTWF0aC5tYXgocnVsZUNvbnRleHQub2Zmc2V0V2lkdGgsIHJ1bGVDb250ZXh0Lm9mZnNldEhlaWdodCkgPCAzMCB8fCBNYXRoLm1pbihydWxlQ29udGV4dC5vZmZzZXRXaWR0aCwgcnVsZUNvbnRleHQub2Zmc2V0SGVpZ2h0KSA8IDE1KSAgXG4gICAgICAgICAgIHJldHVybiBudWxsOyBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgYm90aCB4IGFuZCB5IHNjcm9sbCBkaXN0YW5jZXMgPCBlbGVtZW50J3MgaG9yaXpvbnRhbC92ZXJ0aWNhbCBwYWRkaW5nXG4gICAgICAgIGNvbnN0IHBhZGRpbmdfeCA9IGdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ0xlZnQsIHJ1bGVDb250ZXh0KSArIGdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ1JpZ2h0LCBydWxlQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdfeSA9IGdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ1RvcCwgcnVsZUNvbnRleHQpICsgZ2V0UGl4ZWxzRnJvbVN0eWxlKHN0eWxlcy5wYWRkaW5nQm90dG9tLCBydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5zY3JvbGxXaWR0aCAtICBydWxlQ29udGV4dC5jbGllbnRXaWR0aCA8IDEgKyBwYWRkaW5nX3ggXG4gICAgICAgICAgICAmJiBydWxlQ29udGV4dC5zY3JvbGxIZWlnaHQgLSAgcnVsZUNvbnRleHQuY2xpZW50SGVpZ2h0IDwgMSsgcGFkZGluZ195KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBwYXNzIGlmcmFtZSBlbGVtZW50IGhhcyBhIHRhYmluZGV4IGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIG5vdCBuZWdhdGl2ZVxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikgJiYgcGFyc2VJbnQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikpID49IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX3RhYmJhYmxlXCIpO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIGVsZW1lbnQgY29udGVudCBpcyB0YWJiYWJsZVxuICAgICAgICBjb25zdCBjb3VudCA9IFJQVFV0aWwuZ2V0VGFiYmFibGVDaGlsZHJlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChjb3VudCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2ludGVyYWN0aXZlXCIpO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpbiBGaXJlZm94IGlmIG5vIHRhYmluZGV4IGF0IGFsbCAobm90IHRlc3RlZCBpbiBlbWJlZGRlZCBvciBhbnkgc2ltdWxhdG9yKVxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIkZpcmVmb3hcIikgPiAtMSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfc2Nyb2xsYWJsZVwiLCBbbm9kZU5hbWVdKTsgICAgXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBnZXREZWZpbmVkU3R5bGVzIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkXCIsXG4gICAgY29udGV4dDpcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9yb2xlXCI6IFwiZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHRhYmJhYmxlIGVsZW1lbnQgaGFzIGEgd2lkZ2V0IHJvbGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX3JvbGVcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCdzIHJvbGUgJ3swfScgaXMgbm90IGEgd2lkZ2V0IHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHRhYmJhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIl0sXG4gICAgICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICAgICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGlmIChSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBpcyB0YWJiYWJsZSBieSBkZWZhdWx0IHdpdGggb3Igd2l0aG91dCB0YWJpbmRleCwgbGV0IHRoZSBvdGhlciBydWxlcyAoc3VjaCBhcyB3aWRnZXRfdGFiYmFibGVfc2luZ2xlKSB0byBoYW5kbGUgaXRcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIFJQVFV0aWwudGFiVGFnTWFwICkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gUlBUVXRpbC50YWJUYWdNYXBbbm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBpZiAodmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlOiBubyB0YWJpbmRleCBvciB0YWJpbmRleCA8IDBcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgZWxlbWVudHMgd2l0aCBDU1Mgb3ZlcmZsb3c6IHNjcm9sbCBvciBhdXRvXG4gICAgICAgIGxldCBzdHlsZXMgPSBnZXREZWZpbmVkU3R5bGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHN0eWxlc1snb3ZlcmZsb3cteCddID09PSAnc2Nyb2xsJyB8fCBzdHlsZXNbJ292ZXJmbG93LXknXSA9PT0gJ3Njcm9sbCcgXG4gICAgICAgICAgICB8fCBzdHlsZXNbJ292ZXJmbG93LXgnXSA9PT0gJ2F1dG8nIHx8IHN0eWxlc1snb3ZlcmZsb3cteSddID09PSAnYXV0bycpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCBmYWxzZSk7XG4gICAgICAgIC8vIGlnbm9yZSAnYXBwbGljYXRpb24nIHJvbGUgdGhhdCBjb250YWlucyBvbmUgb3IgbW9yZSBmb2N1c2FibGUgZWxlbWVudHMgdGhhdCBkbyBub3QgZm9sbG93IGEgc3RhbmRhcmQgaW50ZXJhY3Rpb24gcGF0dGVybiBzdXBwb3J0ZWQgYnkgYSB3aWRnZXQgcm9sZTpodHRwczovL3d3dy53My5vcmcvVFIvMjAyMy9QUi1XQUktQVJJQS0xLjItMjAyMzAzMjgvI2FwcGxpY2F0aW9uIFxuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMuaW5jbHVkZXMoXCJhcHBsaWNhdGlvblwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gZWxlbWVudHMgd2hvc2Ugcm9sZXMgYWxsb3cgbm8gZGVzY2VuZGFudHMgdGhhdCBhcmUgaW50ZXJhY3RpdmUgb3Igd2l0aCBhIHRhYmluZGV4ID49IDAgXG4gICAgICAgIC8vIHRoaXMgY2FzZSBzaG91bGQgYmUgaGFuZGxlZCBpbiB3aWRnZXRfdGFiYmFibGVfc2luZ2xlIGFuZCBhcmlhX2NoaWxkX3RhYmJhYmxlXG4gICAgICAgIGNvbnN0IHJvbGVzX25vX2ludGVyYWN0aXZlX2NoaWxkID1bXCJidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImltZ1wiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIl07XG5cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJvbGVzID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgcGFyZW50X3JvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhwYXJlbnQgYXMgRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgb25lIG9mIHRoZSBwYXJlbnQgcm9sZXMgaXMgaW4gcm9sZXNfbm9faW50ZXJhY3RpdmVfY2hpbGRcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgcGFyZW50X3JvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocm9sZXNfbm9faW50ZXJhY3RpdmVfY2hpbGQuaW5jbHVkZXMocGFyZW50X3JvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2U6IHRhYmluZGV4ID49IDAgdG8gZXhhbWluZSB3aGV0aGVyIGEgd2lkZ2V0IHJvbGUgaXMgc2V0dXAgb3Igbm90IFxuICAgICAgICAvLyBwYXNzIGlmIG9uZSBvZiB0aGUgcm9sZXMgaXMgYSB3aWRnZXQgdHlwZVxuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCByb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gUm93IGlzIHdlaXJkLiBJdCdzIHN0cnVjdHVyZSwgYnV0IGNhbiBhbHNvIGJlIHdpZGdldFxuICAgICAgICAgICAgaWYgKHJvbGVzW2ldID09PSBcInJvd1wiIHx8IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1tpXV0ucm9sZVR5cGUgPT09ICd3aWRnZXQnKSB7XG4gICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGb2N1c2FibGUgc2VwYXJhdG9ycyBhcmUgd2lkZ2V0c1xuICAgICAgICAgICAgaWYgKHJvbGVzW2ldID09PSBcInNlcGFyYXRvclwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZF9yb2xlXCIsIFtyb2xlcy5sZW5ndGggPT09IDAgPyAnbm9uZScgOiByb2xlcy5qb2luKCcsICcpXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0RGVmaW5lZFN0eWxlcywgZ2V0Q29tcHV0ZWRTdHlsZSB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlUG90ZW50aWFsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgZWxlbWVudF90YWJiYWJsZV92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfdGFiYmFibGVfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfdGFiYmFibGVfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF92aXNpYmxlXCI6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHRhYmJhYmxlIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2libGUgb24gdGhlIHNjcmVlbiB3aGVuIGl0IGhhcyBrZXlib2FyZCBmb2N1c1wiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHRhYmJhYmxlIGVsZW1lbnQgaXMgdmlzaWJsZSBvbiB0aGUgc2NyZWVuXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF92aXNpYmxlXCI6IFwiQ29uZmlybSB0aGUgZWxlbWVudCBzaG91bGQgYmUgdGFiYmFibGUsIGFuZCBpcyB2aXNpYmxlIG9uIHRoZSBzY3JlZW4gd2hlbiBpdCBoYXMga2V5Ym9hcmQgZm9jdXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjQuN1wiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghUlBUVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpOyBcbiAgICAgICAgY29uc3QgYm91bmRzID0gY29udGV4dFtcImRvbVwiXS5ib3VuZHM7XG4gICAgICAgIC8vaW4gY2FzZSB0aGUgYm91bmRzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgaWYgKCFib3VuZHMpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gZGVmaW5lZCBzdHlsZXMgb25seSBnaXZlIHRoZSBzdHlsZXMgdGhhdCBjaGFuZ2VkXG4gICAgICAgIGNvbnN0IGRlZmluZWRfc3R5bGVzID0gZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IG9uZm9jdXNfc3R5bGVzID0gZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCwgXCI6Zm9jdXNcIik7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgIGlmIChib3VuZHNbJ2hlaWdodCddID09PSAwIHx8IGJvdW5kc1snd2lkdGgnXSA9PT0gMCBcbiAgICAgICAgICAgIHx8IChkZWZpbmVkX3N0eWxlc1sncG9zaXRpb24nXT09PSdhYnNvbHV0ZScgJiYgZGVmaW5lZF9zdHlsZXNbJ2NsaXAnXSAmJiBkZWZpbmVkX3N0eWxlc1snY2xpcCddLnJlcGxhY2VBbGwoJyAnLCAnJyk9PT0ncmVjdCgwcHgsMHB4LDBweCwwcHgpJ1xuICAgICAgICAgICAgICAmJiAhb25mb2N1c19zdHlsZXNbJ2NsaXAnXSkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcblxuICAgICAgICBpZiAoYm91bmRzWyd0b3AnXSA+PSAwICYmIGJvdW5kc1snbGVmdCddID49IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZGVmYXVsdF9zdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIGxldCB0b3AgPSBib3VuZHNbJ3RvcCddO1xuICAgICAgICBsZXQgbGVmdCA9IGJvdW5kc1snbGVmdCddOyAgICAgXG4gICAgICAgXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvbmZvY3VzX3N0eWxlcykubGVuZ3RoID09PSAwICkge1xuICAgICAgICAgICAgLy8gbm8gb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2UsIGJ1dCBjb3VsZCBiZSBjaGFuZ2VkIGZyb20ganMgXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcbiAgICAgICAgfSBlbHNlIHsgICBcbiAgICAgICAgICAgIC8vIHdpdGggb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2VcbiAgICAgICAgICAgIHZhciBwb3NpdGlvbnMgPSBbJ2Fic29sdXRlJywgJ2ZpeGVkJ107XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWyd0b3AnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25zLmluY2x1ZGVzKG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddKSB8fCAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddID09PSAndW5kZWZpbmVkJyAmJiBwb3NpdGlvbnMuaW5jbHVkZXMoZGVmYXVsdF9zdHlsZXNbJ3Bvc2l0aW9uJ10pKSkge1xuICAgICAgICAgICAgICAgICAgICB0b3AgPSBvbmZvY3VzX3N0eWxlc1sndG9wJ10ucmVwbGFjZSgvXFxEL2csJycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7IFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcG9zaXRpb24gaXMgdW5kZWZpbmVkIGFuZCB0aGUgcGFyZW50J3MgcG9zaXRpb24gaXMgJ3JlbGF0aXZlJ1xuICAgICAgICAgICAgICAgICAgICB0b3AgPSBOdW1iZXIuTUlOX1ZBTFVFOyAgIFxuICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ2xlZnQnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25zLmluY2x1ZGVzKG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddKSB8fCAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddID09PSAndW5kZWZpbmVkJyAmJiBwb3NpdGlvbnMuaW5jbHVkZXMoZGVmYXVsdF9zdHlsZXNbJ3Bvc2l0aW9uJ10pKSkge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gb25mb2N1c19zdHlsZXNbJ2xlZnQnXS5yZXBsYWNlKC9cXEQvZywnJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb3NpdGlvbiBpcyB1bmRlZmluZWQgYW5kIHRoZSBwYXJlbnQncyBwb3NpdGlvbiBpcyAncmVsYXRpdmUnXG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBOdW1iZXIuTUlOX1ZBTFVFOyAgIFxuICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRvcCA+PSAwICYmIGxlZnQgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBlbWJlZF9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImVtYmVkX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTplbWJlZFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VtYmVkX0hhc0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbWJlZF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJlbWJlZF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbWJlZF9hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgPGVtYmVkPiBlbGVtZW50IGhhcyBhbHRlcm5hdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUHJvdmlkZSBhbHRlcm5hdGl2ZSBjb250ZW50IGZvciA8ZW1iZWQ+IGVsZW1lbnRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKTtcbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZW1iZWRfbm9lbWJlZF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZW1iZWRfbm9lbWJlZF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTplbWJlZFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0VtYmVkX0hhc05vRW1iZWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZW1iZWRfbm9lbWJlZF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVtYmVkX25vZW1iZWRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbWJlZF9ub2VtYmVkX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIDxlbWJlZD4gZWxlbWVudCBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIG5vbi1lbWJlZGRlZCBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGVtYmVkPiBlbGVtZW50cyBzaG91bGQgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBub24tZW1iZWRkZWQgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwibm9lbWJlZFwiKS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwibm9lbWJlZFwiKVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdhbGtOb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCIjdGV4dFwiICYmIHdhbGtOb2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAod2Fsa05vZGUubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBlbW90aWNvbnNfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJlbW90aWNvbnNfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9UZXh0X0Vtb3RpY29uc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbW90aWNvbnNfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZW1vdGljb25zX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVtb3RpY29uc19hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBlbW90aWNvbnMgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbW90aWNvbnMgbXVzdCBoYXZlIGEgc2hvcnQgdGV4dCBhbHRlcm5hdGl2ZSB0aGF0IGRlc2NyaWJlcyB0aGVpciBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogRGVjaXNpb24gaW4gcGxhbm5pbmcgOS83LzIzIHRoYXQgdGhpcyBydWxlIGNhdXNlcyBtb3JlIHJldmlld3MgdGhhdCB3ZSBzZWUgYWN0dWFsIHByb2JsZW1zIGluIGNvbnRlbnQsIHNvIHR1cm4gdGhlc2UgcnVsZXMgb2ZmXG4gICAgXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgKi9cbiAgICBydWxlc2V0czogW10sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIGVtb3RpY29uczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCI6LSlcIiwgXCI6KVwiLCBcIjpvKVwiLCBcIjpdXCIsIFwiOjNcIiwgXCI6YylcIiwgXCI6PlwiLCBcIj1dXCIsIFwiOClcIiwgXCI9KVwiLCBcIjpEXCIsIFwiQzpcIixcbiAgICAgICAgICAgICAgICAgICAgXCI6LURcIiwgXCI6RFwiLCBcIjhEXCIsIFwiWERcIiwgXCI9RFwiLCBcIj0zXCIsIFwiPD0zXCIsIFwiPD04XCIsIFwiLS0hLS1cIiwgXCI6LShcIiwgXCI6KFwiLCBcIjpjXCIsIFwiOjxcIiwgXCI6W1wiLFxuICAgICAgICAgICAgICAgICAgICBcIkQ6XCIsIFwiRDhcIiwgXCJEO1wiLCBcIkQ9XCIsIFwiRFhcIiwgXCJ2LnZcIiwgXCI6LTlcIiwgXCI7LSlcIiwgXCI7KVwiLCBcIiopXCIsIFwiO11cIiwgXCI7RFwiLCBcIjotUFwiLCBcIjpQXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiOi1wXCIsIFwiOnBcIiwgXCI9cFwiLCBcIjotw55cIiwgXCI6w55cIiwgXCI6LWJcIiwgXCI6YlwiLCBcIjotT1wiLCBcIjpPXCIsIFwiT19PXCIsIFwib19vXCIsIFwiOE9cIiwgXCJPd09cIiwgXCJPLU9cIixcbiAgICAgICAgICAgICAgICAgICAgXCIwX29cIiwgXCJPX29cIiwgXCJPM09cIiwgXCJvMG/CoDtvX287XCIsIFwiby4uLm9cIiwgXCIwdzBcIiwgXCI6LS9cIiwgXCI6L1wiLCBcIjpcXFxcXCIsIFwiPS9cIiwgXCI9XFxcXFwiLCBcIjpTXCIsIFwiOnxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkOi0pXCIsIFwicUItKVwiLCBcIjopflwiLCBcIjotKT4uLi4uXCIsIFwiOi1YXCIsIFwiOlhcIiwgXCI6LSNcIiwgXCI6I1wiLCBcIk86LSlcIiwgXCIwOjNcIiwgXCJPOilcIiwgXCI6JyhcIiwgXCI7KihcIixcbiAgICAgICAgICAgICAgICAgICAgXCJUX1RcIiwgXCJUVF9UVFwiLCBcIlQuVFwiLCBcIjotKlwiLCBcIjoqXCIsIFwiXm8pXCIsIFwiPjopXCIsIFwiPjspXCIsIFwiPjotKVwiLCBcIkIpXCIsIFwiQi0pXCIsIFwiOClcIiwgXCI4LSlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJePi4+XlwiLCBcIl48LjxeXCIsIFwiXj5fPl5cIiwgXCJePF88XlwiLCBcIkQ6PFwiLCBcIj46KFwiLCBcIkQtOjxcIiwgXCI+Oi0oXCIsIFwiOi1AWzFdXCIsIFwiOyhcIiwgXCJgX8K0XCIsIFwiRDxcIixcbiAgICAgICAgICAgICAgICAgICAgXCI8M1wiLCBcIjwzMzNcIiwgXCI9Xl9ePVwiLCBcIj0+Lj49XCIsIFwiPTxfPD1cIiwgXCI9Pi48PVwiLCBcIlxcXFwsLC9cIiwgXCJcXFxcbS9cIiwgXCJcXFxcbS9cXFxcPi48L1xcXFxtL1wiLCBcIlxcXFxvL1wiLCBcIlxcXFxvIG8vXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiby9cXFxcb1wiLCBcIjomXCIsIFwiOnVcIlxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGVtb3RpY29ucyA9IHZhbGlkYXRlUGFyYW1zLmVtb3RpY29ucy52YWx1ZTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0ZXN0VGV4dCA9IFwiXCI7XG5cbiAgICAgICAgbGV0IHdhbGtOb2RlOiBOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlKSB7XG4gICAgICAgICAgICAvLyBDb21wbHkgdG8gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgd2lsbCBiZSBkb25lIGJ5IGRlZmF1bHQgYXMgdGhpcyBydWxlIHRyaWdnZXJzIG9uIGVhY2ggZWxlbWVudFxuICAgICAgICAgICAgLy8gYW5kIGZvciBlYWNoIGVsZW1lbnQgaXQgb25seSBjaGVja3MgdGhhdCBzaW5nbGUgZWxlbWVudHMgdGV4dCBub2RlcyBhbmQgbm90aGluZyBlbHNlLiBTbyBhbGwgaW5uZXIgZWxlbWVudHMgd2lsbCBiZVxuICAgICAgICAgICAgLy8gY292ZXJlZCBvbiB0aGVpciBvd24uIEN1cnJlbnRseSBmb3IgdGhpcyBydWxlIGJ5IGRlZmF1bHQgQ2hlY2sgSGlkZGVuIENvbnRlbnQgd2lsbCB3b3JrLCBhcyB3ZSBhcmUgZG9pbmdcbiAgICAgICAgICAgIC8vIGEgbm9kZSB3YWxrIG9ubHkgb24gc2libGluZ3Mgc28gaXQgd291bGQgbm90IGdldCB0ZXh0IG5vZGVzIGZyb20gb3RoZXIgc2libGluZ3MgYXQgYWxsLlxuICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgaW4gdGhlIGZ1dHVyZSBzb21ldGhpbmcgY2huZ2VzLCBqdXN0IG5lZWQgdG8gYWRkICYmICFSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4od2Fsa05vZGUpIHRvIHRoZSBiZWxvd1xuICAgICAgICAgICAgLy8gaWYuXG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZU5hbWUgPT0gXCIjdGV4dFwiKSB7XG4gICAgICAgICAgICAgICAgdGVzdFRleHQgKz0gXCIgXCIgKyB3YWxrTm9kZS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRlc3RUZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgcGFzc2VkICYmIGogPCBlbW90aWNvbnMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICBsZXQgZW1vdElkeCA9IHRlc3RUZXh0LmluZGV4T2YoZW1vdGljb25zW2pdKTtcbiAgICAgICAgICAgICAgICBsZXQgZUxuZ3RoID0gZW1vdGljb25zW2pdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIGVtb3RJZHggIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGFzc2VzIGlmOiB0aGUgZW1vdGljb24gaXMgbm90IHByZWNlZGVkIGJ5IHdoaXRlc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBlbW90aWNvbiBpcyBub3QgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSB1bmxlc3MgaXQncyBwdW5jdHVhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgaXQncyBpbiBhIHByZSwgY29kZSwgb3Igc2NyaXB0XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAoZW1vdElkeCA+IDAgJiYgIS9cXHMvLnRlc3QodGVzdFRleHQuc3Vic3RyaW5nKGVtb3RJZHggLSAxLCBlbW90SWR4KSkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoZW1vdElkeCA8IHRlc3RUZXh0Lmxlbmd0aCAtIGVMbmd0aCAmJiAhL1xccy8udGVzdCh0ZXN0VGV4dC5zdWJzdHJpbmcoZW1vdElkeCArIGVMbmd0aCwgZW1vdElkeCArIGVMbmd0aCArIDEpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEvWy4sISdcIj9dLy50ZXN0KHRlc3RUZXh0LnN1YnN0cmluZyhlbW90SWR4ICsgZUxuZ3RoLCBlbW90SWR4ICsgZUxuZ3RoICsgMSkpKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyB1c2FnZSBvZiAoOiBzdHVmZiA6KSBzaW5jZSB0aGlzIGlzIGEgY29tbWVudCBpbiBzb21lIGxhbmd1YWdlc1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgKChlbW90aWNvbnNbal0gPT0gXCI6KVwiIHx8IGVtb3RpY29uc1tqXSA9PSBcIig6XCIpICYmIC9cXChcXDouKlxcOlxcKS8udGVzdCh0ZXN0VGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgKChlbW90aWNvbnNbal0gPT0gXCI7KVwiIHx8IGVtb3RpY29uc1tqXSA9PSBcIig7XCIpICYmIC9cXChcXDsuKlxcO1xcKS8udGVzdCh0ZXN0VGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICBlbW90SWR4ID0gdGVzdFRleHQuaW5kZXhPZihlbW90aWNvbnNbal0sIGVtb3RJZHggKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHQsIHByZSwgY29kZVxuICAgICAgICAgICAgbGV0IGNoZWNrQW5jZXN0b3IgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJwcmVcIiwgXCJjb2RlXCIsIFwic2NyaXB0XCIsIFwiYm9keVwiXSk7XG4gICAgICAgICAgICBwYXNzZWQgPSBjaGVja0FuY2VzdG9yID09IG51bGwgfHwgY2hlY2tBbmNlc3Rvci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9IFwiYm9keVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgZXJyb3JfbWVzc2FnZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtaW52YWxpZD10cnVlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BcmlhX0Vycm9yTWVzc2FnZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlcnJvcl9tZXNzYWdlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImVycm9yX21lc3NhZ2VfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVycm9yX21lc3NhZ2VfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ3VzdG9tIGVycm9yIG1lc3NhZ2UgaGFzIGludmFsaWQgcmVmZXJlbmNlICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiQ3VzdG9tIGVycm9yIG1lc3NhZ2UgaXMgbm90IHZpc2libGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGN1c3RvbSBlcnJvciBtZXNzYWdlIG11c3QgcmVmZXJlbmNlIGEgdmFsaWQgJ2lkJyB2YWx1ZSBhbmQgd2hlbiB0cmlnZ2VyZWQgdGhlIG1lc3NhZ2UgbXVzdCBiZSBhcHByb3ByaWF0ZWx5IGV4cG9zZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBhcmlhX2Vyck1zZ0lkID0gUlBUVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtZXJyb3JtZXNzYWdlXCIpO1xuXG4gICAgICAgIC8vIElmIGFyaWEtZXJyb3JtZXNzYWdlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiBPVVRfT0ZfU0NPUEVcbiAgICAgICAgaWYgKCFhcmlhX2Vyck1zZ0lkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtc2dfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGFyaWFfZXJyTXNnSWQpO1xuXG4gICAgICAgIC8vIFBPRjA6IEludmFsaWQgaWQgcmVmZXJlbmNlXG4gICAgICAgIGlmICghbXNnX2VsZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9GMTogUmVmZXJlbmNlZCBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG1zZ19lbGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGZpZWxkc2V0X2xhYmVsX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmdyb3VwXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJncm91cF93aXRoSW5wdXRzX2hhc05hbWVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJQYXNzXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmaWVsZHNldF9sYWJlbF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmaWVsZHNldF9sYWJlbF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcIkdyb3VwL0ZpZWxkc2V0IFxcXCJ7MH1cXFwiIHdpdGggYW4gaW5wdXQgaGFzIGEgdW5pcXVlIG5hbWVcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiR3JvdXAvRmllbGRzZXQgZG9lcyBub3QgaGF2ZSBhbiBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiR3JvdXAvRmllbGRzZXQgXFxcInswfVxcXCIgaGFzIGEgZHVwbGljYXRlIG5hbWUgdG8gYW5vdGhlciBncm91cFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkdyb3VwcyB3aXRoIG5lc3RlZCBpbnB1dHMgbXVzdCBoYXZlIHVuaXF1ZSBhY2Nlc3NpYmxlIG5hbWVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIiwgXCIzLjMuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBsZXQgb3duZXJEb2N1bWVudCA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGZvcm1DYWNoZSA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwibGFuZG1hcmtfZ3JvdXBfaW5wdXRcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghZm9ybUNhY2hlKSB7XG4gICAgICAgICAgICBmb3JtQ2FjaGUgPSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0czogW10sXG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzVGVtcCA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICAnZmllbGRzZXQsW3JvbGU9XCJncm91cFwiXSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzID0gQXJyYXkuZnJvbShhbGxHcm91cHNUZW1wKTtcbiAgICAgICAgICAgIGxldCBncm91cHNXaXRoSW5wdXRzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGdyb3VwIG5vZGVzXG4gICAgICAgICAgICAgICAgaWYgKGFsbEdyb3Vwc1tpXS5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0cy5wdXNoKGFsbEdyb3Vwc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cHNXaXRoSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbGFuZG1hcmsgbm9kZXNcbiAgICAgICAgICAgICAgICBncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5jb21wdXRlTmFtZShncm91cHNXaXRoSW5wdXRzW2ldKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0cyA9IGdyb3Vwc1dpdGhJbnB1dHM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzID1cbiAgICAgICAgICAgICAgICBncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHM7XG5cbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwibGFuZG1hcmtfZ3JvdXBfaW5wdXRcIixmb3JtQ2FjaGUpOyAgICBcbiAgICAgICAgfVxuICAgICAgICAvLyBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0czogXCIgK2VsZW1lbnQuaWQpXG4gICAgICAgIC8vIH0pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHM6IFwiICtmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzKVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHM6IFwiICtmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzLmxlbmd0aClcblxuICAgICAgICBsZXQgcnVsZUNvbnRleHRGb3VuZEluZ3JvdXBzV2l0aElucHV0c0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgbGV0IGNvbXB1dGVkTmFtZSA9IFwiXCI7XG4gICAgICAgIGlmICghZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHMpIHtcbiAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYXZlIGFueSBncm91cHMgd2l0aCBpbnB1dHMuIFRoZXJlZm9yZSB3ZSBzaG91bGQgc2tpcCB0aGlzIHJ1bGUgdHJpZ2dlci5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmlzU2FtZU5vZGUoZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNbaV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBmb3VuZCBvdXIgcnVsZUNvbnRleHQgaW4gdGhlIGNhY2hlXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHRGb3VuZEluZ3JvdXBzV2l0aElucHV0c0ZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tpXSA9PT0gXCJcIiB8fFxuICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldID09PSBudWxsXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRmFpbF8xXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kU2FtZU5hbWVGbGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgICAgbGV0IGogPSAwO1xuICAgICAgICAgICAgICAgICAgICBqIDwgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGorK1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfSAvLyBXZSBkbyBub3Qgd2FudCB0byBjb21wYXJlIGFnYWluc3Qgb3Vyc2VsZnNcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tpXSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbal1cbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFNhbWVOYW1lRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kU2FtZU5hbWVGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRmFpbF8yXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldLFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tcHV0ZWROYW1lID0gZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Rm91bmRJbmdyb3Vwc1dpdGhJbnB1dHNGbGFnKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIm51bGwgcmV0dXJuXCIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlBhc3NfMVwiKVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzFcIiwgW2NvbXB1dGVkTmFtZV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZmllbGRzZXRfbGVnZW5kX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZpZWxkc2V0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfRmllbGRzZXRfSGFzTGVnZW5kXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmaWVsZHNldF9sZWdlbmRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmaWVsZHNldF9sZWdlbmRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmaWVsZHNldF9sZWdlbmRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJmaWVsZHNldF9sZWdlbmRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIjxmaWVsZHNldD4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgPGxlZ2VuZD5cIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiPGZpZWxkc2V0PiBlbGVtZW50IGhhcyBtb3JlIHRoYW4gb25lIDxsZWdlbmQ+XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIjxmaWVsZHNldD4gZWxlbWVudCA8bGVnZW5kPiBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIiA8ZmllbGRzZXQ+IGVsZW1lbnRzIHNob3VsZCBoYXZlIGEgc2luZ2xlLCBub24tZW1wdHkgPGxlZ2VuZD4gYXMgYSBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sICAvL2h0dHBzOi8vd3d3LnczLm9yZy9XQUkvV0NBRzIyL1RlY2huaXF1ZXMvaHRtbC9INzFcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIGEgbGVnZW5kIGlzIGhpZGRlbiwgd2Ugc2hvdWxkIHN0aWxsIHRyaWdnZXIgYSB2aW9sYXRpb25zIGZvciB0aGlzXG4gICAgICAgIGxldCBsZWdlbmRzID0gUlBUVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHJ1bGVDb250ZXh0LCBcImxlZ2VuZFwiLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIGlmIChsZWdlbmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gRmllbGRzZXQgaGFzIE5PIExlZ2VuZFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGxlZ2VuZHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgLy8gRmllbGRzZXQgaGFzIG1vcmUgdGhhbiBvbmUgbGVnZW5kXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoUlBUVXRpbC5nZXRJbm5lclRleHQobGVnZW5kc1swXSkudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gRmllbGRzZXQgaGFzIGxlZ2VuZCBidXQgbGVnZW5kIGlzIGVtcHR5XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZmlndXJlX2xhYmVsX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJmaWd1cmVfbGFiZWxfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206ZmlndXJlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0ZpZ3VyZV9sYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZpZ3VyZV9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmaWd1cmVfbGFiZWxfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmaWd1cmVfbGFiZWxfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDxmaWd1cmU+IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8ZmlndXJlPiBlbGVtZW50IG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIGFuIGV4cGxpY2l0IHJvbGUgaXMgc3BlY2lmaWVkLiB0aGlzIGNhc2Ugd2lsbCBiZSBjb3ZlcmVkIGluIHRoZSBhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cyBydWxlc1xuICAgICAgICBsZXQgcm9sZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIik7XG4gICAgICAgIGlmIChyb2xlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZm9ybV9mb250X2NvbG9yOiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1fZm9udF9jb2xvclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9Gb250X0NvbG9ySW5Gb3JtXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1fZm9udF9jb2xvci5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZm9ybV9mb250X2NvbG9yLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2ZvbnRfY29sb3IuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkNoZWNrIGNvbG9yIGlzIG5vdCB1c2VkIGFzIHRoZSBvbmx5IHZpc3VhbCBtZWFucyB0byBjb252ZXkgd2hpY2ggZmllbGRzIGFyZSByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbWJpbmUgY29sb3IgYW5kIGRlc2NyaXB0aXZlIG1hcmt1cCB0byBpbmRpY2F0ZSByZXF1aXJlZCBmb3JtIGZpZWxkc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmb250cyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZm9udFwiKTtcbiAgICAgICAgaWYgKGZvbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAhZm9udHNbaV0uaGFzQXR0cmlidXRlKFwiY29sb3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbTpmb3JtW3RhcmdldF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Gb3JtX1RhcmdldEFuZFRleHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2ludGVyYWN0aW9uX3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgaW50ZXJhY3Rpbmcgd2l0aCBjb250ZW50IHdpbGwgbm90IG9wZW4gcG9wLXVwIHdpbmRvd3Mgb3IgY2hhbmdlIHRoZSBhY3RpdmUgd2luZG93IHdpdGhvdXQgaW5mb3JtaW5nIHRoZSB1c2VyXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlciBzaG91bGQgYmUgaW5mb3JtZWQgaW4gYWR2YW5jZSB3aGVuIGludGVyYWN0aW5nIHdpdGggY29udGVudCBjYXVzZXMgYSBjaGFuZ2Ugb2YgY29udGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4yLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtV2luVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJuZXcgd2luZG93XCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0U3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdFN0ciA9PT0gXCJfcGFyZW50XCIgfHwgdFN0ciA9PT0gXCJfc2VsZlwiIHx8IHRTdHIgPT09IFwiX3RvcFwiIHx8IFJQVFV0aWwuZ2V0RnJhbWVCeU5hbWUocnVsZUNvbnRleHQsIHRTdHIpICE9IG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBOYW1lIGlzIG5vdCBwYXJ0IG9mIHRoaXMgZnJhbWVzZXQg4oCTIG11c3QgaGF2ZSBwb3RlbnRpYWwgdG8gY3JlYXRlIG5ldyB3aW5kb3c/XG4gICAgICAgICAgICAvLyBTZWUgaWYgYSBuZXcgd2luZG93IGlzIG1lbnRpb25lZFxuICAgICAgICAgICAgbGV0IHRleHRTdHIgPSBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGl0bGVcIikpXG4gICAgICAgICAgICAgICAgdGV4dFN0ciArPSBcIiBcIiArIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IHZhbGlkYXRlUGFyYW1zLnBhcmFtV2luVGV4dC52YWx1ZS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBpZiAodGV4dFN0ci5pbmRleE9mKHZhbGlkYXRlUGFyYW1zLnBhcmFtV2luVGV4dC52YWx1ZVtpXSkgIT0gLTEpIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBmb3JtX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJmb3JtX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmxhYmVsW2Zvcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9MYWJlbF9VbmlxdWVGb3JcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZvcm0gY29udHJvbCBoYXMgbW9yZSB0aGFuIG9uZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkZvcm0gY29udHJvbHMgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEpDSCAtIE5PIE9VVCBPRiBTQ09QRSBoaWRkZW4gaW4gY29udGV4dFxuICAgICAgICBsZXQgbGFiZWxJZHMgPSBnZXRDYWNoZShGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCksIFwiUlBUX0xhYmVsX1NpbmdsZVwiLCB7fSlcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZm9yXCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gIShpZCBpbiBsYWJlbElkcyk7XG4gICAgICAgIGxhYmVsSWRzW2lkXSA9IHRydWU7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBOb2RlV2Fsa2VyLCBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGZvcm1fc3VibWl0X2J1dHRvbl9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Gb3JtX0hhc1N1Ym1pdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlIDxmb3JtPiBlbGVtZW50IGhhcyBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8Zm9ybT4gZWxlbWVudCBzaG91bGQgaGF2ZSBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIHN1Ym1pdCBidXR0b25zIGFyZSB1c3VhbGx5IGF0IHRoZSBib3R0b20gLSB3YWxrIGJhY2t3YXJkc1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgbncucHJldk5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFudy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0eXBlID09PSBcInN1Ym1pdFwiIHx8IHR5cGUgPT09IFwiaW1hZ2VcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJidXR0b25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbncuZWxlbSgpLmhhc0F0dHJpYnV0ZShcInR5cGVcIikgJiYgbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJzdWJtaXRcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudy5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmhhc1JvbGUobncubm9kZSwgXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZm9ybV9zdWJtaXRfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1fc3VibWl0X3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnNlbGVjdFtvbmNoYW5nZV0sIGRvbTppbnB1dFtvbmNoYW5nZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9Gb3JtX0NoYW5nZUVtcHR5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1fc3VibWl0X3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZm9ybV9zdWJtaXRfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX3N1Ym1pdF9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkNvbmZpcm0gdGhlIGZvcm0gZG9lcyBub3Qgc3VibWl0IGF1dG9tYXRpY2FsbHkgd2l0aG91dCB3YXJuaW5nXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBmb3JtIHNob3VsZCBub3QgYmUgc3VibWl0dGVkIGF1dG9tYXRpY2FsbHkgd2l0aG91dCB3YXJuaW5nIHRoZSB1c2VyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmNoYW5nZVwiKS50cmltKCkubGVuZ3RoID09PSAwO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBmcmFtZV9zcmNfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZnJhbWVfc3JjX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206ZnJhbWUsIGRvbTppZnJhbWVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlZhbGVyaWVfRnJhbWVfU3JjSHRtbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZnJhbWVfc3JjX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmcmFtZV9zcmNfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZyYW1lX3NyY192YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IDxmcmFtZT4gY29udGVudCBpcyBhY2Nlc3NpYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8ZnJhbWU+IGNvbnRhaW5pbmcgbm9uLUhUTUwgY29udGVudCBtdXN0IGJlIG1hZGUgYWNjZXNzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJzcmNcIikgJiZcbiAgICAgICAgICAgIFJQVFV0aWwuaXNIdG1sRXh0KFJQVFV0aWwuZ2V0RmlsZUV4dChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzcmNcIikpKTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgZnJhbWVfdGl0bGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImZyYW1lX3RpdGxlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZyYW1lLCBkb206aWZyYW1lXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfRnJhbWVfSGFzVGl0bGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmcmFtZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmcmFtZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmcmFtZV90aXRsZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIklubGluZSBmcmFtZXMgbXVzdCBoYXZlIGEgdW5pcXVlLCBub24tZW1wdHkgJ3RpdGxlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSW5saW5lIGZyYW1lIGRvZXMgbm90IGhhdmUgYSAndGl0bGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCAvKkNoYW5nZSBtYXBwaW5nIHRvIDQuMS4yIGZyb20gMi40LjEgdHlwbz8gKi9cbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFwiY2FlNzYwXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIGFuIGV4cGxpY2l0IHJvbGUgaXMgc3BlY2lmaWVkLiB0aGlzIGNhc2Ugd2lsbCBiZSBjb3ZlcmVkIGluIHRoZSBhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cyBydWxlc1xuICAgICAgICBsZXQgcm9sZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIik7XG4gICAgICAgIGlmIChyb2xlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgaGVhZGluZ19jb250ZW50X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJoZWFkaW5nX2NvbnRlbnRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aDEsIGRvbTpoMiwgZG9tOmgzLCBkb206aDQsIGRvbTpoNSwgZG9tOmg2XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfSGVhZGVyX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJoZWFkaW5nX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkhlYWRpbmcgZWxlbWVudCBoYXMgZGVzY3JpcHRpdmUgdGV4dFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJIZWFkaW5nIGVsZW1lbnQgaGFzIG5vIGRlc2NyaXB0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIZWFkaW5nIGVsZW1lbnRzIG11c3QgcHJvdmlkZSBkZXNjcmlwdGl2ZSB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuNlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGhlYWRpbmdfbWFya3VwX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJoZWFkaW5nX21hcmt1cF9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTpoMSwgZG9tOmgyLCBkb206aDMsIGRvbTpoNCwgZG9tOmg1LCBkb206aDZcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImhlYWRpbmdfY29udGVudF9leGlzdHNcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfSGVhZGVyc19GZXdXb3Jkc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJoZWFkaW5nX21hcmt1cF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImhlYWRpbmdfbWFya3VwX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgaGVhZGluZyBlbGVtZW50IGlzIGEgZ2VudWluZSBoZWFkaW5nXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSGVhZGluZyBlbGVtZW50cyBtdXN0IG5vdCBiZSB1c2VkIGZvciBwcmVzZW50YXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgaGVhZGluZ0xlbmd0aFRocmVzaDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAyMCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBoZWFkaW5nTGVuZ3RoVGhyZXNoID0gdmFsaWRhdGVQYXJhbXMuaGVhZGluZ0xlbmd0aFRocmVzaC52YWx1ZTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwud29yZENvdW50KFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KSkgPD0gaGVhZGluZ0xlbmd0aFRocmVzaDtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFuY2VzdG9yVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9hbmNlc3RvclwiO1xuaW1wb3J0IHsgTGFuZ1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGFuZ1wiO1xuXG5leHBvcnQgbGV0IGh0bWxfbGFuZ19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmh0bWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9IdG1sX0hhc0xhbmdcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIkZhaWxfNFwiLFxuICAgICAgICAgICAgXCJGYWlsXzVcIjogXCJGYWlsXzVcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQb3RlbnRpYWxfNVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBvdGVudGlhbF82XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzZcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSBtdXN0IGlkZW50aWZ5IHRoZSBkZWZhdWx0IGxhbmd1YWdlIG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgJ2xhbmcnIGF0dHJpYnV0ZVwiLCBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFnZSBsYW5ndWFnZSBkZXRlY3RlZCBhcyBcXFwiezB9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCwgYnV0IGhhcyBuZWl0aGVyICdsYW5nJyBub3IgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwsIGJ1dCBkb2VzIG5vdCBoYXZlIGFuICd4bWw6bGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgSFRNTCwgYnV0IGRvZXMgbm90IGhhdmUgYSAnbGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlBhZ2UgZGV0ZWN0ZWQgd2l0aCAnbGFuZycgYW5kICd4bWw6bGFuZycgYXR0cmlidXRlcyBhbmQgcHJpbWFyeSBsYW5ndWFnZXMgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiUGFnZSBkZXRlY3RlZCB3aXRoICdsYW5nJyBhbmQgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzIHRoYXQgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCB3aXRoIG9ubHkgYSAnbGFuZycgYXR0cmlidXRlLiBDb25maXJtIHRoYXQgcGFnZSBpcyBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sIG1pbWUgdHlwZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwgMS4wIHdpdGggb25seSBhbiAneG1sOmxhbmcnIGF0dHJpYnV0ZS4gQ29uZmlybSB0aGF0IHBhZ2UgaXMgb25seSBkZWxpdmVyZWQgdmlhIHhtbCBtaW1lIHR5cGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIzLjEuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF82XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCI1YjdhZTBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUaGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgaW5zaWRlIGEgcHJlc2VudGF0aW9uYWwgZnJhbWVcbiAgICAgICAgaWYgKEFuY2VzdG9yVXRpbC5pc1ByZXNlbnRhdGlvbkZyYW1lKGNvbnRleHRIaWVyYXJjaGllcykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBkb2N0eXBlU3RyaW5nID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlID8gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlLnB1YmxpY0lkIDogXCJcIjtcbiAgICAgICAgaWYgKCFkb2N0eXBlU3RyaW5nKSBkb2N0eXBlU3RyaW5nID0gXCJcIjtcbiAgICAgICAgbGV0IGxhbmcgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpO1xuICAgICAgICBsZXQgbGFuZ1hNTCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuXG4gICAgICAgIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmICFkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKFwiMS4wXCIpKSB7XG4gICAgICAgICAgICBpZiAoIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCAhPSAxLjAgKG11c3QgaGF2ZSB4bWw6bGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmdYTUxdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmIGRvY3R5cGVTdHJpbmcuaW5jbHVkZXMoXCIxLjBcIikpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBYSFRNTCAxLjBcbiAgICAgICAgICAgIC8vIElmIG5laXRoZXIgaXMgcHJvdmlkZWQsIGl0J3MgYSBmYWlsdXJlXG4gICAgICAgICAgICBpZiAoIWxhbmcgJiYgIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbm8gbGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyAmJiBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxhbmcgIT09IGxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmcpIHx8ICFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgRWxlbV9MYW5nX1ZhbGlkIGhhbmRsZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIUxhbmdVdGlsLm1hdGNoUHJpbWFyeUxhbmcobGFuZywgbGFuZ1hNTCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZywgYnV0IHRoZXkgZG9uJ3QgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNFwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNVwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZyBtYXRjaFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIixbbGFuZ10pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gWEhUTUwgYW5kIG9ubHkgbGFuZyAob2theSBpZiBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzVcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBvbmx5IHhtbDpsYW5nIChva2F5IGlmIG9ubHkgZGVsaXZlcmVkIHZpYSB4bWwgbWltZSB0eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzZcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWxhbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgJiYgbGFuZ1hNTCkge1xuICAgICAgICAgICAgICAgIC8vIEhUTUw1IHBvbHlnbG90IGRvY3VtZW50c1xuICAgICAgICAgICAgICAgIGlmIChsYW5nICE9PSBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nKSB8fCAhTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nWE1MKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IEVsZW1fTGFuZ19WYWxpZCBoYW5kbGUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5tYXRjaFByaW1hcnlMYW5nKGxhbmcsIGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcsIGJ1dCB0aGV5IGRvbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzRcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzVcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuICAgIFxuZXhwb3J0IGxldCBodG1sX3NraXBuYXZfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImh0bWxfc2tpcG5hdl9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpodG1sXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfSHRtbF9Ta2lwTmF2XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgaHRtbF9za2lwbmF2X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBodG1sX3NraXBuYXZfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgaHRtbF9za2lwbmF2X2V4aXN0cy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm92aWRlIGEgd2F5IHRvIGJ5cGFzcyBibG9ja3Mgb2YgY29udGVudCB0aGF0IGFyZSByZXBlYXRlZCBvbiBtdWx0aXBsZSBXZWIgcGFnZXNcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlcmUgaXMgYSB3YXkgdG8gYnlwYXNzIGJsb2NrcyBvZiBjb250ZW50IHRoYXQgYXJlIHJlcGVhdGVkIG9uIG11bHRpcGxlIFdlYiBwYWdlc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgbnVtOiBcIjIuNC4xXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGZyYW1lcyA9IFJQVFV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJmcmFtZVwiKTtcbiAgICAgICAgbGV0IGhlYWRlcnMgPSBSUFRVdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiaDFcIik7XG5cbiAgICAgICAgaWYgKChmcmFtZXMgIT0gbnVsbCAmJiBmcmFtZXMubGVuZ3RoID4gMCkgfHwgKGhlYWRlcnMgIT0gbnVsbCAmJiBoZWFkZXJzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgICAvLyBJZiBmcmFtZXMgb3IgaGVhZGluZ3MgYXJlIHVzZWQsIHBhc3NcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBMb29rIGZvciBza2lwIGFuY2hvcnNcbiAgICAgICAgICAgIGxldCBhbmNob3JzID0gUlBUVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImFcIik7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0cyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgIXBhc3NlZCAmJiBpZHggPCBhbmNob3JzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yc1tpZHhdLmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhyZWYgPSBhbmNob3JzW2lkeF0uaHJlZjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBocmVmICE9PSB0eXBlb2YgXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhyZWYuYmFzZVZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWYgPSBocmVmLmJhc2VWYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWYgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCB0bXBMb2NhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQgYXMgYW55KS5sb2NhdGlvbkZyb21EQVApICE9IFwidW5kZWZpbmVkXCIgJiYgKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQgYXMgYW55KS5sb2NhdGlvbkZyb21EQVAgIT0gbnVsbCkgeyAvLyBEQVAgc2V0cyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgdG1wTG9jYXRpb24gPSAocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCBhcyBhbnkpLmxvY2F0aW9uRnJvbURBUDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gc2VydmVyIHNjYW4gaGFzIHRoZSBsb2NhdGlvbiBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcExvY2F0aW9uID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5sb2NhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgZG9jSHJlZiA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0bXBMb2NhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jSHJlZiA9IHRtcExvY2F0aW9uLmhyZWY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gRml4IHdlaXJkIGJ1Z3Mgd2l0aCBob3cgdmFyaW91cyBwYXJzZXJzIHJlcG9ydCBvbiBmaWxlOiB1cmwnczpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhyZWYuc3RhcnRzV2l0aChcImZpbGU6Ly8vXCIpKSBocmVmID0gXCJmaWxlOi9cIiArIGhyZWYuc3Vic3RyaW5nKFwiZmlsZTovLy9cIi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9jSHJlZi5zdGFydHNXaXRoKFwiZmlsZTovLy9cIikpIGRvY0hyZWYgPSBcImZpbGU6L1wiICsgZG9jSHJlZi5zdWJzdHJpbmcoXCJmaWxlOi8vL1wiLmxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhyZWYuY2hhckF0KDApID09IFwiI1wiIHx8IGhyZWYuc3RhcnRzV2l0aChkb2NIcmVmICsgXCIjXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gUlBUVXRpbC5nZXRGaWxlQW5jaG9yKGhyZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCB0YXJnZXQpICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzW3RhcmdldF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNob3JzW2lkeF0uaGFzQXR0cmlidXRlKFwibmFtZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgZm9yd2FyZCBqdW1waW5nIHRhcmdldHNcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBhbmNob3JzW2lkeF0uZ2V0QXR0cmlidXRlKFwibmFtZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZihcIiNcIikgIT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gUlBUVXRpbC5nZXRGaWxlQW5jaG9yKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBuYW1lIGluIHRhcmdldHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJpZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTppZnJhbWVcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcImlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSWZyYW1lIHdpdGggaW50ZXJhY3RpdmUgY29udGVudCBzaG91bGQgbm90IGJlIGV4Y2x1ZGVkIGZyb20gdGFiIG9yZGVyIHVzaW5nIHRhYmluZGV4XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgaWZyYW1lIHdpdGggaW50ZXJhY3RpdmUgY29udGVudCBpcyBub3QgZXhjbHVkZWQgZnJvbSB0aGUgdGFiIG9yZGVyIHVzaW5nIHRhYmluZGV4XCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcIlRoZSA8aWZyYW1lPiB3aXRoIGludGVyYWN0aXZlIGNvbnRlbnQgaXMgZXhjbHVkZWQgZnJvbSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW1wiYWtuN2JuXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgYm91bmRzID0gY29udGV4dFtcImRvbVwiXS5ib3VuZHM7XG4gICAgICAgIC8vaW4gY2FzZSB0aGUgYm91bmRzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgaWYgKCFib3VuZHMpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIGlmcmFtZSBpcyB0b28gc21hbGwgdG8gYmUgdmlzaWJsZSBvbiBzY3JlZW5cbiAgICAgICAgaWYgKE1hdGgubWF4KGJvdW5kc1snaGVpZ2h0J10sIGJvdW5kc1snd2lkdGgnXSkgPCAzMCB8fCBNYXRoLm1pbihib3VuZHNbJ2hlaWdodCddLCBib3VuZHNbJ3dpZHRoJ10pIDwgMTUpICBcbiAgICAgICAgICAgcmV0dXJuIG51bGw7IFxuXG4gICAgICAgIC8vIHBhc3MgaWZyYW1lIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHRhYmluZGV4IGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIGEgbmVnYXRpdmUgbnVtYmVyXG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikgfHwgcGFyc2VJbnQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikpID49IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmcmFtZSBjb250ZW50XG4gICAgICAgIGNvbnN0IGlmcmFtRWxlbSA9IHJ1bGVDb250ZXh0IGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICBpZiAoIWlmcmFtRWxlbSB8fCAhaWZyYW1FbGVtLmNvbnRlbnREb2N1bWVudCB8fCAhaWZyYW1FbGVtLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjb3VudCA9IFJQVFV0aWwuZ2V0VGFiYmFibGVDaGlsZHJlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChjb3VudCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRcIik7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X0V4cGxpY2l0TGFiZWxJbWFnZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJQYXNzXzFcIixcbiAgICAgICAgICAgIFwiUGFzc18yXCI6IFwiUGFzc18yXCIsXG4gICAgICAgICAgICBcIkZhaWxcIjogXCJGYWlsXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkltYWdlIGJ1dHRvbiBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0IHVzaW5nIHRoZSAnYWx0JyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiSW1hZ2UgYnV0dG9uIHByb3ZpZGVzIGFsdGVybmF0aXZlIHRleHQgdXNpbmcgYSBBUklBIGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcIkltYWdlIGJ1dHRvbiBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0IHVzaW5nIHRoZSAndGl0bGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXCI6IFwiVGhlIDxpbnB1dD4gZWxlbWVudCBvZiB0eXBlIFxcXCJpbWFnZVxcXCIgaGFzIG5vIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgPGlucHV0PiBlbGVtZW50IG9mIHR5cGUgXFxcImltYWdlXFxcIiBzaG91bGQgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNTk3OTZmXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9XQUkvV0NBRzIxL1RlY2huaXF1ZXMvZmFpbHVyZXMvRjY1XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCkgIT0gXCJpbWFnZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGltYWdlbWFwX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1t1c2VtYXBdLCBkb206aW1nW2lzbWFwXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19JbWdfVXNlbWFwQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImltYWdlbWFwX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltYWdlbWFwX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbWFnZSBtYXAgb3IgY2hpbGQgPGFyZWE+IGhhcyBubyB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gaW1hZ2UgbWFwIGFuZCBlYWNoIDxhcmVhPiBlbGVtZW50IGluIGFuIGltYWdlIG1hcCBtdXN0IGhhdmUgdGV4dCBhbHRlcm5hdGl2ZShzKVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikgfHxcbiAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaXNtYXBcIikgJiYgIVJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidXNlbWFwXCIpKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGltZ19hbHRfYmFja2dyb3VuZDogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfYWx0X2JhY2tncm91bmRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0JhY2tncm91bmRJbWdfSGFzVGV4dE9yVGl0bGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9iYWNrZ3JvdW5kLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJpbWdfYWx0X2JhY2tncm91bmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfYmFja2dyb3VuZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGltcG9ydGFudCBiYWNrZ3JvdW5kIGltYWdlIGluZm9ybWF0aW9uIGhhcyBhIHRleHQgYWx0ZXJuYXRpdmUgaW4gc3lzdGVtIGhpZ2ggY29udHJhc3QgbW9kZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkJhY2tncm91bmQgaW1hZ2VzIHRoYXQgY29udmV5IGltcG9ydGFudCBpbmZvcm1hdGlvbiBtdXN0IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGVzY3JpYmVzIHRoZSBpbWFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgc3R5bGUgPSBkb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChzdHlsZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJhY2tncm91bmRJbWdzID0gc3R5bGUuYmFja2dyb3VuZEltYWdlO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoYmFja2dyb3VuZEltZ3MgIT0gbnVsbCAmJiBiYWNrZ3JvdW5kSW1ncyAhPSBcIlwiICYmIGJhY2tncm91bmRJbWdzICE9ICdub25lJyAmJiBiYWNrZ3JvdW5kSW1ncyAhPSAnaW5oZXJpdCcpIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5pbm5lckhUTUwgIT0gbnVsbCAmJiBydWxlQ29udGV4dC5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCAmJiB0aXRsZS5sZW5ndGggIT0gMClcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgaW1nX2FsdF9kZWNvcmF0aXZlOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfZGVjb3JhdGl2ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1thbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW1nX1ByZXNlbnRhdGlvbkltZ0hhc05vbk51bGxBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfYWx0X2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbWdfYWx0X2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfZGVjb3JhdGl2ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkltYWdlIGRlc2lnbmF0ZWQgYXMgZGVjb3JhdGl2ZSBoYXMgbm9uLW51bGwgJ2FsdCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW1hZ2UgZGVzaWduYXRlZCBhcyBkZWNvcmF0aXZlIG11c3QgaGF2ZSAnYWx0PVxcXCJcXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcInByZXNlbnRhdGlvblwiKSB8fCBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwibm9uZVwiKSkge1xuICAgICAgICAgICAgcGFzc2VkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLmxlbmd0aCA9PSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgaW1nX2FsdF9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWcsIGRvbTphcmVhLCBkb206aW5wdXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9JbWdfQWx0Q29tbW9uTWlzdXNlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19hbHRfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbWdfYWx0X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1nX2FsdF9taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBmaWxlIG5hbWUgc2VydmVzIGFzIGEgZ29vZCBpbmxpbmUgcmVwbGFjZW1lbnQgZm9yIHRoZSBpbWFnZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidhbHQnIGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIGEgZ29vZCBpbmxpbmUgcmVwbGFjZW1lbnQgZm9yIHRoZSBpbWFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBiYWRUZXh0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcInNob3J0IGRlc2NyaXB0aW9uXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIC8vIEFsdCB0ZXh0IGNoZWNrIGFyZSBlbHNld2hlcmUgKFNlZSA0MSwgMjQwLCA0NTUpXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgIGxldCBhbHRUZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChhbHRUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgYmFkVGV4dCA9IHZhbGlkYXRlUGFyYW1zLmJhZFRleHQudmFsdWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgYmFkVGV4dC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBhbHRUZXh0LmluZGV4T2YoYmFkVGV4dFtpXSkgPT0gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNyYyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgobm9kZU5hbWUgPT0gXCJhcmVhXCIpID8gXCJocmVmXCIgOiBcInNyY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgaXQgdG8gcGFzcyBpZiB0aGVyZSdzIG5vIHNyYyAtIGNhbid0IGRldGVybWluZSB0aGVzZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNyYyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsIGlmIHRoZSBhbHQgbWF0Y2hlcyB0aGUgc3JjIGV4YWN0bHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsc28gZmFpbCBpZiB0aGUgYWx0IGhhcyBhIC4gaW4gaXQgYW5kIGVpdGhlciB0aGUgc3JjIGlzIGluIHRoZSBhbHQgb3IgdGhlIGFsdCBpcyBpbiB0aGUgc3JjXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBzcmMudHJpbSgpICE9IGFsdFRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWx0VGV4dC5pbmRleE9mKFwiLlwiKSA9PSAtMSB8fCAoYWx0VGV4dC5pbmRleE9mKHNyYykgPT0gLTEgJiYgc3JjLmluZGV4T2YoYWx0VGV4dCkgPT0gLTEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBpbWdfYWx0X251bGw6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9udWxsXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2FsdF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbWdfVGl0bGVFbXB0eVdoZW5BbHROdWxsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X251bGwuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgaW1hZ2UgJ2FsdCcgYXR0cmlidXRlIGlzIGVtcHR5LCBidXQgdGhlICd0aXRsZScgYXR0cmlidXRlIGlzIG5vdCBlbXB0eVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIldoZW4gdGhlIGltYWdlICdhbHQnIGF0dHJpYnV0ZSBpcyBlbXB0eSwgdGhlICd0aXRsZScgYXR0cmlidXRlIG11c3QgYWxzbyBiZSBlbXB0eVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBoYXZlIGEgdGl0bGUsIGJ1dCBhbHQgaXMgZW1wdHlcbiAgICAgICAgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgaW1nX2FsdF9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9yZWR1bmRhbnRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19MaW5rVGV4dE5vdFJlZHVuZGFudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbWdfYWx0X3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTGluayB0ZXh0IGlzIHJlcGVhdGVkIGluIGFuIGltYWdlICdhbHQnIHZhbHVlIHdpdGhpbiB0aGUgc2FtZSBsaW5rXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkxpbmsgdGV4dCBvZiBwcmV2aW91cyBsaW5rIGlzIHJlcGVhdGVkIGluIGltYWdlICdhbHQnIHZhbHVlIG9mIGEgbGlua1wiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJJbWFnZSAnYWx0JyB2YWx1ZSB3aXRoaW4gYSBsaW5rIGlzIHJlcGVhdGVkIGluIGxpbmsgdGV4dCBvZiB0aGUgbGluayBhZnRlclwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSB0ZXh0IGFsdGVybmF0aXZlIGZvciBhbiBpbWFnZSB3aXRoaW4gYSBsaW5rIHNob3VsZCBub3QgcmVwZWF0IHRoZSBsaW5rIHRleHQgb3IgYWRqYWNlbnQgbGluayB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgYU5vZGUgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImFcIik7XG4gICAgICAgIC8vSWYgbm90IGluIGFuIGFuY2hvciwgT3V0IG9mIFNjb3BlXG4gICAgICAgIGlmIChhTm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgYWx0VGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGFsdFRleHQubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIElmIGFsdCB0ZXh0IGlzIGVtcHR5LCB0aGVyZSdzIG5vIHRleHQgdG8gYmUgcmVkdW5kYW50IC0gbGV0IGFfdGV4dF9wdXJwb3NlXG4gICAgICAgICAgICAvLyB0cmlnZ2VyIGluIHRoYXQgY2FzZS5cbiAgICAgICAgICAgIC8vIFNvIE91dCBvZiBTY29wZSBmb3IgdGhpcyBydWxlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5uZXJUZXh0ID0gYU5vZGUuaW5uZXJUZXh0O1xuICAgICAgICBsZXQgbGlua1RleHQgPSBcIlwiO1xuXG4gICAgICAgIGlmIChpbm5lclRleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGlua1RleHQgPSBpbm5lclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbmtUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChhbHRUZXh0ID09IGxpbmtUZXh0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGV4dCBpbiBsaW5rXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAvL2FsdCBpcyBub24temVybywgYnV0IG5vIGxpbmsgdGV4dCAtIGVuc3VyZSBhZGphY2VudCBsaW5rIHRleHQgaXNuJ3QgcmVkdW5kYW50XG4gICAgICAgICAgICBsZXQgd2FsayA9IG5ldyBOb2RlV2Fsa2VyKGFOb2RlKTtcbiAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsay5wcmV2Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBub2RlIGFuZCBub2RlTmFtZVxuICAgICAgICAgICAgICAgIGxldCBub2RlID0gd2Fsay5ub2RlO1xuICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoKG5vZGVOYW1lID09IFwiI3RleHRcIiAmJiBub2RlLm5vZGVWYWx1ZS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAobm9kZU5hbWUgPT0gXCJpbWdcIiAmJiBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29tcGx5IHdpdGggdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcgaWYgdGhlIGEgZWxlbWVudCBzaG91bGQgYmUgY2hlY2tlZCBvciBub3RcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJhXCIgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUZXh0IGJlZm9yZSBpbWFnZSBsaW5rXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9ICgobm9kZSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0IHx8IG5vZGUudGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT0gYWx0VGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGsgPSBuZXcgTm9kZVdhbGtlcihhTm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGsubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBhbmQgbm9kZU5hbWVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGsubm9kZTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKG5vZGVOYW1lID09IFwiI3RleHRcIiAmJiBub2RlLm5vZGVWYWx1ZS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAobm9kZU5hbWUgPT0gXCJpbWdcIiAmJiBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29tcGx5IHdpdGggdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcgaWYgdGhlIGEgZWxlbWVudCBzaG91bGQgYmUgY2hlY2tlZCBvciBub3RcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlTmFtZSA9PSBcImFcIiAmJiAhUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChub2RlIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT0gYWx0VGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIFRleHQgYWZ0ZXIgaW1hZ2UgbGlua1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBpbWdfYWx0X3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbWdfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua19hbHRcIjogXCJmYWlsX2JsYW5rX2FsdFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FsdFwiOiBcImZhaWxfbm9fYWx0XCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJmYWlsX2JsYW5rX3RpdGxlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfYWx0XCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkltYWdlcyBoYXMgcmVxdWlyZWQgJ2FsdCcgYXR0cmlidXRlLCBBUklBIGxhYmVsIG9yIHRpdGxlIGlmIHRoZXkgY29udmV5IG1lYW5pbmcsIG9yICdhbHQ9XFxcIlxcXCIgaWYgZGVjb3JhdGl2ZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2JsYW5rX2FsdFwiOiBcIkltYWdlICdhbHQnIGF0dHJpYnV0ZSB2YWx1ZSBjb25zaXN0cyBvbmx5IG9mIGJsYW5rIHNwYWNlKHMpXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiVGhlIGltYWdlIGhhcyBuZWl0aGVyIGFuIGFsdCBhdHR0cmlidXRlIG5vciBhbiBBUklBIGxhYmVsIG9yIHRpdGxlXCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJUaGUgaW1hZ2UgZG9lcyBub3QgaGF2ZSBhbiBhbHQgYXR0cmlidXRlIG9yIEFSSUEgbGFiZWwgYW5kICd0aXRsZScgYXR0cmlidXRlIHZhbHVlIGNvbnNpc3RzIG9ubHkgb2YgYmxhbmsgc3BhY2UocylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbWFnZXMgcmVxdWlyZSBhbiAnYWx0JyBhdHRyaWJ1dGUgd2l0aCBhIHNob3J0IHRleHQgYWx0ZXJuYXRpdmUgaWYgdGhleSBjb252ZXkgbWVhbmluZywgb3IgJ2FsdD1cXFwiXFxcIiBpZiBkZWNvcmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIjIzYTJhOFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIElmIG5vdCB2aXNpYmxlIHRvIHRoZSBzY3JlZW4gcmVhZGVyLCBpZ25vcmVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy9wYXNzIGlmIGltYWdlcyB3aXRoIGEgdmFsaWQgJ2FsdCcgICAgXG4gICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgIGlmIChhbHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChhbHQudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTsgICBcbiAgICAgICAgICAgIGVsc2UgeyBcbiAgICAgICAgICAgICAgICAvLyBhbHQudHJpbSgpLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgIGlmIChhbHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBhbHQgY29udGFpbnMgYmxhbmsgc3BhY2Ugb25seSAoYWx0PVwiIFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2JsYW5rX2FsdFwiKTsgIFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFsdC5sZW5ndGggPT09IDAsIHByZXNlbnRhdGlvbmFsIGltYWdlLCB0aXRsZSBpcyBvcHRpb25hbCwgaGFuZGxlZCBieSBvdGhlciBydWxlKHMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAgUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vIGFsdFxuICAgICAgICAgICAgbGV0IGxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTsgICBcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGl0bGUudHJpbSgpLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aXRsZSBjb250YWlucyBibGFuayBzcGFjZSBvbmx5ICh0aXRsZT1cIiBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2JsYW5rX3RpdGxlXCIpOyAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmVpdGhlciBhbHQgbm9yIGFyaWEgbGFiZWwgb3IgdGl0bGUgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fYWx0XCIpOyBcbiAgICAgICAgICAgICAgICB9ICBcbiAgICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGltZ19pc21hcF9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2lzbWFwX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1tpc21hcF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9JbWdfVXNlbWFwVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2lzbWFwX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiaW1nX2lzbWFwX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1nX2lzbWFwX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiU2VydmVyLXNpZGUgaW1hZ2UgbWFwIGhvdC1zcG90cyBkbyBub3QgaGF2ZSBkdXBsaWNhdGUgdGV4dCBsaW5rc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNlcnZlci1zaWRlIGltYWdlIG1hcCBob3Qtc3BvdHMgbXVzdCBoYXZlIGR1cGxpY2F0ZSB0ZXh0IGxpbmtzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInVzZW1hcFwiKSkge1xuICAgICAgICAgICAgbGV0IHVzZW1hcCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInVzZW1hcFwiKTtcbiAgICAgICAgICAgIHVzZW1hcCA9IHVzZW1hcC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGxldCBpZHggPSB1c2VtYXAuaW5kZXhPZihcIiNcIik7XG4gICAgICAgICAgICBpZiAoaWR4ICE9IC0xKVxuICAgICAgICAgICAgICAgIHVzZW1hcCA9IHVzZW1hcC5zdWJzdHIoaWR4ICsgMSk7XG5cbiAgICAgICAgICAgIGlmICh1c2VtYXAubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBtYXBzID0gUlBUVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcIm1hcFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgbWFwcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBtYXBzW2ldLmhhc0F0dHJpYnV0ZShcIm5hbWVcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcHNbaV0uZ2V0QXR0cmlidXRlKFwibmFtZVwiKS50b0xvd2VyQ2FzZSgpID09IHVzZW1hcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgaW1nX2xvbmdkZXNjX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2xvbmdkZXNjXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0ltZ19Mb25nRGVzY3JpcHRpb24yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBmaWxlIGRlc2lnbmF0ZWQgYnkgdGhlICdsb25nZGVzYycgYXR0cmlidXRlIGNvbnRhaW5zIHZhbGlkIEhUTUwgY29udGVudCAoZmlsZSBleHRlbnNpb24gbm90IHJlY29nbml6ZWQpXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiIFRoZSAnbG9uZ2Rlc2MnIGF0dHJpYnV0ZSBtdXN0IHJlZmVyZW5jZSBIVE1MIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGxvbmdkZXNjID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibG9uZ2Rlc2NcIik7XG4gICAgICAgIC8vIGlmIChsb25nZGVzYyBpcyBiYWQgVVJMKSBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICBsZXQgZXh0ID0gUlBUVXRpbC5nZXRGaWxlRXh0KGxvbmdkZXNjKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGV4dC5sZW5ndGggIT0gMCAmJiBSUFRVdGlsLmlzSHRtbEV4dChleHQpXG4gICAgICAgICAgICB8fCBsb25nZGVzYy5zdGFydHNXaXRoKFwiI1wiKVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcImh0dHA6Ly9cIilcbiAgICAgICAgICAgIHx8IGxvbmdkZXNjLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcImRhdGE6XCIpO1xuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBcIm5wbSBydW4gcHJlYnVpbGRcIi4gRG8gbm90IGVkaXRcblxuZXhwb3J0ICogZnJvbSBcIi4vYV90YXJnZXRfd2FybmluZ1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hX3RleHRfcHVycG9zZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcHBsZXRfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJlYV9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX2FsbG93ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3RcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3JlcXVpcmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Jhbm5lcl9zaW5nbGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jaGlsZF90YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NoaWxkX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29udGVudF9pbl9sYW5kbWFya1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX3NpbmdsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Rlc2NlbmRhbnRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Zvcm1fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfZ3JhcGhpY19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2hpZGRlbl9ub250YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2lkX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2ltZ19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9tYWluX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX21haW5fbGFiZWxfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfcGFyZW50X3JlcXVpcmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JlZ2lvbl9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JvbGVfYWxsb3dlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JvbGVfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3NlbWFudGljc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfd2lkZ2V0X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FzY2lpYXJ0X2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxpbmtfY3NzX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9ibGlua19lbGVtX2RlcHJlY2F0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxvY2txdW90ZV9jaXRlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9jYW52YXNfY29udGVudF9kZXNjcmliZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY2FwdGlvbl90cmFja19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2Rlc2lnbl92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9jb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfaGFzcG9wdXBfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RlYnVnX3BhdGhzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RldGVjdG9yX3RhYmJhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Rpcl9hdHRyaWJ1dGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfaWRfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfbGFuZ192YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9vcmllbnRhdGlvbl91bmxvY2tlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfdGFiYmFibGVfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbWJlZF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VtYmVkX25vZW1iZWRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Vtb3RpY29uc19hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yX21lc3NhZ2VfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZpZWxkc2V0X2xhYmVsX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZpZWxkc2V0X2xlZ2VuZF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9maWd1cmVfbGFiZWxfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Zvcm1fZm9udF9jb2xvclwiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2ludGVyYWN0aW9uX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Zvcm1fc3VibWl0X3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mcmFtZV9zcmNfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZnJhbWVfdGl0bGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2hlYWRpbmdfY29udGVudF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaGVhZGluZ19tYXJrdXBfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2h0bWxfbGFuZ19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaHRtbF9za2lwbmF2X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1hZ2VidXR0b25fYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWFnZW1hcF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfYmFja2dyb3VuZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X2RlY29yYXRpdmVcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9udWxsXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2lzbWFwX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfbG9uZ2Rlc2NfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2F1dG9jb21wbGV0ZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9jaGVja2JveGVzX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfZmllbGRzX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfaGFzcG9wdXBfY29uZmxpY3RcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfYWZ0ZXJcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfYmVmb3JlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2xhYmVsX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X29uY2hhbmdlX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xhYmVsX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xhYmVsX25hbWVfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9sYWJlbF9yZWZfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9jaGlsZHJlbl92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9saXN0X21hcmt1cF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9zdHJ1Y3R1cmVfcHJvcGVyXCJcbmV4cG9ydCAqIGZyb20gXCIuL21hcnF1ZWVfZWxlbV9hdm9pZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hbHRfYnJpZWZcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hdWRpb190cmFuc2NyaWJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL21lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9saXZlX2NhcHRpb25lZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV90cmFja19hdmFpbGFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV9yZWRpcmVjdF9vcHRpb25hbFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZXRhX3JlZnJlc2hfZGVsYXlcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV92aWV3cG9ydF96b29tYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9ub2VtYmVkX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL29iamVjdF90ZXh0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9wYWdlX3RpdGxlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9wYWdlX3RpdGxlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NjcmlwdF9mb2N1c19ibHVyX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfb25jbGlja19hdm9pZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfb25jbGlja19taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2NyaXB0X3NlbGVjdF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2VsZWN0X29wdGlvbnNfZ3JvdXBlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9za2lwX21haW5fZGVzY3JpYmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NraXBfbWFpbl9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfY29sb3JfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2ZvY3VzX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfaG92ZXJfcGVyc2lzdGVudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zdHlsZV92aWV3cG9ydF9yZXNpemFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfYXJpYV9kZXNjZW5kYW50c1wiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9jYXB0aW9uX2VtcHR5XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2NhcHRpb25fbmVzdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2hlYWRlcnNfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2hlYWRlcnNfcmVsYXRlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9sYXlvdXRfbGluZWFyaXplZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9zY29wZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX3N1bW1hcnlfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfYmxvY2tfaGVhZGluZ1wiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9xdW90ZWRfY29ycmVjdGx5XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfc2Vuc29yeV9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9zcGFjaW5nX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfd2hpdGVzcGFjZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi93aWRnZXRfdGFiYmFibGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3dpZGdldF90YWJiYWJsZV9zaW5nbGVcIiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRbYXV0b2NvbXBsZXRlXSwgZG9tOnRleHRhcmVhW2F1dG9jb21wbGV0ZV0sIGRvbTpzZWxlY3RbYXV0b2NvbXBsZXRlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX0lucHV0X0F1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfYXR0cmlidXRlX2luY29ycmVjdFwiOiBcIkZhaWxfYXR0cmlidXRlX2luY29ycmVjdFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9hdHRyaWJ1dGVfaW5jb3JyZWN0XCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2F1dG9jb21wbGV0ZScgYXR0cmlidXRlJ3MgdG9rZW4ocykgbXVzdCBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGlucHV0IGZvcm0gZmllbGRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlICdhdXRvY29tcGxldGUnIGF0dHJpYnV0ZSdzIHRva2VuKHMpIGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnB1dCBmb3JtIGZpZWxkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUncyB0b2tlbihzKSBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciBhbiBpbnB1dCBmb3JtIGZpZWxkIG9mIGFueSB0eXBlXCIsXG4gICAgICAgICAgICBcIkZhaWxfYXR0cmlidXRlX2luY29ycmVjdFwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgaGFzIGFuIGluY29ycmVjdCB2YWx1ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjVcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjczZjJjMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfYXR0cmlidXRlX2luY29ycmVjdFwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgY2FjaGUgPSB7XG4gICAgICAgICAgICBcInRva2Vuc09uT2ZmXCI6IFtcIm9uXCIsIFwib2ZmXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbk9wdGlvbmFsU2VjdGlvblwiOiBcInNlY3Rpb24tXCIsXG4gICAgICAgICAgICBcInRva2Vuc09wdGlvbmFsUHVycG9zZVwiOiBbXCJzaGlwcGluZ1wiLCBcImJpbGxpbmdcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9wYXNzd29yZFwiOiBbXCJuZXctcGFzc3dvcmRcIiwgXCJjdXJyZW50LXBhc3N3b3JkXCIsIFwib25lLXRpbWUtY29kZVwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX211bHRpbGluZVwiOiBbXCJzdHJlZXQtYWRkcmVzc1wiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX21vbnRoXCI6IFtcImNjLWV4cFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX251bWVyaWNcIjogW1wiY2MtZXhwLW1vbnRoXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1leHAteWVhclwiLFxuICAgICAgICAgICAgICAgIFwidHJhbnNhY3Rpb24tYW1vdW50XCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LWRheVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS1tb250aFwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS15ZWFyXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfZGF0ZVwiOiBbXCJiZGF5XCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfdXJsXCI6IFtcInVybFwiLCBcInBob3RvXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfdGV4dFwiOiBbXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtcHJlZml4XCIsXG4gICAgICAgICAgICAgICAgXCJnaXZlbi1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImZhbWlseS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtc3VmZml4XCIsXG4gICAgICAgICAgICAgICAgXCJuaWNrbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwidXNlcm5hbWVcIixcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvbi10aXRsZVwiLFxuICAgICAgICAgICAgICAgIFwib3JnYW5pemF0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUxXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsNFwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDNcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsMVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJwb3N0YWwtY29kZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZ2l2ZW4tbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1mYW1pbHktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1jc2NcIixcbiAgICAgICAgICAgICAgICBcImNjLXR5cGVcIixcbiAgICAgICAgICAgICAgICBcInRyYW5zYWN0aW9uLWN1cnJlbmN5XCIsXG4gICAgICAgICAgICAgICAgXCJsYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIFwic2V4XCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsXCI6IFtcIm5hbWVcIixcbiAgICAgICAgICAgICAgICBcImhvbm9yaWZpYy1wcmVmaXhcIixcbiAgICAgICAgICAgICAgICBcImdpdmVuLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImFkZGl0aW9uYWwtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiZmFtaWx5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImhvbm9yaWZpYy1zdWZmaXhcIixcbiAgICAgICAgICAgICAgICBcIm5pY2tuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJ1c2VybmFtZVwiLFxuICAgICAgICAgICAgICAgIFwibmV3LXBhc3N3b3JkXCIsXG4gICAgICAgICAgICAgICAgXCJjdXJyZW50LXBhc3N3b3JkXCIsXG4gICAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb24tdGl0bGVcIixcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIFwic3RyZWV0LWFkZHJlc3NcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTFcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTJcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTNcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWw0XCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsM1wiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDJcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwxXCIsXG4gICAgICAgICAgICAgICAgXCJjb3VudHJ5XCIsXG4gICAgICAgICAgICAgICAgXCJjb3VudHJ5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcInBvc3RhbC1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1naXZlbi1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1hZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWZhbWlseS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1udW1iZXJcIixcbiAgICAgICAgICAgICAgICBcImNjLWV4cFwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZXhwLW1vbnRoXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1leHAteWVhclwiLFxuICAgICAgICAgICAgICAgIFwiY2MtY3NjXCIsXG4gICAgICAgICAgICAgICAgXCJjYy10eXBlXCIsXG4gICAgICAgICAgICAgICAgXCJ0cmFuc2FjdGlvbi1jdXJyZW5jeVwiLFxuICAgICAgICAgICAgICAgIFwidHJhbnNhY3Rpb24tYW1vdW50XCIsXG4gICAgICAgICAgICAgICAgXCJsYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS1kYXlcIixcbiAgICAgICAgICAgICAgICBcImJkYXktbW9udGhcIixcbiAgICAgICAgICAgICAgICBcImJkYXkteWVhclwiLFxuICAgICAgICAgICAgICAgIFwic2V4XCIsXG4gICAgICAgICAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgICAgICAgICBcInBob3RvXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNPcHRpb25hbEdyb3VwMlwiOiBbXCJob21lXCIsXG4gICAgICAgICAgICAgICAgXCJ3b3JrXCIsXG4gICAgICAgICAgICAgICAgXCJtb2JpbGVcIixcbiAgICAgICAgICAgICAgICBcImZheFwiLFxuICAgICAgICAgICAgICAgIFwicGFnZXJcIl0sXG5cbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX3RlbFwiOiBbXCJ0ZWxcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl9lbWFpbFwiOiBbXCJlbWFpbFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX3VybFwiOiBbXCJpbXBwXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDJfdGV4dFwiOiBbXCJ0ZWwtY291bnRyeS1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbmF0aW9uYWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1hcmVhLWNvZGVcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXByZWZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXN1ZmZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWV4dGVuc2lvblwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbFwiOiBbXCJ0ZWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1jb3VudHJ5LWNvZGVcIixcbiAgICAgICAgICAgICAgICBcInRlbC1uYXRpb25hbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWFyZWEtY29kZVwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWwtcHJlZml4XCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWwtc3VmZml4XCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtZXh0ZW5zaW9uXCIsXG4gICAgICAgICAgICAgICAgXCJlbWFpbFwiLFxuICAgICAgICAgICAgICAgIFwiaW1wcFwiXVxuICAgICAgICB9XG4gICAgICAgIGxldCB2YWxpZF92YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGNhY2hlKVxuICAgICAgICAgICAgdmFsaWRfdmFsdWVzPXZhbGlkX3ZhbHVlcy5jb25jYXQoY2FjaGVba2V5XSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZm91bmRNYW5kYXRvcnlUb2tlbiA9IGZhbHNlO1xuICAgICAgICBsZXQgZm91bmRSZWNvZ25pemVkVG9rZW4gPSB0cnVlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgIFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkgOiBcInRleHRcIjtcblxuICAgICAgICBsZXQgYXV0b2NvbXBsZXRlQXR0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgdG9rZW5zID0gYXV0b2NvbXBsZXRlQXR0ci5zcGxpdCgvXFxzKy8pO1xuICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCB8fCBhdXRvY29tcGxldGVBdHRyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICghdG9rZW5zLmV2ZXJ5KHIgPT4gdmFsaWRfdmFsdWVzLmluY2x1ZGVzKHIpIHx8IHIuc3RhcnRzV2l0aChjYWNoZVsndG9rZW5PcHRpb25hbFNlY3Rpb24nXSkpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9hdHRyaWJ1dGVfaW5jb3JyZWN0XCIpO1xuICAgICAgICBcbiAgICAgICAgbGV0IHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IFtdO1xuICAgICAgICBsZXQgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gW107XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInRleHRhcmVhXCIgfHwgbm9kZU5hbWUgPT09IFwic2VsZWN0XCIpIHtcbiAgICAgICAgICAgIC8vIGFjY2VwdCBhbGwgdG9rZW5zXG4gICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsO1xuICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbDtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgdGhlIHZhcmlvdXMgJ2lucHV0JyB0eXBlc1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIGNoZWNrIGZvciBpbnB1dCB0eXBlPWhpZGRlbiBmb3Igbm93IGJhc2VkIG9uIHNjcnVtIGRpc2N1c3Npb25cbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgIGNhc2UgXCJoaWRkZW5cIjpcbiAgICAgICAgICAgICAgICAgICAgLy8gYWNjZXB0IGFsbCB0b2tlbnNcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX2FsbDtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcInNlYXJjaFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfdGV4dC5jb25jYXQoY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX3Bhc3N3b3JkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX3VybCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9udW1lcmljLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX21vbnRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX2RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfYWxsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwicGFzc3dvcmRcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX3Bhc3N3b3JkO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV91cmw7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl91cmw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlbWFpbFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfZW1haWw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZWxcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX3RlbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfbnVtZXJpYztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1vbnRoXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9tb250aDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX2RhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIC8vIHVuc3VwcG9ydGVkIHR5cGUgZm9yIHRoaXMgcnVsZS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZS5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlzYWJsZSBjaGVjayBmb3IgaW5wdXQgdHlwZT1oaWRkZW4gZm9yIG5vdyBiYXNlZCBvbiBzY3J1bSBkaXNjdXNzaW9uXG4gICAgICAgIGxldCBhdXRvZmlsbE1hbnRsZSA9IC8qIChub2RlTmFtZT09PVwiaW5wdXRcIiAmJiB0eXBlPT09XCJoaWRkZW5cIikgPyBcImFuY2hvclwiIDogKi8gXCJleHBlY3RhdGlvblwiO1xuXG4gICAgICAgIGlmIChhdXRvZmlsbE1hbnRsZSA9PT0gXCJleHBlY3RhdGlvblwiKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBvbnxvZmYgZm9yIGV4cGVjdGF0aW9uIG1hbnRsZS5cbiAgICAgICAgICAgIGlmICh0b2tlbnMuaW5jbHVkZXMoXCJvblwiKSB8fCB0b2tlbnMuaW5jbHVkZXMoXCJvZmZcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBvbnxvZmYgc2hvdWxkIGJlIHRoZSBvbmx5IHRva2VuXG4gICAgICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbCgyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBkZXRhaWwgYXV0b2ZpbGwgdG9rZW5zXG4gICAgICAgIGxldCBjdXJySW5kZXggPSAwO1xuICAgICAgICBsZXQgY3VyclJlY29nbml6ZWRJbmRleCA9IDA7XG5cbiAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgJ3NlY3Rpb24tKicgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnNbY3VyckluZGV4XS5zdGFydHNXaXRoKGNhY2hlLnRva2VuT3B0aW9uYWxTZWN0aW9uKSAmJlxuICAgICAgICAgICAgdG9rZW5zW2N1cnJJbmRleF0ubGVuZ3RoID4gOCkge1xuICAgICAgICAgICAgY3VyckluZGV4Kys7IC8vIGNvbnN1bWUgdG9rZW5cbiAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIG9wdGlvbmFsICdzaGlwcGluZ3xiaWxsaW5nJyB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXggJiZcbiAgICAgICAgICAgIGNhY2hlLnRva2Vuc09wdGlvbmFsUHVycG9zZS5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4XSkpIHtcbiAgICAgICAgICAgIGN1cnJJbmRleCsrOyAvLyBjb25zdW1lICB0b2tlblxuICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZWl0aGVyIG1hbmRhdG9yeSBncm91cCAxIG9yIDIgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyckluZGV4KSB7XG4gICAgICAgICAgICAvLyBjaGVjayBtYW5kYXRvcnkgZ3JvdXAgMVxuICAgICAgICAgICAgaWYgKHRva2Vuc01hbmRhdG9yeUdyb3VwMS5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZE1hbmRhdG9yeVRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgdG9rZW5zIGZvciBncm91cCAyXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc09wdGlvbmFsR3JvdXAyLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zTWFuZGF0b3J5R3JvdXAyLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZE1hbmRhdG9yeVRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY3VyckluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZWl0aGVyIG1hbmRhdG9yeSBncm91cCAxIG9yIDIgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyclJlY29nbml6ZWRJbmRleCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDFcbiAgICAgICAgICAgIGlmIChjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsLmluY2x1ZGVzKHRva2Vuc1tjdXJyUmVjb2duaXplZEluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZFJlY29nbml6ZWRUb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBvcHRpb25hbCB0b2tlbnMgZm9yIGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUudG9rZW5zT3B0aW9uYWxHcm91cDIuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIG1hbmRhdG9yeSBncm91cCAyXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGwuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZFJlY29nbml6ZWRUb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IHBhc3MgaWYgd2UgaGF2ZSBzZWVuIGVpdGhlciBvZiB0aGUgbWFuZGF0b3J5IGdyb3VwcyBhbmQgYWxsIHRva2VucyBoYXZlIGJlZW4gY29uc3VtZWRcbiAgICAgICAgaWYgKGZvdW5kTWFuZGF0b3J5VG9rZW4gJiYgdG9rZW5zLmxlbmd0aCA9PT0gY3VyckluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoZm91bmRSZWNvZ25pemVkVG9rZW4gJiYgdG9rZW5zLmxlbmd0aCA9PT0gY3VyclJlY29nbml6ZWRJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9SYWRpb0Noa0luRmllbGRTZXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzX0xvbmVOb2dyb3VwXCI6IFwiUGFzc19Mb25lTm9ncm91cFwiLFxuICAgICAgICAgICAgXCJQYXNzX0dyb3VwZWRcIjogXCJQYXNzX0dyb3VwZWRcIixcbiAgICAgICAgICAgIFwiUGFzc19SYWRpb05vTmFtZVwiOiBcIlBhc3NfUmFkaW9Ob05hbWVcIixcbiAgICAgICAgICAgIFwiRmFpbF9Db250cm9sTmFtZU1pc21hdGNoXCI6IFwiRmFpbF9Db250cm9sTmFtZU1pc21hdGNoXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90R3JvdXBlZE90aGVyR3JvdXBlZFwiOiBcIkZhaWxfTm90R3JvdXBlZE90aGVyR3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdEdyb3VwZWRPdGhlck5vdEdyb3VwZWRcIjogXCJGYWlsX05vdEdyb3VwZWRPdGhlck5vdEdyb3VwZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF9Ob3RTYW1lR3JvdXBcIjogXCJGYWlsX05vdFNhbWVHcm91cFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfTG9uZUNoZWNrYm94XCI6IFwiUG90ZW50aWFsX0xvbmVDaGVja2JveFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfVW5uYW1lZENoZWNrYm94XCI6IFwiUG90ZW50aWFsX1VubmFtZWRDaGVja2JveFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc19Mb25lTm9ncm91cFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfR3JvdXBlZFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfUmFkaW9Ob05hbWVcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX0NvbnRyb2xOYW1lTWlzbWF0Y2hcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdEdyb3VwZWRPdGhlckdyb3VwZWRcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdEdyb3VwZWRPdGhlck5vdEdyb3VwZWRcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdFNhbWVHcm91cFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9Mb25lQ2hlY2tib3hcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfVW5uYW1lZENoZWNrYm94XCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJSZWxhdGVkIHNldHMgb2YgcmFkaW8gYnV0dG9ucyBvciBjaGVja2JveGVzIHNob3VsZCBiZSBwcm9ncmFtbWF0aWNhbGx5IGdyb3VwZWRcIixcbiAgICAgICAgICAgIFwiUGFzc19Mb25lTm9ncm91cFwiOiBcInswfSBncm91cGluZyBub3QgcmVxdWlyZWQgZm9yIGEgY29udHJvbCBvZiB0aGlzIHR5cGVcIixcbiAgICAgICAgICAgIFwiUGFzc19Hcm91cGVkXCI6IFwiezB9IGlucHV0IGlzIGdyb3VwZWQgd2l0aCBvdGhlciByZWxhdGVkIGNvbnRyb2xzIHdpdGggdGhlIHNhbWUgbmFtZVwiLFxuICAgICAgICAgICAgXCJQYXNzX1JhZGlvTm9OYW1lXCI6IFwiUmFkaW8gaW5wdXQgaXMgbm90IGdyb3VwZWQsIGJ1dCBwYXNzZXMgYmVjYXVzZSBpdCBoYXMgbm8gbmFtZSB0byBncm91cCB3aXRoIG90aGVyIHJhZGlvIGlucHV0c1wiLFxuICAgICAgICAgICAgXCJGYWlsX0NvbnRyb2xOYW1lTWlzbWF0Y2hcIjogXCJ7MH0gaW5wdXQgZm91bmQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSwgXFxcInsyfVxcXCIgYXMgYSB7MX0gaW5wdXRcIixcbiAgICAgICAgICAgIFwiRmFpbF9Ob3RHcm91cGVkT3RoZXJHcm91cGVkXCI6IFwiezB9IGlucHV0IGlzIG5vdCBpbiB0aGUgZ3JvdXAgd2l0aCBhbm90aGVyIHswfSB3aXRoIHRoZSBuYW1lIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90R3JvdXBlZE90aGVyTm90R3JvdXBlZFwiOiBcInswfSBpbnB1dCBhbmQgb3RoZXJzIHdpdGggdGhlIG5hbWUgXFxcInsxfVxcXCIgYXJlIG5vdCBncm91cGVkIHRvZ2V0aGVyXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90U2FtZUdyb3VwXCI6IFwiezB9IGlucHV0IGlzIGluIGEgZGlmZmVyZW50IGdyb3VwIHRoYW4gYW5vdGhlciB7MH0gd2l0aCB0aGUgbmFtZSBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfTG9uZUNoZWNrYm94XCI6IFwiVmVyaWZ5IHRoYXQgdGhpcyB1bmdyb3VwZWQgY2hlY2tib3ggaW5wdXQgaXMgbm90IHJlbGF0ZWQgdG8gb3RoZXIgY2hlY2tib3hlc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfVW5uYW1lZENoZWNrYm94XCI6IFwiVmVyaWZ5IHRoYXQgdGhpcyB1bi1uYW1lZCwgdW5ncm91cGVkIGNoZWNrYm94IGlucHV0IGlzIG5vdCByZWxhdGVkIHRvIG90aGVyIGNoZWNrYm94ZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChjb250ZXh0W1wiYXJpYVwiXS5yb2xlID09PSAnbm9uZScgfHwgY29udGV4dFtcImFyaWFcIl0ucm9sZSA9PT0gJ3ByZXNlbnRhdGlvbicpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGdldEdyb3VwID0gKGU6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBSUFRVdGlsLmdldEFuY2VzdG9yKGUsIFwiZmllbGRzZXRcIilcbiAgICAgICAgICAgICAgICB8fCBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJyYWRpb2dyb3VwXCIpXG4gICAgICAgICAgICAgICAgfHwgUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGUsIFwiZ3JvdXBcIilcbiAgICAgICAgICAgICAgICB8fCBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJncmlkXCIpXG4gICAgICAgICAgICAgICAgfHwgUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGUsIFwidGFibGVcIik7XG4gICAgICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IFJQVFV0aWwuZ2V0QW5jZXN0b3IoZSwgXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAocmV0VmFsICYmICFSUFRVdGlsLmlzRGF0YVRhYmxlKHJldFZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzIGFyZSBpbiBzY29wZVxuICAgICAgICBsZXQgY3R4VHlwZSA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCkgOiBcInRleHRcIjtcbiAgICAgICAgaWYgKGN0eFR5cGUgIT09IFwiY2hlY2tib3hcIiAmJiBjdHhUeXBlICE9PSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGZvcm0gd2UncmUgaW4gKGlmIGFueSkgdG8gZGV0ZXJtaW5lIG91ciBzY29wZVxuICAgICAgICBsZXQgY3R4Rm9ybSA9IFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJmb3JtXCIpXG4gICAgICAgICAgICB8fCBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImh0bWxcIilcbiAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgICAgIC8vIEdldCBkYXRhIGFib3V0IGFsbCBvZiB0aGUgdmlzaWJsZSBjaGVja2JveGVzIGFuZCByYWRpb3MgaW4gdGhlIHNjb3BlIG9mIHRoaXMgZm9ybVxuICAgICAgICAvLyBhbmQgY2FjaGUgaXQgZm9yIGFsbCBvZiB0aGUgb3RoZXIgaW5wdXRzIGluIHRoaXMgc2NvcGVcbiAgICAgICAgbGV0IGZvcm1DYWNoZSA9IGdldENhY2hlKGN0eEZvcm0sIFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWZvcm1DYWNoZSkge1xuICAgICAgICAgICAgZm9ybUNhY2hlID0ge1xuICAgICAgICAgICAgICAgIGNoZWNrYm94QnlOYW1lOiB7fSxcbiAgICAgICAgICAgICAgICByYWRpb3NCeU5hbWU6IHt9LFxuICAgICAgICAgICAgICAgIG5hbWVUb0dyb3VwOiB7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG51bUNoZWNrYm94ZXM6IDAsXG4gICAgICAgICAgICAgICAgbnVtUmFkaW9zOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSBjaGVja2JveGVzIGluIHRoZSBmb3JtIG9yIGJvZHkgKGJ1dCBub3QgbmVzdGVkIGluIHNvbWV0aGluZyBlbHNlIGFuZCBub3QgaGlkZGVuKVxuICAgICAgICAgICAgLy8gQW5kIGdldCBhIG1hcHBpbmcgb2YgdGhlc2UgY2hlY2tib3hlcyB0b1xuICAgICAgICAgICAgbGV0IGNXYWxrZXIgPSBuZXcgRE9NV2Fsa2VyKGN0eEZvcm0sIGZhbHNlLCBjdHhGb3JtKTtcbiAgICAgICAgICAgIGxldCBjaGVja2JveFEgPSBbXTtcbiAgICAgICAgICAgIGxldCByYWRpb3NRID0gW107XG4gICAgICAgICAgICB3aGlsZSAoY1dhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjV2Fsa2VyLmJFbmRUYWdcbiAgICAgICAgICAgICAgICAgICAgJiYgY1dhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxXG4gICAgICAgICAgICAgICAgICAgICYmIGNXYWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGNXYWxrZXIubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSAoY1dhbGtlci5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94US5wdXNoKGNXYWxrZXIubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJyYWRpb1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByYWRpb3NRLnB1c2goY1dhbGtlci5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGxldCBjaGVja2JveFEgPSBjdHhGb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFt0eXBlPWNoZWNrYm94XVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNoZWNrYm94US5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSBjaGVja2JveFFbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoKFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShjYiwgXCJmb3JtXCIpXG4gICAgICAgICAgICAgICAgICAgIHx8IFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiaHRtbFwiKVxuICAgICAgICAgICAgICAgICAgICB8fCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgPT09IGN0eEZvcm1cbiAgICAgICAgICAgICAgICAgICAgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihjYikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGNiLmdldEF0dHJpYnV0ZShcIm5hbWVcIikgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgKGZvcm1DYWNoZS5jaGVja2JveEJ5TmFtZVtuYW1lXSA9IGZvcm1DYWNoZS5jaGVja2JveEJ5TmFtZVtuYW1lXSB8fCBbXSkucHVzaChjYik7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSA9IGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSB8fCBnZXRHcm91cChjYik7XG4gICAgICAgICAgICAgICAgICAgICsrZm9ybUNhY2hlLm51bUNoZWNrYm94ZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IGFsbCBvZiB0aGUgcmFkaW9zIGluIHRoZSBmb3JtIG9yIGJvZHkgKGJ1dCBub3QgbmVzdGVkIGluIHNvbWV0aGluZyBlbHNlIGFuZCBub3QgaGlkZGVuKVxuICAgICAgICAgICAgLy8gbGV0IHJhZGlvc1EgPSBjdHhGb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFt0eXBlPXJhZGlvXVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHJhZGlvc1EubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSByYWRpb3NRW2lkeF07XG4gICAgICAgICAgICAgICAgY29uc3QgcmFkQ3R4ID0gKFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShyLCBcImZvcm1cIilcbiAgICAgICAgICAgICAgICAgICAgfHwgUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJodG1sXCIpXG4gICAgICAgICAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAocmFkQ3R4ID09PSBjdHhGb3JtXG4gICAgICAgICAgICAgICAgICAgICYmICFSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHIuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAoZm9ybUNhY2hlLnJhZGlvc0J5TmFtZVtuYW1lXSA9IGZvcm1DYWNoZS5yYWRpb3NCeU5hbWVbbmFtZV0gfHwgW10pLnB1c2gocik7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSA9IGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSB8fCBnZXRHcm91cChyKTtcbiAgICAgICAgICAgICAgICAgICAgKytmb3JtQ2FjaGUubnVtUmFkaW9zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldENhY2hlKGN0eEZvcm0sIFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsIGZvcm1DYWNoZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLy8vLy8vLy8vLy8vIENhbGN1bGF0ZWQgZXZlcnl0aGluZywgbm93IGNoZWNrIHRoZSB2YXJpb3VzIGNhc2VzXG5cbiAgICAgICAgY29uc3QgY3R4TmFtZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgIGNvbnN0IGN0eEdyb3VwID0gZ2V0R3JvdXAocnVsZUNvbnRleHQpO1xuICAgICAgICBjdHhUeXBlID0gY3R4VHlwZSA9PT0gXCJyYWRpb1wiID8gXCJSYWRpb1wiIDogXCJDaGVja2JveFwiO1xuXG4gICAgICAgIGlmICghY3R4TmFtZSB8fCBjdHhOYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvLyBGaXJzdCBwcm9jZXNzIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIGlzIG5vdCBuYW1lZFxuICAgICAgICAgICAgaWYgKGN0eFR5cGUgPT09IFwiUmFkaW9cIikge1xuICAgICAgICAgICAgICAgIC8vIFJhZGlvcyB3aXRob3V0IG5hbWVzIGRvbid0IGFjdCBsaWtlIGdyb3Vwcywgc28gZG9uJ3QgZW5mb3JjZSBncm91cGluZ1xuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX1JhZGlvTm9OYW1lXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19Hcm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIGFuIHVubmFtZWQgY2hlY2tib3hcbiAgICAgICAgICAgICAgICBpZiAoY3R4R3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChmb3JtQ2FjaGUuY2hlY2tib3hCeU5hbWVbXCJcIl0gfHwgW10pLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsX1VubmFtZWRDaGVja2JveFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19Mb25lTm9ncm91cFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19Hcm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ29uc2lkZXJpbmcgYSBuYW1lZCBjaGVja2JveFxuICAgICAgICAgICAgY29uc3QgbnVtUmFkaW9zV2l0aE5hbWUgPSAoZm9ybUNhY2hlLnJhZGlvc0J5TmFtZVtjdHhOYW1lXSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbnVtQ2hlY2tib3hlc1dpdGhOYW1lID0gKGZvcm1DYWNoZS5jaGVja2JveEJ5TmFtZVtjdHhOYW1lXSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgLy8gQ2FwaXRhbGl6ZSB0aGUgaW5wdXQgdHlwZSBmb3IgbWVzc2FnZXNcbiAgICAgICAgICAgIGlmIChudW1SYWRpb3NXaXRoTmFtZSA+IDAgJiYgbnVtQ2hlY2tib3hlc1dpdGhOYW1lID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBuYW1pbmcgbWlzbWF0Y2ggYmV0d2VlbiBkaWZmZXJlbnQgY29udHJvbHNcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX0NvbnRyb2xOYW1lTWlzbWF0Y2hcIiwgW2N0eFR5cGUsIGN0eFR5cGUgPT09IFwiY2hlY2tib3hcIiA/IFwicmFkaW9cIiA6IFwiY2hlY2tib3hcIiwgY3R4TmFtZV0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdHhUeXBlID09PSBcIlJhZGlvXCIgJiYgKGZvcm1DYWNoZS5udW1SYWRpb3MgPT09IDEgfHwgbnVtUmFkaW9zV2l0aE5hbWUgPT09IDEpXG4gICAgICAgICAgICAgICAgfHwgY3R4VHlwZSA9PT0gXCJDaGVja2JveFwiICYmIGZvcm1DYWNoZS5udW1DaGVja2JveGVzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGxvbmUgY29udHJvbCAoZWl0aGVyIG9ubHkgY29udHJvbCBvZiB0aGlzIHR5cGUgb24gdGhlIHBhZ2UsIG9yIGEgcmFkaW8gYnV0dG9uIHdpdGhvdXQgYW55IG90aGVycyBieSB0aGF0IG5hbWUpXG4gICAgICAgICAgICAgICAgLy8gV2UgcGFzcyB0aGlzIGNvbnRyb2wgaW4gYWxsIGNhc2VzXG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfTG9uZU5vZ3JvdXBcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX0dyb3VwZWRcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0eFR5cGUgPT09IFwiQ2hlY2tib3hcIiAmJiBmb3JtQ2FjaGUubnVtQ2hlY2tib3hlcyA+IDEgJiYgbnVtQ2hlY2tib3hlc1dpdGhOYW1lID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBvbmx5IG9uZSBjaGVja2JveCB3aXRoIHRoaXMgbmFtZSwgYnV0IHRoZXJlIGFyZSBvdGhlciBjaGVja2JveGVzIGluIHRoZSBmb3JtLlxuICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBncm91cGVkLCBhc2sgdGhlbSB0byBleGFtaW5lIGl0XG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsX0xvbmVDaGVja2JveFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfR3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2Ugc2hhcmUgYSBuYW1lIHdpdGggYW5vdGhlciBzaW1pbGFyIGNvbnRyb2wuIEFyZSB3ZSBncm91cGVkIHRvZ2V0aGVyP1xuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybUNhY2hlLm5hbWVUb0dyb3VwW2N0eE5hbWVdICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgZ3JvdXBlZCwgYnV0IHNvbWUgY29udHJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgaW4gYSBncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9Ob3RHcm91cGVkT3RoZXJHcm91cGVkXCIsIFtjdHhUeXBlLCBjdHhOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb25lIG9mIHVzIGFyZSBncm91cGVkXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX05vdEdyb3VwZWRPdGhlck5vdEdyb3VwZWRcIiwgW2N0eFR5cGUsIGN0eE5hbWVdKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtQ2FjaGUubmFtZVRvR3JvdXBbY3R4TmFtZV0gIT09IGN0eEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBpbiB0aGUgbWFpbiBncm91cCB3aXRoIHRoZSBvdGhlcnNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9Ob3RTYW1lR3JvdXBcIiwgW2N0eFR5cGUsIGN0eE5hbWVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBhbGwgZ3JvdXBlZCB1cCFcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19Hcm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9maWVsZHNfZ3JvdXBlZDogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9maWVsZHNfZ3JvdXBlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0LCBkb206dGV4dGFyZWEsIGRvbTpzZWxlY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9JbkZpZWxkU2V0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X2ZpZWxkc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbnB1dF9maWVsZHNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfZmllbGRzX2dyb3VwZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlVzZSB0aGUgPGZpZWxkc2V0PiBlbGVtZW50IHRvIGdyb3VwIGxvZ2ljYWxseSByZWxhdGVkIGlucHV0IGVsZW1lbnRzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiR3JvdXBzIG9mIGxvZ2ljYWxseSByZWxhdGVkIGlucHV0IGVsZW1lbnRzIHNob3VsZCBiZSBjb250YWluZWQgd2l0aGluIGEgPGZpZWxkc2V0PiBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgZm9yIG90aGVyIGlucHV0IHR5cGVzIG9yIGlmIHdlJ3JlIGluIGEgZmllbGRzZXRcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJpbnB1dFwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHR5cGUgIT0gXCJ0ZXh0XCIgJiYgdHlwZSAhPSBcImZpbGVcIiAmJiB0eXBlICE9IFwicGFzc3dvcmRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiZmllbGRzZXRcIikgIT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcblxuICAgICAgICAvLyBObyBmaWVsZHNldCAtIHNlZSBpZiB0aGlzIGlucHV0IGlzIGFsbCBieSBpdHNlbGYgLSBubyBuZWVkIHRvIGdyb3VwIHNpbmdsZSBpbnB1dHNcbiAgICAgICAgbGV0IHBhcmVudCA9IFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImZvcm1cIiwgXCJib2R5XCJdKTtcbiAgICAgICAgbGV0IGNoZWNrVHlwZXMgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCJdO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjaGVja1R5cGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgY29udHJvbHMgPSBwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoY2hlY2tUeXBlc1tpXSk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgcGFzc2VkICYmIGogPCBjb250cm9scy5sZW5ndGg7ICsraikge1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQgb3Igbm90IGJhc2VkIG9uIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIGFuZCBpZiB0aGUgbm9kZSBpc1Zpc2libGUgb3JcbiAgICAgICAgICAgICAgICAvLyBub3QuXG4gICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihjb250cm9sc1tqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRleHRhcmVhcyBhbmQgc2VsZWN0cyB3aWxsIGJlIGNhbGxlZCB0eXBlPSd0ZXh0J1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gY29udHJvbHNbal0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSA/IGNvbnRyb2xzW2pdLmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSA6IFwidGV4dFwiO1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgZmFpbCBpZiB0aGlzIGlzIGFub3RoZXIgY29udHJvbCBpbiB0aGUgZm9ybSBhbmQgaXRzIHR5cGUgaXMgYW5vdGhlciB0ZXh0LWxpa2UgaW5wdXRcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBjb250cm9sc1tqXSA9PSBydWxlQ29udGV4dCB8fCAodHlwZSAhPSBcInRleHRcIiAmJiB0eXBlICE9IFwicGFzc3dvcmRcIiAmJiB0eXBlICE9IFwiZmlsZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGlucHV0X2hhc3BvcHVwX2NvbmZsaWN0OiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0XCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRbbGlzdF1bYXJpYS1oYXNwb3B1cF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImlucHV0X2hhc3BvcHVwX2ludmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiUG90ZW50aWFsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiaW5wdXRfaGFzcG9wdXBfY29uZmxpY3QuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIjxpbnB1dD4gZWxlbWVudCB3aXRoICdsaXN0JyBhdHRyaWJ1dGUgZG9lcyBub3QgdXNlICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCI8aW5wdXQ+IGVsZW1lbnQgd2l0aCAnbGlzdCcgYXR0cmlidXRlIGFsc28gdXNlcyAnYXJpYS1oYXNwb3B1cCcgYXR0cmlidXRlIHdpdGggdHlwZT1cXFwiezB9XFxcIlwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIjxpbnB1dD4gZWxlbWVudCB3aXRoICdsaXN0JyBhdHRyaWJ1dGUgYWxzbyB1c2VzICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGUgd2l0aCBtaXNzaW5nIG9yIGludmFsaWQgaW5wdXQgdHlwZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxpbnB1dD4gZWxlbWVudCB3aXRoICdsaXN0JyBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBhbHNvIHVzZSAnYXJpYS1oYXNwb3B1cCcgYXR0cmlidXRlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vdHJpZ2dlcmluZyBpbnB1dCB0eXBlczogdGV4dCwgc2VhcmNoLCB0ZWwsIHVybCwgZW1haWwsIG9yIG1pc3Npbmcgb3IgaW52YWxpZCBcbiAgICAgICAgbGV0IHllc1R5cGVzID0gW1widGV4dFwiLCBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCJdO1xuICAgICAgICBsZXQgbm9UeXBlcyA9IFtcImZpbGVcIiwgXCJwYXNzd29yZFwiLCBcImNoZWNrYm94XCIsIFwicmFkaW9cIiwgXCJzdWJtaXRcIiwgXCJyZXNldFwiLFxuICAgICAgICAgICAgXCJkYXRlXCIsIFwibnVtYmVyXCIsIFwicmFuZ2VcIiwgXCJ0aW1lXCIsIFwiY29sb3JcIiwgXCJpbWFnZVwiLFxuICAgICAgICAgICAgXCJtb250aFwiLCBcIndlZWtcIiwgXCJkYXRldGltZS1sb2NhbFwiLCBcImhpZGRlblwiLCBcImJ1dHRvblwiXG4gICAgICAgIF07XG5cbiAgICAgICAgbGV0IGF0dHJWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgIC8vbWlzc2luZyBpbnB1dCB0eXBlXG4gICAgICAgIGlmICghYXR0clZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcblxuICAgICAgICBhdHRyVmFsdWUgPSBhdHRyVmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gaWdub3JlIGZvciBubyB0cmlnZ2VyaW5nIGlucHV0IHR5cGVzIFxuICAgICAgICBpZiAobm9UeXBlcy5pbmNsdWRlcyhhdHRyVmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIGZhaWx1cmVfMSBpZiBhbnkgdHJpZ2dlcmluZyBpbnB1dCB0eXBlcyAgICBcbiAgICAgICAgaWYgKHllc1R5cGVzLmluY2x1ZGVzKGF0dHJWYWx1ZSkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFthdHRyVmFsdWVdKTtcblxuICAgICAgICAvL2ludmFsaWQgaW5wdXQgdHlwZVxuICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgTm9kZVdhbGtlciwgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9sYWJlbF9hZnRlcjogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9sYWJlbF9hZnRlclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfTGFiZWxBZnRlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9sYWJlbF9hZnRlci5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImlucHV0X2xhYmVsX2FmdGVyLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5wdXRfbGFiZWxfYWZ0ZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX2FmdGVyLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uIGlzIG5lc3RlZCBpbiBsYWJlbCwgc28gbGFiZWwgaXMgbm90IGFmdGVyIHRoZSBpbnB1dCBjb250cm9sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkxhYmVsIHRleHQgaXMgbG9jYXRlZCBiZWZvcmUgaXRzIGFzc29jaWF0ZWQgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJDaGVja2JveGVzIGFuZCByYWRpbyBidXR0b25zIG11c3QgaGF2ZSBhIGxhYmVsIGFmdGVyIHRoZSBpbnB1dCBjb250cm9sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjMuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdHlwZSA9IFwiXCI7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKVxuICAgICAgICAgICAgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHR5cGUgIT0gXCJjaGVja2JveFwiICYmIHR5cGUgIT0gXCJyYWRpb1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICBsZXQgbGFiZWxFbGVtID0gUlBUVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICBpZiAobGFiZWxFbGVtID09PSBudWxsIHx8ICFSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbEVsZW0pKSB7XG4gICAgICAgICAgICAvLyBEdWUgdG8gZGVwZW5kZW5jeSwgbGFiZWwgbXVzdCBiZSBkb25lIHZpYSB0aXRsZSAtIHRoaXMgcnVsZSBkb2Vzbid0IGFwcGx5XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmFsdWUgPSBSUFRVdGlsLmNvbXBhcmVOb2RlT3JkZXIobGFiZWxFbGVtLCBydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQ7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gLTIpIHtcbiAgICAgICAgICAgIC8vIGlucHV0IG5lc3RlZCBpbiBsYWJlbFxuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgd2Fsa05vZGUgPSBuZXcgTm9kZVdhbGtlcihsYWJlbEVsZW0pO1xuICAgICAgICAgICAgd2Fsa05vZGUubm9kZSA9IHJ1bGVDb250ZXh0O1xuICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgd2Fsa05vZGUubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICgod2Fsa05vZGUubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcIiN0ZXh0XCIgJiYgd2Fsa05vZGUubm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHx8ICh3YWxrTm9kZS5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3BhblwiICYmIHdhbGtOb2RlLm5vZGUudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gSW5wdXQgbmVzdGVkIGluIGxhYmVsIGFuZCB0ZXh0IGJlZm9yZSBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gbGFiZWwgaXMgYmVmb3JlIGlucHV0XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGlucHV0X2xhYmVsX2JlZm9yZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9sYWJlbF9iZWZvcmVcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dCwgZG9tOnRleHRhcmVhLCBkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfTGFiZWxCZWZvcmVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUZXh0IGlucHV0IGlzIG5lc3RlZCBpbiBsYWJlbCBzdWNoIHRoYXQgaW5wdXQgcHJlY2VkZXMgdGhlIGxhYmVsIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiTGFiZWwgdGV4dCBpcyBsb2NhdGVkIGFmdGVyIGl0cyBhc3NvY2lhdGVkIHRleHQgaW5wdXQgb3IgPHNlbGVjdD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRleHQgaW5wdXRzIGFuZCA8c2VsZWN0PiBlbGVtZW50cyBtdXN0IGhhdmUgYSBsYWJlbCBiZWZvcmUgdGhlIGlucHV0IGNvbnRyb2xcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJmaWxlXCIgJiYgdHlwZSAhPSBcInBhc3N3b3JkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICBsZXQgbGFiZWxFbGVtID0gUlBUVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuXG4gICAgICAgIGlmIChsYWJlbEVsZW0gPT0gbnVsbCB8fCAhUlBUVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWxFbGVtKSkge1xuICAgICAgICAgICAgLy8gRHVlIHRvIGRlcGVuZGVuY3ksIGxhYmVsIG11c3QgYmUgZG9uZSB2aWEgdGl0bGUgLSB0aGlzIHJ1bGUgZG9lc24ndCBhcHBseVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsdWUgPSBSUFRVdGlsLmNvbXBhcmVOb2RlT3JkZXIobGFiZWxFbGVtLCBydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICh2YWx1ZSA9PSAtMikge1xuICAgICAgICAgICAgLy8gaW5wdXQgbmVzdGVkIGluIGxhYmVsXG4gICAgICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICgod2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcIiN0ZXh0XCIgJiYgd2Fsa05vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB8fCAod2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInNwYW5cIiAmJiB3YWxrTm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkpO1xuICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBJbnB1dCBuZXN0ZWQgaW4gbGFiZWwgYW5kIHRleHQgYWZ0ZXIgaW5wdXRcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBsYWJlbCBpcyBhZnRlciBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBIYXZlbid0IHJldHVybmVkIHlldCwgdGhlbiBJIHBhc3NcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9sYWJlbF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfbGFiZWxfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmNoZWNrYm94LGFyaWE6Y29tYm9ib3gsYXJpYTpsaXN0Ym94LGFyaWE6bWVudWl0ZW1jaGVja2JveCxhcmlhOm1lbnVpdGVtcmFkaW8sYXJpYTpyYWRpbyxhcmlhOnNlYXJjaGJveCxhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b24sYXJpYTpzd2l0Y2gsYXJpYTp0ZXh0Ym94LGFyaWE6cHJvZ3Jlc3NiYXIsZG9tOmlucHV0W3R5cGU9ZmlsZV0sZG9tOm91dHB1dCxkb206bWV0ZXIsZG9tOmlucHV0W3R5cGU9cGFzc3dvcmRdXCIsXG4gICAgLy9kZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9yZWR1bmRhbnRcIiwgXCJhcmlhX3JvbGVfdmFsaWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfRXhwbGljaXRMYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZvcm0gY29udHJvbCBlbGVtZW50IDx7MH0+IGhhcyBubyBhc3NvY2lhdGVkIGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZvcm0gY29udHJvbCB3aXRoIFxcXCJ7MH1cXFwiIHJvbGUgaGFzIG5vIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGZvcm0gY29udHJvbCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIC8qIHJlbW92ZSAxLjEuMSBtYXBwaW5nLCBrZWVwIDQuMS4yICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogaHR0cHM6Ly9naXRodWIuY29tL0lCTWEvZXF1YWwtYWNjZXNzL2lzc3Vlcy83NTZcbiAgICBhY3Q6IFtcIjk3YTRlMVwiLCBcImUwODZlNVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YWxpc3QnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGlucHV0IHR5cGVcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJidXR0b25cIiB8fCBSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJidXR0b25cIikpIHtcbiAgICAgICAgICAgIHR5cGUgPSBcImJ1dHRvbmVsZW1cIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJpbnB1dFwiICYmIHR5cGUgPT0gXCJcIikge1xuICAgICAgICAgICAgdHlwZSA9IFwidGV4dFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZWQgYnkgaW5wdXRfbGFiZWxfZXhpc3RzSW1hZ2VcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IFBPRiA9IC0xO1xuICAgICAgICBsZXQgdGV4dFR5cGVzID0gW1xuICAgICAgICAgICAgXCJ0ZXh0XCIsIFwiZmlsZVwiLCBcInBhc3N3b3JkXCIsXG4gICAgICAgICAgICBcImNoZWNrYm94XCIsIFwicmFkaW9cIixcbiAgICAgICAgICAgIFwic2VhcmNoXCIsIFwidGVsXCIsIFwidXJsXCIsIFwiZW1haWxcIiwgIC8vSFRNTCA1LiBOb3RlOiB0eXBlID0gXCJoaWRkZW5cIiBkb2Vzbid0IHJlcXVpcmUgdGV4dFxuICAgICAgICAgICAgXCJkYXRlXCIsIFwibnVtYmVyXCIsIFwicmFuZ2VcIiwgLy9IVE1MIDUuIHR5cGUgPSBcImltYWdlXCIgaXMgY2hlY2tlZCBpbiBnMTAuXG4gICAgICAgICAgICBcInRpbWVcIiwgXCJjb2xvclwiXG4gICAgICAgIF1cbiAgICAgICAgbGV0IGJ1dHRvblR5cGVzID0gW1xuICAgICAgICAgICAgXCJidXR0b25cIiwgXCJyZXNldFwiLCBcInN1Ym1pdFwiXG4gICAgICAgIF1cbiAgICAgICAgbGV0IGJ1dHRvblR5cGVzV2l0aERlZmF1bHRzID0gW1wicmVzZXRcIiwgXCJzdWJtaXRcIl07IC8vICdzdWJtaXQnIGFuZCAncmVzZXQnIGhhdmUgdmlzaWJsZSBkZWZhdWx0cy5cbiAgICAgICAgaWYgKHRleHRUeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSkgeyAvLyBJZiB0eXBlIGlzIGluIHRoZSBsaXN0XG4gICAgICAgICAgICAvLyBHZXQgb25seSB0aGUgbm9uLWhpZGRlbiBsYWJlbHMgZm9yIGVsZW1lbnQsIGluIHRoZSBjYXNlIHRoYXQgYW4gbGFiZWwgaXMgaGlkZGVuIHRoZW4gaXQgaXMgYSB2aW9sYXRpb25cbiAgICAgICAgICAgIC8vIE5vdGU6IGxhYmVsW2Zvcl0gZG9lcyBub3Qgd29yayBmb3IgQVJJQS1kZWZpbmVkIGlucHV0c1xuICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikgPyBudWxsIDogUlBUVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgbGV0IGhhc0xhYmVsRWxlbUNvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWxFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNMYWJlbEVsZW1Db250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChsYWJlbEVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fCBcIlwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBoYXNMYWJlbEVsZW1Db250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhYmVsRWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsbGVkQnlFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQobGFiZWxFbGVtLCBsYWJlbEVsZW0uZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbGxlZEJ5RWxlbSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbGxlZEJ5RWxlbSwgbGFiZWxFbGVtKSAmJiBSUFRVdGlsLmhhc0lubmVyQ29udGVudChsYWJlbGxlZEJ5RWxlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0xhYmVsRWxlbUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFzc2VkID0gKCEhbGFiZWxFbGVtICYmIGhhc0xhYmVsRWxlbUNvbnRlbnQpIHx8XG4gICAgICAgICAgICAgICAgKCFsYWJlbEVsZW0gJiYgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSB8fCBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInBsYWNlaG9sZGVyXCIpKSB8fFxuICAgICAgICAgICAgICAgIFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMCB8fCBSUFRVdGlsLmhhc0ltcGxpY2l0TGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMuaW5kZXhPZih0eXBlKTtcbiAgICAgICAgICAgIFxuICAgICAgICB9IGVsc2UgaWYgKGJ1dHRvblR5cGVzLmluZGV4T2YodHlwZSkgIT09IC0xKSB7IC8vIElmIHR5cGUgaXMgYSBidXR0b25cbiAgICAgICAgICAgIGlmIChidXR0b25UeXBlc1dpdGhEZWZhdWx0cy5pbmRleE9mKHR5cGUpICE9PSAtMSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidmFsdWVcIikpIHtcbiAgICAgICAgICAgICAgICAvLyAnc3VibWl0JyBhbmQgJ3Jlc2V0JyBoYXZlIHZpc2libGUgZGVmYXVsdHMgc28gcGFzcyBpZiB0aGVyZSBpcyBubyAndmFsdWUnIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidmFsdWVcIikgfHwgUlBUVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMuaW5kZXhPZih0eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFwiYnV0dG9uZWxlbVwiKSB7XG4gICAgICAgICAgICAvLyBJZiBJIGFtIGFuIGltYWdlIGFuZCBJIGhhdmUgYWx0IHRleHQgLSBhY2Nlc3NpYmlsaXR5LXdlYi1lbmdpbmUjMjY5XG4gICAgICAgICAgICBsZXQgYkFsdCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW1nXCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFsdCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoYWx0LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYkFsdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJBbHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpIHx8IGJBbHQgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcblxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJwdF9BcmlhX1ZhbGlkSWRSZWYgZGV0ZXJtaW5lcyBpZiB0aGUgYXJpYS1sYWJlbGxlZGJ5IGlkIHBvaW50cyB0byBhIHZhbGlkIGVsZW1lbnRcbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgKGJ1dHRvblR5cGVzLmluZGV4T2YodHlwZSkgIT09IC0xKSkge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNsYXNzXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNsYXNzXCIpID09IFwiZGlqaXRPZmZTY3JlZW5cIiAmJiBET01XYWxrZXIucGFyZW50RWxlbWVudChydWxlQ29udGV4dCkuaGFzQXR0cmlidXRlKFwid2lkZ2V0aWRcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBkaWppdCBidXR0b25zXG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsSWQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChydWxlQ29udGV4dCkuZ2V0QXR0cmlidXRlKFwid2lkZ2V0aWRcIikgKyBcIl9sYWJlbFwiO1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBsYWJlbElkKTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgSSBmYWlsZWQgYWJvdmUgYWxzb1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5sZW5ndGggKyA0ICsgYnV0dG9uVHlwZXMuaW5kZXhPZih0eXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBub2RlTmFtZSA9PSBcIm9wdGdyb3VwXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGFiZWxcIik7XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5sZW5ndGggKyAyO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkICYmIG5vZGVOYW1lID09IFwib3B0aW9uXCIpIHtcbiAgICAgICAgICAgIC8vIElzIGEgbm9uLWVtcHR5IHZhbHVlIGF0dHJpYnV0ZSBhbHNvIGVub3VnaCBmb3IgYW4gb3B0aW9uIGVsZW1lbnQ/XG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxhYmVsXCIpIHx8IHJ1bGVDb250ZXh0LmlubmVySFRNTC50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmxlbmd0aCArIGJ1dHRvblR5cGVzLmxlbmd0aCArIDM7XG4gICAgICAgIH0gXG4gICAgICAgIC8qKmlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBhcmlhIHJvbGVcbiAgICAgICAgICAgIC8vYW55IG1vcmUgcm9sZXMgZm9yIGlucHV0PyBcbiAgICAgICAgICAgIGNvbnN0IG5hbWVGcm9tQm90aCA9IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcIm1lbnVpdGVtY2hlY2tib3hcIikgfHwgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwibWVudWl0ZW1yYWRpb1wiKVxuICAgICAgICAgICAgICAgIHx8IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInJhZGlvXCIpIHx8IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNoZWNrYm94XCIpO1xuICAgICAgICAgICAgY29uc3QgbmFtZUZyb21BdXRob3JPbmx5ID0gUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwibGlzdGJveFwiKSB8fCBSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJzZWFyY2hib3hcIikgXG4gICAgICAgICAgICAgICAgfHwgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSB8fCBSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKVxuICAgICAgICAgICAgICAgIHx8ICFSUFRVdGlsLmhhc0FueVJvbGUocnVsZUNvbnRleHQsIHRydWUpOyAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAobmFtZUZyb21Cb3RoKVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KSAmJiBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWVGcm9tQm90aCB8fCBuYW1lRnJvbUF1dGhvck9ubHkpXG4gICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPiAwIHx8IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgICAgICB9IFxuICAgICAgICB9Ki9cbiAgICAgICAgaWYgKCFwYXNzZWQpXG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDAgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGFyaWEgcm9sZSB0byBmaWd1cmUgb3V0IGlmIHRoZSBhY2Nlc3NpYmxlIG5hbWUgY2FuIGJlIGZyb20gY29udGVudCBcbiAgICAgICAgICAgIGNvbnN0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAvL3doZW4gbXVsdGlwbGUgcm9sZXMgc3BlY2lmaWVkLCBvbmx5IHRoZSBmaXJzdCB2YWxpZCByb2xlIChndWFyYW50ZWVkIGJ5IGRlcGVuZGVuY2llcykgaXMgYXBwbGllZCwgYW5kIHRoZSBvdGhlcnMganVzdCBhcyBmYWxsYmFja3NcbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbMF1dICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV0ubmFtZUZyb20gJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzWzBdXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6Y2hlY2tib3gsYXJpYTpjb21ib2JveCxhcmlhOmxpc3Rib3gsYXJpYTptZW51aXRlbWNoZWNrYm94LGFyaWE6bWVudWl0ZW1yYWRpbyxhcmlhOnJhZGlvLGFyaWE6c2VhcmNoYm94LGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnN3aXRjaCxhcmlhOnRleHRib3gsYXJpYTpwcm9ncmVzc2Jhcixkb206aW5wdXRbdHlwZT1maWxlXSxkb206b3V0cHV0XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJpbnB1dF9sYWJlbF9leGlzdHNcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfVmlzaWJsZUxhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlRoZSBpbnB1dCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gaW5wdXQgZWxlbWVudCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCB2aXNpYmxlIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjMuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgIFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gaW4gYSBjb21ib2JveCwgb25seSBsb29rIGF0IHRoZSBpbnB1dCB0ZXh0Ym94LlxuICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpICYmXG4gICAgICAgICAgICAhKFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInRleHRib3hcIikgfHwgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwic2VhcmNoYm94XCIpIHx8XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCAobm9kZU5hbWUgPT09IFwic2VsZWN0XCIgJiYgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiY29tYm9ib3hcIikpKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXZvaWQgZGlhZ25vc2luZyB0aGUgcG9wdXAgbGlzdCBvZiBhIGNvbWJvYm94LlxuICAgICAgICBsZXQgcm9sZXNUb0NoZWNrID0gW1wibGlzdGJveFwiLCBcInRyZWVcIiwgXCJncmlkXCIsIFwiZGlhbG9nXCJdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvbGVzVG9DaGVjay5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCByb2xlc1RvQ2hlY2tbal0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ZXMgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21ib2JveGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21ib2JveCA9IGNvbWJvYm94ZXNba107XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhX293bnMgPSBSUFRVdGlsLmdldEVsZW1lbnRBdHRyaWJ1dGUoY29tYm9ib3gsIFwiYXJpYS1vd25zXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJpYV9vd25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3ducyA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhhcmlhX293bnMudHJpbSgpKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgb3duc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGlucHV0IHR5cGVcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgbGV0IHR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImJ1dHRvblwiIHx8IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImJ1dHRvblwiKSkge1xuICAgICAgICAgICAgdHlwZSA9IFwiYnV0dG9uZWxlbVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImlucHV0XCIgJiYgdHlwZSA9PSBcIlwiKSB7XG4gICAgICAgICAgICB0eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGV4dFR5cGVzID0gW1widGV4dFwiLCBcImZpbGVcIiwgXCJwYXNzd29yZFwiLFxuICAgICAgICAgICAgXCJjaGVja2JveFwiLCBcInJhZGlvXCIsXG4gICAgICAgICAgICBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCIsXG4gICAgICAgICAgICBcImRhdGVcIiwgXCJudW1iZXJcIiwgXCJyYW5nZVwiLFxuICAgICAgICAgICAgXCJ0aW1lXCIsIFwiY29sb3JcIixcbiAgICAgICAgICAgIFwibW9udGhcIiwgXCJ3ZWVrXCIsIFwiZGF0ZXRpbWUtbG9jYWxcIl07XG4gICAgICAgIGxldCBidXR0b25UeXBlcyA9IFtcImJ1dHRvblwiLCBcInJlc2V0XCIsIFwic3VibWl0XCJdO1xuICAgICAgICBsZXQgYnV0dG9uVHlwZXNXaXRoRGVmYXVsdHMgPSBbXCJyZXNldFwiLCBcInN1Ym1pdFwiXTsgLy8gJ3N1Ym1pdCcgYW5kICdyZXNldCcgaGF2ZSB2aXNpYmxlIGRlZmF1bHRzLlxuICAgICAgICBpZiAodGV4dFR5cGVzLmluZGV4T2YodHlwZSkgIT09IC0xKSB7IC8vIElmIHR5cGUgaXMgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudCwgaW4gdGhlIGNhc2UgdGhhdCBhbiBsYWJlbCBpcyBoaWRkZW4gdGhlbiBpdCBpcyBhIHZpb2xhdGlvblxuICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IFJQVFV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IChsYWJlbEVsZW0gIT0gbnVsbCAmJiBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbEVsZW0pKSB8fFxuICAgICAgICAgICAgICAgIFJQVFV0aWwuaGFzSW1wbGljaXRMYWJlbChydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgICAgICB0eXBlID09PSBcImZpbGVcIjsgLy8gaW5wdXQgdHlwZT1maWxlIGhhcyBhIHZpc2libGUgZGVmYXVsdC5cbiAgICAgICAgfSBlbHNlIGlmIChidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSB8fCB0eXBlID09IFwiYnV0dG9uZWxlbVwiKSB7XG4gICAgICAgICAgICAvLyBCdXR0b25zIGFyZSBub3QgaW4gc2NvcGUgZm9yIHRoaXMgc3VjY2VzcyBjcml0ZXJpYSAoSUJNYS9lcXVhbC1hY2Nlc3MjMjA0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHZpc2libGUgbGFiZWwgcG9pbnRlZCB0byBieSB0aGUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZS5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgIGxldCB0aGVMYWJlbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgIGxldCBsYWJlbFZhbHVlcyA9IHRoZUxhYmVsLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxhYmVsVmFsdWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRCeUlkID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGxhYmVsVmFsdWVzW2pdKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEJ5SWQgJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbWVudEJ5SWQsIHJ1bGVDb250ZXh0KSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudEJ5SWQpICYmIFJQVFV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGVsZW1lbnRCeUlkKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBub2RlTmFtZSA9PSBcIm9wdGdyb3VwXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGFiZWxcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgbm9kZU5hbWUgPT0gXCJvcHRpb25cIikge1xuICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsYWJlbFwiKSB8fCBydWxlQ29udGV4dC5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmUgbGFzdCBjaGVjayBmb3Igcm9sZXMgdGhhdCBzdXBwb3J0IG5hbWUgZnJvbSBjb250ZW50XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBsaXN0IGZyb20gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMS8jbmFtZWZyb21jb250ZW50XG4gICAgICAgICAgICBsZXQgcm9sZXNXaXRoTmFtZUZyb21Db250ZW50ID0gW1wiYnV0dG9uXCIsIFwiY2VsbFwiLCBcImNoZWNrYm94XCIsIFwiY29sdW1uaGVhZGVyXCIsIFwiZ3JpZGNlbGxcIiwgXCJoZWFkaW5nXCIsIFwibGlua1wiLFxuICAgICAgICAgICAgICAgIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwicm93XCIsXG4gICAgICAgICAgICAgICAgXCJyb3dncm91cFwiLCBcInJvd2hlYWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRvb2x0aXBcIiwvKlwidHJlZVwiLCovXCJ0cmVlaXRlbVwiXTtcbiAgICAgICAgICAgIC8vZ2V0IGF0dHJpYnV0ZSByb2xlcyBhcyB3ZWxsIGFzIGltcGxpY2l0IHJvbGVzLlxuICAgICAgICAgICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzV2l0aE5hbWVGcm9tQ29udGVudC5pbmRleE9mKHJvbGVzW2ldKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhpcyBpcyByZWZlcmVuY2VkIGJ5IGEgY29tYm9ib3guIElmIHNvLCB0aGUgbGFiZWwgYmVsb25ncyB0byB0aGUgY29tYm9ib3hcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgIGlmIChpZCAmJiBpZC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihgKlthcmlhLWNvbnRyb2xzPScke2lkfSddW3JvbGU9J2NvbWJvYm94J11gKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgaW5wdXRfb25jaGFuZ2VfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X29uY2hhbmdlX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0LCBkb206dGV4dGFyZWEsIGRvbTpzZWxlY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9IYXNPbmNoYW5nZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9vbmNoYW5nZV9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImlucHV0X29uY2hhbmdlX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfb25jaGFuZ2VfcmV2aWV3Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBhbnkgY2hhbmdlcyBvZiBjb250ZXh0IGFyZSBleHBsYWluZWQgaW4gYWR2YW5jZSB0byB0aGUgdXNlclwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlZlcmlmeSB0aGF0IGFueSBjaGFuZ2VzIG9mIGNvbnRleHQgYXJlIGV4cGxhaW5lZCBpbiBhZHZhbmNlIHRvIHRoZSB1c2VyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJmaWxlXCIgJiYgdHlwZSAhPSBcInBhc3N3b3JkXCIgJiYgdHlwZSAhPSBcImNoZWNrYm94XCIgJiYgdHlwZSAhPSBcInJhZGlvXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9ICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmNoYW5nZVwiKTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFtwbGFjZWhvbGRlcl0sIGRvbTp0ZXh0YXJlYVtwbGFjZWhvbGRlcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfSW5wdXRfUGxhY2Vob2xkZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIlBvdGVudGlhbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJIVE1MNSBwbGFjZWhvbGRlciBpcyB0aGUgb25seSB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiQWRkaXRpb25hbCB2aXNpYmxlIGxhYmVsIHJlZmVyZW5jZWQgYnkgJ2FyaWEtbGFiZWxsZWRieScgaXMgbm90IHZhbGlkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSFRNTDUgJ3BsYWNlaG9sZGVyJyBhdHRyaWJ1dGUgbXVzdCBub3QgYmUgdXNlZCBhcyBhIHZpc2libGUgbGFiZWwgcmVwbGFjZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09IFwiaGlkZGVuXCIgfHwgdHlwZSA9PSBcImJ1dHRvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhpZGRlblwiKSkge1xuICAgICAgICAgICAgbGV0IGhpZGRlbiA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgICAgICAgIGlmIChoaWRkZW4gPT0gXCJcIiB8fCBoaWRkZW4udG9Mb3dlckNhc2UoKSA9PSBcImhpZGRlblwiKSB7IC8vIHdoZW4gaGlkZGVuIGlzIGVtcHR5IGluIHRoZSBlbGVtZW50LCBcIlwiIGlzIHJldHVybmVkLCBzYW1lIGFzIGl0IGhhcyBhIHZhbHVlIG9mIFwiXCIuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImlkXCIpKSB7XG4gICAgICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKS50cmltKCk7XG4gICAgICAgICAgICBsZXQgcmVmSWRzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnRyaW0oKS5zcGxpdCgvXFxzKy8pOyAvLyBzZXBhcmF0ZWQgYnkgb25lIG9yIG1vcmUgd2hpdGUgc3BhY2VzXG4gICAgICAgICAgICBpZiAoIXJlZklkcy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgbGV0IGxhYmVsX2NvbnRlbnRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206bGFiZWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlZhbGVyaWVfTGFiZWxfSGFzQ29udGVudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfUmVndWxhclwiOiBcIlBhc3NfUmVndWxhclwiLFxuICAgICAgICAgICAgXCJQYXNzX0FyaWFMYWJlbFwiOiBcIlBhc3NfQXJpYUxhYmVsXCIsXG4gICAgICAgICAgICBcIlBhc3NfTGFiZWxsZWRCeVwiOiBcIlBhc3NfTGFiZWxsZWRCeVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzX1JlZ3VsYXJcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfQXJpYUxhYmVsXCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzX0xhYmVsbGVkQnlcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfUmVndWxhclwiOiBcIjxsYWJlbD4gZWxlbWVudCBoYXMgYWNjZXNzaWJsZSBuYW1lIHdpdGggaW5uZXIgY29udGVudFwiLFxuICAgICAgICAgICAgXCJQYXNzX0FyaWFMYWJlbFwiOiBcIjxsYWJlbD4gZWxlbWVudCBoYXMgYWNjZXNzaWJsZSBuYW1lIHZpYSAnYXJpYS1sYWJlbCdcIixcbiAgICAgICAgICAgIFwiUGFzc19MYWJlbGxlZEJ5XCI6IFwiPGxhYmVsPiBlbGVtZW50IGhhcyBhY2Nlc3NpYmxlIG5hbWUgdmlhICdhcmlhLWxhYmVsbGVkYnknXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8bGFiZWw+IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBkZXNjcmlwdGl2ZSB0ZXh0IHRoYXQgaWRlbnRpZmllcyB0aGUgZXhwZWN0ZWQgaW5wdXRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIDxsYWJlbD4gZWxlbWVudCBtdXN0IGhhdmUgbm9uLWVtcHR5IGRlc2NyaXB0aXZlIHRleHQgdGhhdCBpZGVudGlmaWVzIHRoZSBwdXJwb3NlIG9mIHRoZSBpbnRlcmFjdGl2ZSBjb21wb25lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfUmVndWxhclwiKTtcblxuICAgICAgICB9IGVsc2UgaWYgKChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpIHx8IFwiXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX0FyaWFMYWJlbFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgIGxldCBsYWJlbEVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknKSk7XG4gICAgICAgICAgICBpZiAobGFiZWxFbGVtICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsRWxlbSwgcnVsZUNvbnRleHQpICYmIFJQVFV0aWwuaGFzSW5uZXJDb250ZW50KGxhYmVsRWxlbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX0xhYmVsbGVkQnlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IGlzTWF0ZXJpYWxJY29uRm9udCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBsZXQgbGFiZWxfbmFtZV92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImxhYmVsX25hbWVfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpjaGVja2JveCxhcmlhOmdyaWRjZWxsLGFyaWE6bGluayxhcmlhOm1lbnVpdGVtLGFyaWE6bWVudWl0ZW1jaGVja2JveCxhcmlhOm1lbnVpdGVtcmFkaW8sYXJpYTpvcHRpb24sYXJpYTpyYWRpbyxhcmlhOnN3aXRjaCxhcmlhOnRhYixhcmlhOnRyZWVpdGVtLGRvbTppbnB1dCxkb206dGV4dGFyZWEsZG9tOnNlbGVjdCxkb206b3V0cHV0LGRvbTptZXRlclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX0xhYmVsX0FjY2Vzc2libGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJsYWJlbF9uYW1lX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJsYWJlbF9uYW1lX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxhYmVsX25hbWVfdmlzaWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkFjY2Vzc2libGUgbmFtZSBtYXRjaGVzIG9yIGNvbnRhaW5zIHRoZSB2aXNpYmxlIGxhYmVsIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQWNjZXNzaWJsZSBuYW1lIGRvZXMgbm90IG1hdGNoIG9yIGNvbnRhaW4gdGhlIHZpc2libGUgbGFiZWwgdGV4dFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFjY2Vzc2libGUgbmFtZSBtdXN0IG1hdGNoIG9yIGNvbnRhaW4gdGhlIHZpc2libGUgbGFiZWwgdGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNS4zXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFJldmlldyBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC1ydWxlcy5naXRodWIuaW8vaXNzdWVzLzE2MThcbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvV0FJL1dDQUcyMS9UZWNobmlxdWVzL2FyaWEvQVJJQTI0XG4gICAgYWN0OiBcIjJlZThiOFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgIFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhc3MgaWYgdGhlIHZpc2libGUgdGV4dCB1c2VzIE1hdGVyaWFsIEljb24gZm9udFxuICAgICAgICBpZiAoaXNNYXRlcmlhbEljb25Gb250KHJ1bGVDb250ZXh0KSkgXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgaXNJbnB1dEJ1dHRvbiA9IGZhbHNlO1xuICAgICAgICBsZXQgYnV0dG9uVHlwZXMgPSBbXCJidXR0b25cIiwgXCJyZXNldFwiLCBcInN1Ym1pdFwiLyosIFwiaW1hZ2VcIiovXTtcbiAgICAgICAgbGV0IGlucHV0VHlwZSA9IG51bGw7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGlucHV0VHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChidXR0b25UeXBlcy5pbmRleE9mKGlucHV0VHlwZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaXNJbnB1dEJ1dHRvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGhlTGFiZWxCeSA9IFJQVFV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsbGVkYnlcIik7XG4gICAgICAgIGlmICh0aGVMYWJlbEJ5ICYmICFSUFRVdGlsLmlzSWRSZWZlclRvU2VsZihydWxlQ29udGV4dCwgdGhlTGFiZWxCeSkgJiYgIWlzSW5wdXRCdXR0b24pIHtcbiAgICAgICAgICAgIC8vIHNraXAgdGhlIGNoZWNrcyBpZiBpdCBoYXMgYW4gYXJpYS1sYWJlbGxlZGJ5IHNpbmNlIGl0IHRha2VzIHByZWNlZGVuY2UuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgdGhlTGFiZWwgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoZUxhYmVsQnkgJiYgIVJQVFV0aWwuaXNJZFJlZmVyVG9TZWxmKHJ1bGVDb250ZXh0LCB0aGVMYWJlbEJ5KSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbFZhbHVlcyA9IHRoZUxhYmVsQnkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxhYmVsVmFsdWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50QnlJZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBsYWJlbFZhbHVlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50QnlJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhlTGFiZWwgPSBSUFRVdGlsLmdldElubmVyVGV4dChlbGVtZW50QnlJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhlTGFiZWwgPSBSUFRVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGVMYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdGV4dCA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChpc0lucHV0QnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgLyogTm90ZTogRGlzYWJsZSB0aGUgYWx0IGNoZWNrIGluIGltYWdlcyB1bnRpbCB3ZSBnZXQgY29uZmlybWF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0VHlwZT09PVwiaW1hZ2VcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpe1xuICAgICAgICAgICAgICAgICAgICAvLyB1c2UgJ2FsdCcgYXR0cmlidXRlIGFzIHZpc2libGUgdGV4dFxuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIH1lbHNlIFxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSAndmFsdWUnIGF0dHJpYnV0ZSBhcyB2aXNpYmxlIHRleHRcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInZhbHVlXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkZWZhdWx0IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFR5cGUgPT09IFwic3VibWl0XCIvKnx8aW5wdXRUeXBlPT09XCJpbWFnZVwiKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBcInN1Ym1pdFwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0VHlwZSA9PT0gXCJyZXNldFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gXCJyZXNldFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIGEgPGxhYmVsPiBlbGVtZW50XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IFJQVFV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWxhYmVsRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJsYWJlbFwiIC8qJiYgUlBUVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgcnVsZUNvbnRleHQpKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IHBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgZm9ybSBlbGVtZW50cyBmcm9tIHRoZSBsYWJlbCBzaW5jZSB0aGV5IG1pZ2h0IGFsc28gaGF2ZSBpbm5lciBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEVsZW0gPSBSUFRVdGlsLnJlbW92ZUFsbEZvcm1FbGVtZW50c0Zyb21MYWJlbChwYXJlbnRDbG9uZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IGxhYmVsRWxlbSA/IGxhYmVsRWxlbSA6IHJ1bGVDb250ZXh0O1xuXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRzVG9Ta2lwQ29udGVudENoZWNrID0gW1wibWV0ZXJcIiwgXCJvdXRwdXRcIiwgXCJwcm9ncmVzc1wiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCJdO1xuICAgICAgICAgICAgICAgIGlmICghbGFiZWxFbGVtICYmIGVsZW1lbnRzVG9Ta2lwQ29udGVudENoZWNrLmluZGV4T2Yobm9kZU5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gXCJcIjsgLy8gc2tpcCBjb250ZW50IGNoZWNrIGZvciBzb21lIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB2aXNpYmxlIHRleHRcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8qIE5vdGU6IERpc2FibGUgdGhpcyBhbHQgY2hlY2sgaW4gaW1hZ2VzIGZvciBub3cgdW50aWwgd2UgZ2V0IGNvbmZpcm1hdGlvblxuICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIHRoZSBhbHQgYXR0cmlidXRlIG9mIGFuIGltYWdlIHdoaWNoIGlzIGNvbnNpZGVyZWQgdmlzaWJsZSB0ZXh0LlxuICAgICAgICAgICAgICAgIGxldCBoYXNJbWdBbHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5maXJzdENoaWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG53ID0gUlBUVXRpbC5uZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFoYXNJbWdBbHQgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQgJiYgbncubm9kZSAhPSBlbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNJbWdBbHQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW1nXCIgJiYgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShudy5ub2RlLCBcImFsdFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzSW1nQWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQgPyB0ZXh0ICsgbncubm9kZS5nZXRBdHRyaWJ1dGUoXCJhbHRcIikgOiBudy5ub2RlLmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbm9uYWxwaGFudW1lcmljID0gL1teYS16QS1aMC05XS9nO1xuXG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKG5vbmFscGhhbnVtZXJpYywgXCIgXCIpOyAvLyBvbmx5IGNvbnNpZGVyIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzXG4gICAgICAgICAgICBsZXQgbm9ybWFsaXplZFRleHQgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGV4dCkudG9Mb3dlckNhc2UoKTsgLy8gTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQgZGlmZmVyZW5jZSBpbiBjYXNlIHNlbnNpdGl2aXR5IHNob3VsZCBiZSBpZ25vcmVkLlxuXG4gICAgICAgICAgICB0aGVMYWJlbCA9IHRoZUxhYmVsLnJlcGxhY2Uobm9uYWxwaGFudW1lcmljLCBcIiBcIik7IC8vIG9ubHkgY29uc2lkZXIgYWxwaGFudW1lcmljIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIGxldCBub3JtYWxpemVkTGFiZWwgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGhlTGFiZWwpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkVGV4dC5sZW5ndGggPiAxKSB7IC8vIHNraXAgbm9uLXRleHQgY29udGVudC4gZS5nLiA8YnV0dG9uIGFyaWEtbGFiZWw9XCJjbG9zZVwiPlg8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICBsZXQgbG9jYXRpb24gPSBub3JtYWxpemVkTGFiZWwuaW5kZXhPZihub3JtYWxpemVkVGV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBdm9pZCBtYXRjaGluZyBwYXJ0aWFsIHdvcmRzLmUuZy4gdGV4dCBcIm5hbWVcIiBzaG91bGQgbm90IG1hdGNoICdzdXJuYW1lJyBvciAnbmFtZXMnXG4gICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uID49IDAgJiYgbm9ybWFsaXplZExhYmVsLmxlbmd0aCA+IG5vcm1hbGl6ZWRUZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGV0dGVycyA9IC9eWzAtOWEtekEtWl0rJC87XG4gICAgICAgICAgICAgICAgICAgIGlmICgobG9jYXRpb24gKyBub3JtYWxpemVkVGV4dC5sZW5ndGgpIDwgbm9ybWFsaXplZExhYmVsLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZW5kaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhlQ2hhciA9IG5vcm1hbGl6ZWRMYWJlbC5jaGFyQXQobG9jYXRpb24gKyBub3JtYWxpemVkVGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoZUNoYXIubWF0Y2gobGV0dGVycykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkICYmIGxvY2F0aW9uID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYmVnaW5uaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhlQ2hhciA9IG5vcm1hbGl6ZWRMYWJlbC5jaGFyQXQobG9jYXRpb24gLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGVDaGFyLm1hdGNoKGxldHRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09PSAtMSkgeyAvLyBjaGVjayB0aGF0IHZpc2libGUgdGV4dCBjb250ZW50IG9mIHRoZSB0YXJnZXQgaXMgY29udGFpbmVkIHdpdGhpbiBpdHMgYWNjZXNzaWJsZSBuYW1lLlxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBsYWJlbF9yZWZfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibGFiZWxfcmVmX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206bGFiZWxbZm9yXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0xhYmVsX1JlZlZhbGlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibGFiZWxfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwibGFiZWxfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsYWJlbF9yZWZfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgdmFsdWUgXFxcInswfVxcXCIgb2YgdGhlICdmb3InIGF0dHJpYnV0ZSBpcyBub3QgdGhlICdpZCcgb2YgYSB2YWxpZCA8aW5wdXQ+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2ZvcicgYXR0cmlidXRlIG11c3QgcmVmZXJlbmNlIGEgbm9uLWVtcHR5LCB1bmlxdWUgJ2lkJyBhdHRyaWJ1dGUgb2YgYW4gPGlucHV0PiBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJmb3JcIik7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHRhcmdldCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBpZCk7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBpZiBib3RoIGxhYmVsIGFuZCBjb250cm9sIGFyZSBpbnZpc2libGVcbiAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHRhcmdldCkgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBoYW5kbGVzIG51bGwgYW5kIHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF0YXJnZXQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgICAgIC8vIEZhaWwgaWYgd2UncmUgcG9pbnRpbmcgYXQgc29tZXRoaW5nIHRoYXQgaXMgbGFiZWxsZWQgYnkgYW5vdGhlciBtZWNoYW5pc21cbiAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSB0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBub2RlTmFtZSA9PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT0gXCJzZWxlY3RcIiB8fCBub2RlTmFtZSA9PSBcInRleHRhcmVhXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT0gXCJidXR0b25cIiB8fCBub2RlTmFtZSA9PSBcImRhdGFsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT0gXCJvcHRncm91cFwiIHx8IG5vZGVOYW1lID09IFwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT0gXCJrZXlnZW5cIiB8fCBub2RlTmFtZSA9PSBcIm91dHB1dFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwicHJvZ3Jlc3NcIiB8fCBub2RlTmFtZSA9PSBcIm1ldGVyXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT0gXCJmaWVsZHNldFwiIHx8IG5vZGVOYW1lID09IFwibGVnZW5kXCI7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiB0YXJnZXQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHR5cGUgPT0gXCJ0ZXh0XCIgfHwgdHlwZSA9PSBcInBhc3N3b3JkXCIgfHwgdHlwZSA9PSBcImZpbGVcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcImNoZWNrYm94XCIgfHwgdHlwZSA9PSBcInJhZGlvXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJoaWRkZW5cIiB8fCB0eXBlID09IFwic2VhcmNoXCIgfHwgdHlwZSA9PSBcInRlbFwiIHx8IHR5cGUgPT0gXCJ1cmxcIiB8fCB0eXBlID09IFwiZW1haWxcIiB8fCAgLy9IVE1MIDVcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJkYXRlXCIgfHwgdHlwZSA9PSBcIm51bWJlclwiIHx8IHR5cGUgPT0gXCJyYW5nZVwiIHx8IHR5cGUgPT0gXCJpbWFnZVwiIHx8IC8vSFRNTCA1XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwidGltZVwiIHx8IHR5cGUgPT0gXCJjb2xvclwiIHx8ICAvLyBIVE1MIDVcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJkYXRldGltZVwiIHx8IHR5cGUgPT0gXCJtb250aFwiIHx8IHR5cGUgPT0gXCJ3ZWVrXCI7IC8vSFRNTDUuMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIG9uZSBtb3JlIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgTk9UIGhpZGRlbiwgaW4gdGhlIGNhc2UgdGhlIHRhcmdldCBpcyBoaWRkZW5cbiAgICAgICAgICAgIC8vIGZsYWcgYSB2aW9sYXRpb24gcmVnYXJkbGVzcyBvZiB3aGF0IHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIGlzLlxuICAgICAgICAgICAgaWYgKHBhc3NlZCAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VG9rZW46IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXRUb2tlbi5wdXNoKGlkKTtcbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbl0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIHJldFRva2VuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgbGV0IGxpc3RfY2hpbGRyZW5fdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibGlzdF9jaGlsZHJlbl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpncm91cFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19MaXN0X0dyb3VwX0xpc3RJdGVtXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibGlzdF9jaGlsZHJlbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImxpc3RfY2hpbGRyZW5fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxpc3RfY2hpbGRyZW5fdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJMaXN0IGNvbXBvbmVudCB3aXRoIFxcXCJncm91cFxcXCIgcm9sZSBoYXMgY2hpbGRyZW4gdGhhdCBhcmUgbm90IDxsaXN0aXRlbT4gZWxlbWVudHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJMaXN0IGNvbXBvbmVudCB3aXRoIFxcXCJncm91cFxcXCIgcm9sZSBtdXN0IGxpbWl0IGNoaWxkcmVuIHRvIDxsaXN0aXRlbT4gZWxlbWVudHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocGFyZW50LCBcImxpc3RcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IHJ1bGVDb250ZXh0LmNoaWxkcmVuO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MoY2hpbGRyZW5baV0sIFwibGlzdGl0ZW1cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgbGlzdF9tYXJrdXBfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImxpc3RfbWFya3VwX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9MaXN0X1VzZU1hcmt1cFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJsaXN0X21hcmt1cF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImxpc3RfbWFya3VwX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGlzdF9tYXJrdXBfcmV2aWV3Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgd2hldGhlciB0aGlzIGlzIGEgbGlzdCB0aGF0IHNob3VsZCB1c2UgSFRNTCBsaXN0IGVsZW1lbnRzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlIHByb3BlciBIVE1MIGxpc3QgZWxlbWVudHMgdG8gY3JlYXRlIGxpc3RzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCBmYWlsdXJlID0gL15bIFxcdFxcclxcbl0qWyggXSpbMS05XSpbXFwqXFwtKS5dWyBcXHRdW0EtWixhLXpdKy8udGVzdCh0eHRWYWwpO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICFmYWlsdXJlO1xuICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZXJlJ3Mgc29tZSBzb3J0IG9mIGJsb2NrIGxldmVsIGVsZW1lbnQgYmVmb3JlIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gQXZvaWQgZmFpbHVyZXMgZHVlIHRvIHRoaW5ncyBsaWtlIDxpPlNvbWUgc2VudGVuY2U8L2k+LiBOZXcgc2VudGVuY2UuXG4gICAgICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgbncucHJldk5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFtcImJsb2NrcXVvdGVcIiwgXCJjZW50ZXJcIiwgXCJkaXJcIiwgXCJkaXZcIiwgXCJmb3JtXCIsIFwiaDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImgyXCIsIFwiaDNcIiwgXCJoNFwiLCBcImg1XCIsIFwiaDZcIiwgXCJoclwiLCBcImJyXCIsIFwibWVudVwiLCBcInBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInByZVwiXS5pbmNsdWRlcyhub2RlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHh0ID0gbncubm9kZS5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHh0Lmxlbmd0aCA+IDAgJiYgIVtcIiBcIiwgXCJcXHRcIiwgXCJcXG5cIl0uaW5jbHVkZXModHh0LmNoYXJBdCh0eHQubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGlmIHdlJ3JlIG5vdCBpbiB0aGUgYm9keSBvciBpZiB3ZSdyZSBpbiBhIHNjcmlwdFxuICAgICAgICAgICAgbGV0IGNoZWNrQW5jZXN0b3IgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJib2R5XCIsIFwic2NyaXB0XCJdKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNoZWNrQW5jZXN0b3IgPT0gbnVsbCB8fCBjaGVja0FuY2VzdG9yLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT0gXCJib2R5XCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBsaXN0X3N0cnVjdHVyZV9wcm9wZXI6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibGlzdF9zdHJ1Y3R1cmVfcHJvcGVyXCIsXG4gICAgY29udGV4dDogXCJkb206ZGwsIGRvbTp1bCwgZG9tOm9sLCBkb206ZGlyLCBkb206bWVudSwgZG9tOmxpLCBkb206ZGQsIGRvbTpkdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0xpc3RfTWlzdXNlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImxpc3Rfc3RydWN0dXJlX3Byb3Blci5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibGlzdF9zdHJ1Y3R1cmVfcHJvcGVyLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsaXN0X3N0cnVjdHVyZV9wcm9wZXIuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkxpc3QgZWxlbWVudCBpcyBtaXNzaW5nIG9yIGltcHJvcGVybHkgc3RydWN0dXJlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkxpc3QgZWxlbWVudHMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgbGlzdHMgb2YgcmVsYXRlZCBpdGVtc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gR2V0IGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBydWxlQ29udGV4dFxuICAgICAgICBsZXQgY2hpbGRyZW4gPSBydWxlQ29udGV4dC5jaGlsZHJlblxuXG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImRsXCIpIHtcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IFwiXCI7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IFwiXCI7XG4gICAgICAgICAgICBsZXQgd2Fsa0NoaWxkcmVuID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBwcmVzZW50YXRpb25hbEZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBjaGlsZHJlbnMgc2V0IGFzIHBhc3NlZCwgc2luY2UgZGwgZWxlbWVudHMgY2FuIGhhdmVcbiAgICAgICAgICAgIC8vIHplcm8gb3IgbW9yZSBvZjogb25lIG9yIG1vcmUgZHQgZWxlbWVudHMsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGRkIGVsZW1lbnRzXG4gICAgICAgICAgICBpZiAoIXJ1bGVDb250ZXh0LmNoaWxkcmVuIHx8IHJ1bGVDb250ZXh0LmNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrQ2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2Fsa0NoaWxkcmVuLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IHdhbGtDaGlsZHJlbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGlsZSB3YWxraW5nIHRocm91Z2ggdGhlIGVsZW1lbnRzIHVuZGVyIGRsLCBpZiB3ZSBmaW5kIGEgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZW50YXRpb25hbCBlbGVtZW50IHdlIG1vdmUgdG8gdGhlIG5leHQgZWxlbWVudCBhcyBwcmVzZW50YXRpb25hbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgYXJlIGFsbG93ZWQgdW5kZXIgbGlzdCBlbGVtZW50cyBhcyB0aGV5IGFyZSBvbmx5IGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0dGluZyB0ZXh0IG5vZGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuaXNQcmVzZW50YXRpb25hbEVsZW1lbnQod2Fsa0NoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZHJlbiA9IHdhbGtDaGlsZHJlbi5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBzZXQgdG8gcGFzcyBpZiB3ZSBmaW5kIGRkIG9yIGR0IGVsZW1lbnQsIGluIHRoZSBjYXNlIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBlbGVtZW50IHRoYXQgaXMgbm90IHN1cHBvcnRlZCB3ZSB3aWxsIGNhdGNoIGl0IGhlcmUuIGkuZS4gaW1nIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbm9kZU5hbWUgPT0gXCJkZFwiIHx8IG5vZGVOYW1lID09IFwiZHRcIjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBmaXJzdCBhbmQgbGFzdCBub2RlIGRlcGVuZGluZyBvbiB3aGljaCBpcyBmb3VuZCBmaXJzdCBhbmQgbGFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IFwiXCIpIGZpcnN0ID0gbm9kZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gbm9kZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHdlIGhhdmUgZm91bmQgZHQgYW5kIGRkIGVsZW1lbnRzIHVuZGVyIGRsIHdlIHBhc3MgcmlnaHQgYXdheS5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG5vIGR0IG9yIGRkIGVsZW1lbnQsIGJ1dCBidW5jaCBvZiBwcmVzZW50YXRpb25hbCBlbGVtZW50cyB3ZSBtYXJrIHRoaXMgYXMgYVxuICAgICAgICAgICAgICAgIC8vIHBhc3MuIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgYXJlIG90aGVyIGVsZW1lbnRzIHN1Y2ggYXMgaW1nIHdlIHdpbGwgc3RpbGwgdHJpZ2dlciBhIHZpb2xhdGlvbi5cbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAocGFzc2VkICYmIGZpcnN0ID09IFwiZHRcIiAmJiBsYXN0ID09IFwiZGRcIikgfHwgKHBhc3NlZCAmJiBwcmVzZW50YXRpb25hbEZvdW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PSBcImxpXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInVsXCIsIFwib2xcIiwgXCJkaXJcIiwgXCJtZW51XCJdKSAhPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IFwiZGRcIiB8fCBub2RlTmFtZSA9PSBcImR0XCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiZGxcIikgIT0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB3YWxrQ2hpbGRyZW4gPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgICAgICAvLyBaZXJvIG9yIG1vcmUgbGkgZWxlbWVudHMgYXJlIHBlcm1pdHRlZCBpbnNpZGUgb2YgPG9sPiwgPHVsPiBvciA8bWVudT4gZWxlbWVudHMgbm93IGFzIHBlciB0aGUgaHRtbDUgc3BlYy4gVGhpcyBoYW5kbGVzIHRoZSBjYXNlXG4gICAgICAgICAgICAvLyB3aGVuIHRoZXJlIGFyZSB6ZXJvIGVsZW1lbnRzIHVuZGVyIHRoZSA8b2w+LCA8dWw+IG9yIDxtZW51Pi5cbiAgICAgICAgICAgIGlmICgobm9kZU5hbWUgPT0gXCJ1bFwiIHx8IG5vZGVOYW1lID09IFwib2xcIiB8fCBub2RlTmFtZSA9PSBcIm1lbnVcIikgJiYgKCFydWxlQ29udGV4dC5jaGlsZHJlbiB8fCBydWxlQ29udGV4dC5jaGlsZHJlbi5sZW5ndGggPT0gMCkpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbGlGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50YXRpb25hbEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGtDaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoaWxlIHdhbGtpbmcgdGhyb3VnaCB0aGUgbGlzdCBlbGVtZW50cywgaWYgd2UgZmluZCBhIFxuICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZW50YXRpb25hbCBlbGVtZW50IHdlIHNraXAgY2hlY2tpbmcgYXMgcHJlc2VudGF0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgYXJlIGFsbG93ZWQgdW5kZXIgbGlzdCBlbGVtZW50cyBhcyB0aGV5IGFyZSBvbmx5IGZvclxuICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXR0aW5nIHRleHQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmlzUHJlc2VudGF0aW9uYWxFbGVtZW50KHdhbGtDaGlsZHJlbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIGlmIHRoZSBub2RlIHR5cGUgaXMgYW55dGhpbmcgYnV0IDEsIG9yIGluIHRoZSBjYXNlIHRoYXQgaXQgaXMgYSBsaSBlbGVtZW50LiBGb3IgYW55IG90aGVyIG5vZGUgXG4gICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgYmUgY2F1Z2h0IGhlcmUgdGhhdCBlbGVtZW50IGlzIG5vdCBhbGxvd2VkIHVuZGVyIGxpc3Qgbm9kZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gRnVydGhlcm1vcmUgaW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBhIHRlbXBsYXRlIGVsZW1lbnQgd2l0aCB0aGUgcGFyZW50IGJlaW5nIHVsL29sIGRvbid0IGZsYWcgYSB2aW9sYXRpb25cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd2Fsa0NoaWxkcmVuLm5vZGVUeXBlICE9IDEgfHwgd2Fsa0NoaWxkcmVuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJsaVwiIHx8ICh3YWxrQ2hpbGRyZW4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInRlbXBsYXRlXCIgJiYgKG5vZGVOYW1lID09IFwidWxcIiB8fCBub2RlTmFtZSA9PSBcIm9sXCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgbGkgZm91bmQgdG8gdHJ1ZSBpZiB0aGUgY3VycmVudCBlbGVtZW50IChub2RlVHlwZT0xKSBpcyBhbiBsaSBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGxpRm91bmQgPSBsaUZvdW5kIHx8ICh3YWxrQ2hpbGRyZW4ubm9kZVR5cGUgPT0gMSAmJiB3YWxrQ2hpbGRyZW4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImxpXCIpO1xuICAgICAgICAgICAgICAgICAgICB3YWxrQ2hpbGRyZW4gPSB3YWxrQ2hpbGRyZW4ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgaXQgaGFzIHBhc3NlZCBhbmQgYWxzbyBsaSBlbGVtZW50IGlzIGZvdW5kIHVuZGVyIGxpc3Qgbm9kZSwgd2UgcGFzcyByaWdodCBhd2F5LlxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgbm8gbGkgZWxlbWVudCwgYnV0IGJ1bmNoIG9mIHByZXNlbnRhdGlvbmFsIGVsZW1lbnRzIHdlIG1hcmsgdGhpcyBhcyBhXG4gICAgICAgICAgICAgICAgLy8gcGFzcy4gSW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBhcmUgb3RoZXIgZWxlbWVudHMgc3VjaCBhcyBpbWcgd2Ugd2lsbCBzdGlsbCB0cmlnZ2VyIGEgdmlvbGF0aW9uLlxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IChwYXNzZWQgJiYgbGlGb3VuZCkgfHwgKHBhc3NlZCAmJiBwcmVzZW50YXRpb25hbEZvdW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBtYXJxdWVlX2VsZW1fYXZvaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWFycXVlZV9lbGVtX2F2b2lkXCIsXG4gICAgY29udGV4dDogXCJkb206bWFycXVlZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01hcnF1ZWVfVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NlZF8wXCI6IFwiUGFzc2VkXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzZWRfMFwiOiBcIm1hcnF1ZWVfZWxlbV9hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIm1hcnF1ZWVfZWxlbV9hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWFycXVlZV9lbGVtX2F2b2lkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc2VkXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJTY3JvbGxpbmcgY29udGVudCBmb3VuZCB0aGF0IHVzZXMgdGhlIG9ic29sZXRlIDxtYXJxdWVlPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxtYXJxdWVlPiBlbGVtZW50IGlzIG9ic29sZXRlIGFuZCBzaG91bGQgbm90IGJlIHVzZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgbWVkaWFfYWx0X2JyaWVmOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2FsdF9icmllZlwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1thbHRdLCBkb206YXBwbGV0W2FsdF0sIGRvbTphcmVhW2FsdF0sIGRvbTplbWJlZFthbHRdLCBkb206aW5wdXRbdHlwZV1bYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX0FsdEJyaWVmXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2FsdF9icmllZi5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWVkaWFfYWx0X2JyaWVmLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9hbHRfYnJpZWYuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlRleHQgYWx0ZXJuYXRpdmUgaXMgbW9yZSB0aGFuIDE1MCBjaGFyYWN0ZXJzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWx0ZXJuYXRpdmUgdGV4dCBpbiAnYWx0JyBhdHRyaWJ1dGUgc2hvdWxkIGJlIGJyaWVmICg8MTUwIGNoYXJhY3RlcnMpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgbWF4QWx0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDE1MCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGFsdExlbmd0aCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCkubGVuZ3RoO1xuICAgICAgICBsZXQgcGFzc2VkID0gYWx0TGVuZ3RoIDw9IHZhbGlkYXRlUGFyYW1zLm1heEFsdC52YWx1ZTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgbWVkaWFfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206YXJlYVthbHRdLCBkb206ZW1iZWRbYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX0F1ZGlvVmlkZW9BbHRGaWxlbmFtZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJtZWRpYV9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJtZWRpYV9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJGaWxlbmFtZSB1c2VkIGFzIGxhYmVsIGZvciBlbWJlZGRlZCBhdWRpbyBvciB2aWRlb1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkF1ZGlvIG9yIHZpZGVvIG9uIHRoZSBwYWdlIG11c3QgaGF2ZSBhIHNob3J0IHRleHQgYWx0ZXJuYXRpdmUgdGhhdCBkZXNjcmliZXMgdGhlIG1lZGlhIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHVyaSA9IFwiXCI7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiYXJlYVwiKSB7XG4gICAgICAgICAgICB1cmkgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1cmkgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzcmNcIilcbiAgICAgICAgfVxuICAgICAgICBpZiAodXJpID09IG51bGwpIHVyaSA9IFwiXCI7XG4gICAgICAgIGxldCBleHQgPSBSUFRVdGlsLmdldEZpbGVFeHQodXJpKTtcbiAgICAgICAgbGV0IGlzQXVkVmlkID0gZXh0Lmxlbmd0aCAhPSAwICYmIChSUFRVdGlsLmlzQXVkaW9FeHQoZXh0KSB8fCBSUFRVdGlsLmlzVmlkZW9FeHQoZXh0KSk7XG4gICAgICAgIGxldCBhbHRUZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gIWlzQXVkVmlkIHx8IChhbHRUZXh0Lmxlbmd0aCA+IDAgJiYgYWx0VGV4dC5pbmRleE9mKGV4dCkgPT0gLTEpO1xuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IG1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Ymdzb3VuZCwgZG9tOmFbaHJlZl0sIGRvbTphcmVhW2hyZWZdLCBkb206ZW1iZWQsIGRvbTpvYmplY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9BdWRpb1RyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfYXVkaW9fdHJhbnNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9hdWRpb190cmFuc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiUHJvdmlkZSB0cmFuc2NyaXB0cyBmb3IgYXVkaW8gZmlsZXNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdWRpbyBpbmZvcm1hdGlvbiBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUgaW4gdGV4dCBmb3JtXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBsZXQgdGhpc05vZGUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodGhpc05vZGUgPT0gXCJiZ3NvdW5kXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFzc2VkID0gIVJQVFV0aWwuaXNBdWRpb09iakVtYmVkTGluayhydWxlQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7IC8vIE91dCBvZiBTY29wZVxuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgbWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206cGFyYW1bbmFtZT1hdXRvcGxheV0sIGRvbTpwYXJhbVtuYW1lPWF1dG9zdGFydF0sIGRvbTplbWJlZFtmbGFzaHZhcnNdLCBkb206ZW1iZWRbc3JjXSwgZG9tOipbYXV0b3N0YXJ0PXRydWVdLCBkb206KlthdXRvc3RhcnQ9MV0sIGRvbTpiZ3NvdW5kXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRW1iZWRfQXV0b1N0YXJ0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGVyZSBpcyBhIG1lY2hhbmlzbSB0byBwYXVzZSBvciBzdG9wIGFuZCBjb250cm9sIHRoZSB2b2x1bWUgZm9yIHRoZSBhdWRpbyB0aGF0IHBsYXlzIGF1dG9tYXRpY2FsbHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJNZWNoYW5pc20gbXVzdCBiZSBhdmFpbGFibGUgdG8gcGF1c2Ugb3Igc3RvcCBhbmQgY29udHJvbCB0aGUgdm9sdW1lIG9mIHRoZSBhdWRpbyB0aGF0IHBsYXlzIGF1dG9tYXRpY2FsbHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuNC4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQ7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImJnc291bmRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJwYXJhbVwiKSB7XG4gICAgICAgICAgICBsZXQgY29udGVudCA9IFwiXCI7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidmFsdWVcIikpXG4gICAgICAgICAgICAgICAgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInZhbHVlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBwYXNzZWQgPSBjb250ZW50LmluZGV4T2YoXCIwO1wiKSA9PSAwIHx8XG4gICAgICAgICAgICAgICAgIShjb250ZW50LmluZGV4T2YoXCJ0cnVlXCIpICE9IC0xIHx8IGNvbnRlbnQuaW5kZXhPZihcIjFcIikgIT0gLTEpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IFwiZW1iZWRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJmbGFzaHZhcnNcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZmxhc2h2YXJzXCIpO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHN0ci5pbmRleE9mKFwiYXV0b3N0YXJ0PXRydWVcIikgPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RyLmluZGV4T2YoXCJhdXRvc3RhcnQ9MVwiKSA9PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3JjXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBzdHIuaW5kZXhPZihcImF1dG9zdGFydD10cnVlXCIpID09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIHN0ci5pbmRleE9mKFwiYXV0b3N0YXJ0PTFcIikgPT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhdXRvc3RhcnRcIikpIHtcbiAgICAgICAgICAgIGxldCB2YWwgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhdXRvc3RhcnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHZhbCAhPSAndHJ1ZScgJiYgdmFsICE9ICcxJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IG1lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTphdWRpbywgZG9tOnZpZGVvXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0F1ZGlvX1ZpZGVvX1RyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IG1lZGlhIHVzaW5nIDxhdWRpbz4gYW5kL29yIDx2aWRlbz4gZWxlbWVudHMgaGF2ZSBrZXlib2FyZCBhY2Nlc3NpYmxlIGNvbnRyb2xzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTWVkaWEgdXNpbmcgPGF1ZGlvPiBhbmQvb3IgPHZpZGVvPiBlbGVtZW50cyBtdXN0IGhhdmUga2V5Ym9hcmQgYWNjZXNzaWJsZSBjb250cm9sc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiYXVkaW9cIiB8fCBub2RlTmFtZSA9PT0gXCJ2aWRlb1wiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBtZWRpYV9saXZlX2NhcHRpb25lZDogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV9saXZlX2NhcHRpb25lZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmVtYmVkLCBkb206b2JqZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWVkaWFfVmlkZW9PYmplY3RUcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2xpdmVfY2FwdGlvbmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJtZWRpYV9saXZlX2NhcHRpb25lZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfbGl2ZV9jYXB0aW9uZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBjYXB0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIGxpdmUgbWVkaWEgKHN0cmVhbWluZyB2aWRlbyB3aXRoIGF1ZGlvKVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkxpdmUgbWVkaWEgKHN0cmVhbWluZyB2aWRlbyB3aXRoIGF1ZGlvKSBzaG91bGQgaGF2ZSBjYXB0aW9ucyBmb3IgYXVkaW8gY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4yLjRcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gIVJQVFV0aWwuaXNWaWRlb09iakVtYmVkTGluayhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IG1lZGlhX3RyYWNrX2F2YWlsYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV90cmFja19hdmFpbGFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTphW2hyZWZdLCBkb206YXJlYVtocmVmXSwgZG9tOmFwcGxldCwgZG9tOmVtYmVkLCBkb206b2JqZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWVkaWFfVmlkZW9SZWZlcmVuY2VUcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX3RyYWNrX2F2YWlsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfdHJhY2tfYXZhaWxhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV90cmFja19hdmFpbGFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBhdmFpbGFiaWxpdHkgb2YgYSB1c2VyLXNlbGVjdGFibGUgYXVkaW8gdHJhY2sgd2l0aCBkZXNjcmlwdGlvbiBvZiB2aXN1YWwgY29udGVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlByZS1yZWNvcmRlZCBtZWRpYSBzaG91bGQgaGF2ZSBhbiBhdWRpbyB0cmFjayB0aGF0IGRlc2NyaWJlcyB2aXN1YWwgaW5mb3JtYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMi4zXCIsIFwiMS4yLjVcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiYXBwbGV0XCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFzc2VkID0gIVJQVFV0aWwuaXNWaWRlb09iakVtYmVkTGluayhydWxlQ29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgbWV0YV9yZWRpcmVjdF9vcHRpb25hbDogUnVsZSA9IHtcbiAgICBpZDogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsXCIsXG4gICAgY29udGV4dDogXCJkb206bWV0YVtodHRwLWVxdWl2XVtjb250ZW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX01ldGFfUmVkaXJlY3RaZXJvXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcImZhaWxfbG9uZ3JlZnJlc2hcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxcIjogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2Ugc2hvdWxkIG5vdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggd2l0aG91dCB3YXJuaW5nIG9yIG9wdGlvbiB0byB0dXJuIGl0IG9mZiBvciBhZGp1c3QgdGhlIHRpbWUgbGltaXRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxcIjogXCJDaGVjayBwYWdlIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aXRob3V0IHdhcm5pbmcgb3Igb3B0aW9uc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwiQ2hlY2sgcGFnZSBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggd2l0aG91dCB3YXJuaW5nIG9yIG9wdGlvbnNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMi4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogWyBcImJpc3o1OFwiLCBcbiAgICAgICAgeyBcbiAgICAgICAgICAgIFwiYmM2NTlhXCIgOiB7XG4gICAgICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgICAgIFwiZmFpbFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgICAgICBcImZhaWxfbG9uZ3JlZnJlc2hcIjogXCJwYXNzXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIF0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJodHRwLWVxdWl2XCIpLnRvTG93ZXJDYXNlKCkgIT09ICdyZWZyZXNoJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gSW52YWxpZCBjb250ZW50IGZpZWxkXG4gICAgICAgIGlmICghY29udGVudC5tYXRjaCgvXlxcZCskLykgJiYgIWNvbnRlbnQubWF0Y2goL15cXGQrOy8pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IGNoZWNrIHRoZSBmaXJzdCBvbmUgc2luY2UgaXQgdGFrZXMgcHJpb3JpdHlcbiAgICAgICAgaWYgKFJQVFV0aWwudHJpZ2dlck9uY2UoRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpLCBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWxcIiwgZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdGltZU1hdGNoID0gY29udGVudC5tYXRjaCgvXihcXGQrKTsgK1teIF0vKTtcbiAgICAgICAgaWYgKCF0aW1lTWF0Y2ggfHwgcGFyc2VJbnQodGltZU1hdGNoWzFdKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB0aW1lID0gcGFyc2VJbnQodGltZU1hdGNoWzFdKTtcbiAgICAgICAgICAgIGlmICh0aW1lIDwgNzIwMDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xvbmdyZWZyZXNoXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IG1ldGFfcmVmcmVzaF9kZWxheTogUnVsZSA9IHtcbiAgICBpZDogXCJtZXRhX3JlZnJlc2hfZGVsYXlcIixcbiAgICBjb250ZXh0OiBcImRvbTptZXRhW2h0dHAtZXF1aXZdW2NvbnRlbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWV0YV9SZWZyZXNoXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1ldGFfcmVmcmVzaF9kZWxheS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1ldGFfcmVmcmVzaF9kZWxheS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWV0YV9yZWZyZXNoX2RlbGF5Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlcyBzaG91bGQgbm90IHJlZnJlc2ggYXV0b21hdGljYWxseVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSBwYWdlIGlzIG5vdCBiZWluZyBjYXVzZWQgdG8gcmVmcmVzaCBhdXRvbWF0aWNhbGx5XCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4yLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbIFwiYmlzejU4XCIsIFwiYmM2NTlhXCIgXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHR0cC1lcXVpdlwiKS50b0xvd2VyQ2FzZSgpICE9PSAncmVmcmVzaCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gSW52YWxpZCBjb250ZW50IGZpZWxkXG4gICAgICAgIGlmICghY29udGVudC5tYXRjaCgvXlxcZCskLykgJiYgIWNvbnRlbnQubWF0Y2goL15cXGQrOy8pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmFpbCA9ICFjb250ZW50Lm1hdGNoKC9eXFxkKzsgK1teIF0vKTtcbiAgICAgICAgcmV0dXJuICFmYWlsID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBtZXRhX3ZpZXdwb3J0X3pvb21hYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTptZXRhW25hbWVdW2NvbnRlbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJtZXRhX3ZpZXdwb3J0X3pvb21cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWV0YV92aWV3cG9ydF96b29tYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnbWV0YVtuYW1lPXZpZXdwb3J0XScgc2hvdWxkIG5vdCBwcmV2ZW50IHRoZSBicm93c2VyIHpvb21pbmcgdGhlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiVGhlICdtZXRhW25hbWU9dmlld3BvcnRdJyBkb2VzIG5vdCBwcmV2ZW50IHRoZSBicm93c2VyIHpvb21pbmcgdGhlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJDb25maXJtIHRoZSAnbWV0YVtuYW1lPXZpZXdwb3J0XScgd2l0aCBcXFwiezB9XFxcIiBjYW4gYmUgem9vbWVkIGJ5IHVzZXJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuNC40XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjEwXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcImI0ZjBjM1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmYWlsXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcIm5hbWVcIikudG9Mb3dlckNhc2UoKSAhPT0gJ3ZpZXdwb3J0JylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBjb250ZW50ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBuZWl0aGVyIG1heGltdW0tc2NhbGUgbm9yIHVzZXItc2NhbGFibGUgKGRlZmF1bHQgeWVzKVxuICAgICAgICBpZiAoIWNvbnRlbnQgfHwgY29udGVudC50cmltKCkgPT09ICcnIHx8ICghY29udGVudC5pbmNsdWRlcygnbWF4aW11bS1zY2FsZScpICYmICFjb250ZW50LmluY2x1ZGVzKCd1c2VyLXNjYWxhYmxlJykpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHVzZXJfbXNnID0gbnVsbDtcbiAgICAgICAgbGV0IG1heF9tc2cgPSBudWxsO1xuICAgICAgICBjb25zdCBwcm9wcyA9IGNvbnRlbnQuc3BsaXQoXCIsXCIpO1xuICAgICAgICBsZXQgdXNlcl9zY2FsZV92YWx1ZSA9ICd5ZXMnO1xuICAgICAgICBsZXQgbWF4aW11bV9zY2FsZV92YWx1ZSA9ICcyLjAnO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBpZWNlcyA9IHByb3AudHJpbSgpLnNwbGl0KCc9Jyk7XG4gICAgICAgICAgICBpZiAocGllY2VzLmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AuaW5jbHVkZXMoJ3VzZXItc2NhbGFibGUnKSkge1xuICAgICAgICAgICAgICAgIHVzZXJfbXNnID0gcHJvcDtcbiAgICAgICAgICAgICAgICB1c2VyX3NjYWxlX3ZhbHVlID0gcGllY2VzWzFdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAodXNlcl9zY2FsZV92YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSB8fCB1c2VyX3NjYWxlX3ZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlcl9zY2FsZV92YWx1ZSA9IHVzZXJfc2NhbGVfdmFsdWUuc3Vic3RyaW5nKDEsIHVzZXJfc2NhbGVfdmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wLmluY2x1ZGVzKCdtYXhpbXVtLXNjYWxlJykpIHtcbiAgICAgICAgICAgICAgICBtYXhfbXNnID0gcHJvcDtcbiAgICAgICAgICAgICAgICBtYXhpbXVtX3NjYWxlX3ZhbHVlID0gcGllY2VzWzFdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAobWF4aW11bV9zY2FsZV92YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSB8fCBtYXhpbXVtX3NjYWxlX3ZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bV9zY2FsZV92YWx1ZSA9IG1heGltdW1fc2NhbGVfdmFsdWUuc3Vic3RyaW5nKDEsIG1heGltdW1fc2NhbGVfdmFsdWUubGVuZ3RoIC0gMSkudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWx1ZSA9IE51bWJlcih1c2VyX3NjYWxlX3ZhbHVlKTtcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAxIHx8IHZhbHVlIDw9IC0xKSB1c2VyX3NjYWxlX3ZhbHVlID0gJ3llcyc7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWF4aW11bV9zY2FsZSA9IDIuMDtcbiAgICAgICAgdmFsdWUgPSBOdW1iZXIobWF4aW11bV9zY2FsZV92YWx1ZSk7XG4gICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPCAwKSBtYXhpbXVtX3NjYWxlID0gMi4wO1xuICAgICAgICAgICAgZWxzZSBtYXhpbXVtX3NjYWxlID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobWF4aW11bV9zY2FsZV92YWx1ZSA9PT0gJ3llcycpIG1heGltdW1fc2NhbGUgPSAxLjA7XG4gICAgICAgICAgICBlbHNlIG1heGltdW1fc2NhbGUgPSAwLjE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1c2VyLXNjYWxhYmxlIGlzIG5vdCBzZXQgdG8gJ3llcycsIGlnbm9yZSBtYXhpbXVtX3NjYWxlXG4gICAgICAgIGlmICh1c2VyX3NjYWxlX3ZhbHVlICE9PSAneWVzJykge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiLCBbdXNlcl9tc2ddKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1c2VyLXNjYWxhYmxlIGlzICd5ZXMnLCBidXQgbWF4aW11bV9zY2FsZSBpcyB0b28gc21hbGxcbiAgICAgICAgaWYgKG1heGltdW1fc2NhbGUgPCAyLjApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIiwgW21heF9tc2ddKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBub2VtYmVkX2NvbnRlbnRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpub2VtYmVkXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX05vZW1iZWRfSGFzQ29udGVudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQWRkIGRlc2NyaXB0aXZlIHRleHQgdG8gdGhlIDxub2VtYmVkPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPG5vZW1iZWQ+IGVsZW1lbnRzIHNob3VsZCBjb250YWluIGRlc2NyaXB0aXZlIHRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IG9iamVjdF90ZXh0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJvYmplY3RfdGV4dF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpvYmplY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9PYmplY3RfSGFzVGV4dFwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiOiBcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwib2JqZWN0X3RleHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIm9iamVjdF90ZXh0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiOiBcIm9iamVjdF90ZXh0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPG9iamVjdD4gZWxlbWVudCBtdXN0IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlIGZvciB0aGUgY29udGVudCByZW5kZXJlZCBieSB0aGUgb2JqZWN0XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCI8b2JqZWN0PiBlbGVtZW50IGhhcyBhIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub190ZXh0X2FsdGVybmF0aXZlXCI6IFwiQW4gPG9iamVjdD4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI4ZmMzYjZcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlY3QgaWYgdGhpcyBvYmplY3QgaXMgb2YgdHlwZSB0ZXh0LCBieSBjaGVja2luZyB0aGUgb2JqZWN0IHR5cGUgaW4gdGhlIGNhc2UgaXQgaXMgdGV4dCB0aGVuIGRvIG5vdCB0cmlnZ2VyIHRoaXMgcnVsZVxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkuaW5kZXhPZihcInRleHRcIikgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIGFuIGV4cGxpY2l0IHJvbGUgaXMgc3BlY2lmaWVkOiBpbmNsdWRpbmcgJ3ByZXNlbnRhdGlvbicsICdub25lJywgJ2FwcGxpY2F0aW9uJywgJ2RvY3VtZW50JyBvciAnaW1nJ1xuICAgICAgICAvLyB0aGlzIGNhc2Ugd2lsbCBiZSBjb3ZlcmVkIGluIG90aGVyIHJ1bGVzXG4gICAgICAgIGxldCByb2xlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKTtcbiAgICAgICAgaWYgKHJvbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGVyIEFDVCwgaWdub3JlIGVtYmVkZGVkIEhUTUwgZmlsZXNcbiAgICAgICAgbGV0IGRhdGEgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJkYXRhXCIpO1xuICAgICAgICBsZXQgZXh0ID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gdHlwZW9mIFwiXCIgPyBkYXRhLnN1YnN0cmluZyhkYXRhLmxhc3RJbmRleE9mKFwiLlwiKSkgOiBcIlwiO1xuICAgICAgICBpZiAoZXh0ID09PSBcIi5odG1sXCIgfHwgZXh0ID09PSBcIi5odG1cIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBBbmNlc3RvclV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3JcIjtcblxuZXhwb3J0IGxldCBwYWdlX3RpdGxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJwYWdlX3RpdGxlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmh0bWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Eb2NfSGFzVGl0bGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJwYWdlX3RpdGxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBwYWdlIHNob3VsZCBoYXZlIGEgdGl0bGUgdGhhdCBjb3JyZWN0bHkgaWRlbnRpZmllcyB0aGUgc3ViamVjdCBvZiB0aGUgcGFnZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNaXNzaW5nIDxoZWFkPiBlbGVtZW50IHNvIHRoZXJlIGNhbiBiZSBubyA8dGl0bGU+IGVsZW1lbnQgcHJlc2VudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJNaXNzaW5nIDx0aXRsZT4gZWxlbWVudCBpbiA8aGVhZD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJUaGUgPHRpdGxlPiBlbGVtZW50IGlzIGVtcHR5IChubyBpbm5lckhUTUwpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjI3NzlhNVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGluc2lkZSBhIHByZXNlbnRhdGlvbmFsIGZyYW1lXG4gICAgICAgIGlmIChBbmNlc3RvclV0aWwuaXNGcmFtZShjb250ZXh0SGllcmFyY2hpZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBOb2RlO1xuICAgICAgICAvLyBGaXJzdCwgZmluZCB0aGUgaGVhZCBlbGVtZW50XG4gICAgICAgIGxldCBmaW5kSGVhZCA9IHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQgYXMgTm9kZTtcbiAgICAgICAgbGV0IGZpbmRUaXRsZSA9IG51bGw7XG4gICAgICAgIHdoaWxlIChmaW5kSGVhZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZmluZEhlYWQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImhlYWRcIilcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGZpbmRIZWFkID0gZmluZEhlYWQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBvc3NpYmxlVGl0bGVzID0gKHJ1bGVDb250ZXh0IGFzIEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0aXRsZVwiKTtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgcG9zc2libGVUaXRsZXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgaWYgKCFSUFRVdGlsLmdldEFuY2VzdG9yKHBvc3NpYmxlVGl0bGVzW2lkeF0sIFtcInN2Z1wiXSkpIHtcbiAgICAgICAgICAgICAgICBmaW5kVGl0bGUgPSBwb3NzaWJsZVRpdGxlc1tpZHhdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmaW5kSGVhZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCFmaW5kVGl0bGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmluZFRpdGxlID09PSBudWxsKSB7IC8vIGRvbid0IGhhdmUgdGl0bGUgc2Vjb25kIFBvRlxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgd2UgZ2V0IGhlcmUgd2UgaGF2ZSA8aGVhZD4gYW5kIDx0aXRsZT5cblxuICAgICAgICBpZiAoZmluZFRpdGxlICE9IG51bGwgJiYgUlBUVXRpbC5nZXRJbm5lclRleHQoZmluZFRpdGxlKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2UgeyAvLyA8dGl0bGU+IGhhcyBubyBpbm5lckhUTUwgdGhpcmQgUG9GXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHBhZ2VfdGl0bGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwicGFnZV90aXRsZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmhlYWQgZG9tOnRpdGxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGl0bGVfVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiUG90ZW50aWFsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhZ2VfdGl0bGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiUGFnZSA8dGl0bGU+IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiVmVyaWZ5IHRoYXQgdXNpbmcgdGhlIGZpbGVuYW1lIGFzIHRoZSBwYWdlIDx0aXRsZT4gdmFsdWUgaXMgZGVzY3JpcHRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlIDx0aXRsZT4gc2hvdWxkIGJlIGEgZGVzY3JpcHRpdmUgdGl0bGUsIHJhdGhlciB0aGFuIGEgZmlsZW5hbWVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgbGV0IHRpdGxlU3RyID0gUlBUVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpLnRyaW0oKTtcblxuICAgICAgICAvLyBhbGxvdyAuY29tLCAubmV0IGFuZCAub3JnXG4gICAgICAgIGxldCB0aXRsZVN0ckxvd2VyY2FzZSA9IHRpdGxlU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aXRsZVN0ckxvd2VyY2FzZS5pbmNsdWRlcyhcIi5jb21cIikgfHwgdGl0bGVTdHJMb3dlcmNhc2UuaW5jbHVkZXMoXCIubmV0XCIpIHx8IHRpdGxlU3RyTG93ZXJjYXNlLmluY2x1ZGVzKFwiLm9yZ1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFt0aXRsZVN0cl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpdGxlU3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBjb3ZlcmVkIGJ5IHBhZ2VfdGl0bGVfZXhpc3RzXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsvL1J1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBhc3NlZCA9ICEvXlxcUypcXC5bYS16QS1aXXsxLDR9KD8hLil8Xmh0dHBzPzpcXC9cXC9cXFMqL2kudGVzdCh0aXRsZVN0cik7XG5cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFt0aXRsZVN0cl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206KltvbmZvY3VzXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1NjcmlwdF9Gb2N1c0JsdXJzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9mb2N1c19ibHVyX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSBzY3JpcHQgZG9lcyBub3QgcmVtb3ZlIGZvY3VzIGZyb20gY29udGVudCB0aGF0IG5vcm1hbGx5IHJlY2VpdmVzIGZvY3VzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2NyaXB0aW5nIG11c3Qgbm90IHJlbW92ZSBmb2N1cyBmcm9tIGNvbnRlbnQgdGhhdCBub3JtYWxseSByZWNlaXZlcyBmb2N1c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjdcIiwgXCIzLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwib25mb2N1c1wiKS5pbmRleE9mKFwiLmJsdXIoXCIpID09IC0xO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBzY3JpcHRfb25jbGlja19hdm9pZDogUnVsZSA9IHtcbiAgICBpZDogXCJzY3JpcHRfb25jbGlja19hdm9pZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25jbGlja11cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcInNjcmlwdF9vbmNsaWNrX21pc3VzZVwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TY3JpcHRfT25jbGlja0hUTUwyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9vbmNsaWNrX2F2b2lkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfb25jbGlja19hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X29uY2xpY2tfYXZvaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0ICdvbmNsaWNrJyBldmVudHMgYXJlIG5vdCB1c2VkIGluIHNjcmlwdCB0byBlbXVsYXRlIGEgbGlua1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcmlwdHMgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGVtdWxhdGUgbGlua3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgdGhpcyBmb3IgU1ZHIGVsZW1lbnQgZm9yIG5vdyB1bnRpbCBhIGRldGVybWluYXRpb24gaXMgbWFkZSAoYnkgUmljaClcbiAgICAgICAgLy8gdG8gc3VwcG9ydCBTVkcgYXQgYSBwb2ludCB3aGVuIHRoZSBTVkcgYTExeSBzcGVjIGlzIHJlYWR5LlxuICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJzdmdcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGFyaWEtcm9sZSBzcGVjaWZpZWQsIGRvbid0IHRyaWdnZXIgdGhpcy5cbiAgICAgICAgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwicm9sZVwiKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gbm9kZU5hbWUgPT0gXCJhXCIgfHwgbm9kZU5hbWUgPT0gXCJhcmVhXCIgfHwgbm9kZU5hbWUgPT0gXCJpbnB1dFwiO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBzY3JpcHRfb25jbGlja19taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2NyaXB0X29uY2xpY2tfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206KltvbmNsaWNrXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1NjcmlwdF9PbmNsaWNrSFRNTDFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2NyaXB0X29uY2xpY2tfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfb25jbGlja19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNjcmlwdF9vbmNsaWNrX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG9zc2libGUgdXNlIG9mIGEgc2NyaXB0IHRvIGVtdWxhdGUgYSBsaW5rXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2NyaXB0cyBzaG91bGQgbm90IGJlIHVzZWQgdG8gZW11bGF0ZSBsaW5rc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBmYWlsU3Vic3RyaW5nOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcIi5hc3BcIiwgXCIuYXNweFwiLCBcIi5jZm1cIiwgXCIuY2ZtbFwiLCBcIi5jZ2lcIiwgXCIuaHRtXCIsIFwiLmh0bWxcIiwgXCIuc2h0bVwiLFxuICAgICAgICAgICAgICAgICAgICBcIi5zaHRtbFwiLCBcIi5waHBcIiwgXCIucGxcIiwgXCIucHlcIiwgXCIuc2h0bVwiLCBcIi5zaHRtbFwiLCBcIi54aHRtbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImxvY2F0aW9uLmhyZWZcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXJpYS1yb2xlIHNwZWNpZmllZCwgZG9uJ3QgdHJpZ2dlciB0aGlzLlxuICAgICAgICBsZXQgcGFzc2VkID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJyb2xlXCIpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGEgb3IgYXJlYSwgZG9uJ3QgdHJpZ2dlciBpZiB0aGVyZSdzIGFuIGhyZWYuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKG5vZGVOYW1lID09IFwiYVwiIHx8IG5vZGVOYW1lID09IFwiYXJlYVwiKSAmJiBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImhyZWZcIikpO1xuXG4gICAgICAgIC8vIElmIHRoZSBndWFyZHMgZmFpbGVkLCBjaGVjayB0byBzZWUgaWYgdGhleSdyZSBsb29raW5nIGF0IGxpbmtzXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICBsZXQgZmFpbFN1YnN0cmluZyA9IHZhbGlkYXRlUGFyYW1zLmZhaWxTdWJzdHJpbmcudmFsdWU7O1xuICAgICAgICAgICAgbGV0IG9uY2xpY2sgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmNsaWNrXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgZmFpbFN1YnN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IG9uY2xpY2suaW5kZXhPZihmYWlsU3Vic3RyaW5nW2ldKSA9PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHNjcmlwdF9zZWxlY3RfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcInNjcmlwdF9zZWxlY3RfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfU2VsZWN0X05vQ2hhbmdlQWN0aW9uXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9zZWxlY3RfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfc2VsZWN0X3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X3NlbGVjdF9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IG5vIGNoYW5nZSBvZiBjb250ZXh0IG9yIGFjdGlvbiBvY2N1cnMgd2hlbiBzZWxlY3Rpb24gb3B0aW9ucyBpbiB0aGlzIGNvbXBvbmVudCByZWNlaXZlIGZvY3VzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTm8gY2hhbmdlcyBvZiBjb250ZXh0IHNob3VsZCBvY2N1ciB3aGVuIGEgc2VsZWN0aW9uIHZhbHVlIHJlY2VpdmVzIGZvY3VzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25jaGFuZ2VcIikgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZm9jdXNcIik7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHNlbGVjdF9vcHRpb25zX2dyb3VwZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2VsZWN0X29wdGlvbnNfZ3JvdXBlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnNlbGVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1NlbGVjdF9IYXNPcHRHcm91cFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzZWxlY3Rfb3B0aW9uc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzZWxlY3Rfb3B0aW9uc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzZWxlY3Rfb3B0aW9uc19ncm91cGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJHcm91cCBvZiByZWxhdGVkIG9wdGlvbnMgbWF5IG5lZWQgPG9wdGdyb3VwPlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkdyb3VwcyBvZiByZWxhdGVkIG9wdGlvbnMgd2l0aGluIGEgc2VsZWN0aW9uIGxpc3Qgc2hvdWxkIGJlIGdyb3VwZWQgd2l0aCA8b3B0Z3JvdXA+XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBwYXJhbU51bU9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMTAsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2VzIHdoZXJlIG9wdGdyb3VwIGlzIGhpZGRlbiwgd2hpY2ggc2hvdWxkIHRyaWdnZXIgYSB2aW9sYXRpb25zXG4gICAgICAgIC8vIGJ1dCBpbiB0aGUgY2FzZSB0aGF0IENoZWNrIGhpZGRlbiBvcHRpb24gaXMgc2V0IHRoZW4gc2hvdWxkIG5vdCB0cmlnZ2VyIGEgdmlvbGF0aW9uLlxuICAgICAgICBsZXQgcGFzc2VkID0gUlBUVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHJ1bGVDb250ZXh0LCBcIm9wdGdyb3VwXCIsIGZhbHNlLCB0cnVlKS5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICBSUFRVdGlsLmdldENoaWxkQnlUYWdIaWRkZW4ocnVsZUNvbnRleHQsIFwib3B0aW9uXCIsIGZhbHNlLCB0cnVlKS5sZW5ndGggPD1cbiAgICAgICAgICAgIHZhbGlkYXRlUGFyYW1zLnBhcmFtTnVtT3B0aW9ucy52YWx1ZTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBza2lwX21haW5fZGVzY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcInNraXBfbWFpbl9kZXNjcmliZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJza2lwX21haW5fZXhpc3RzXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0JvZHlfRmlyc3RBQ29udGFpbnNTa2lwVGV4dF9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2tpcF9tYWluX2Rlc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2tpcF9tYWluX2Rlc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2tpcF9tYWluX2Rlc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgaWYgdGhpcyBoeXBlcmxpbmsgc2tpcHMgY29udGVudCwgdGhlIGRlc2NyaXB0aW9uIGNvbW11bmljYXRlcyB3aGVyZSBpdCBsaW5rcyB0b1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBkZXNjcmlwdGlvbiBvZiBhIGh5cGVybGluayB1c2VkIHRvIHNraXAgY29udGVudCBtdXN0IGNvbW11bmljYXRlIHdoZXJlIGl0IGxpbmtzIHRvXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgcGFyYW1Ta2lwVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJza2lwXCIsIFwianVtcFwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBHZXQgdGhlIGFuY2hvcnMgb24gdGhlIHBhZ2VcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGxhbmRtYXJrcyBmaXJzdFxuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBpZiAoZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBudWxsKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFtcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICAgICAgXCJmb3JtXCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJzZWFyY2hcIlxuICAgICAgICAgICAgXSwgdHJ1ZSwgdHJ1ZSkubGVuZ3RoID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFzc2VkID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHsgLy8gTm8gbGFuZG1hcmtzLCBjaGVjayBmb3Igc2tpcCBsaW5rc1xuICAgICAgICAgICAgbGV0IGxpbmtzID0gZG9jLmxpbmtzO1xuICAgICAgICAgICAgLy8gU2tpcCBsaW5rIHNob3VsZCBiZSB0aGUgZmlyc3Qgb25lIG9uIHRoZSBwYWdlIHdpdGggYW4gaHJlZiBhdHRyaWJ1dGUgKGkuZS4sIGxpbmtzWzBdKVxuICAgICAgICAgICAgLy8gYWxzbyBpZiB0aGUgZmlyc3QgbGluayBpcyBoaWRkZW4gdGhlbiB3ZSBzaG91bGQgYWxzbyB0cmlnZ2VyIGEgdmlvbGF0aW9uLlxuICAgICAgICAgICAgaWYgKGxpbmtzICYmIGxpbmtzLmxlbmd0aCA+IDAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGxpbmtzWzBdKSkge1xuICAgICAgICAgICAgICAgIGxldCB0ZXN0VGV4dCA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KGRvYy5saW5rc1swXSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgdmFsaWRhdGVQYXJhbXMucGFyYW1Ta2lwVGV4dC52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0ZXN0VGV4dC5pbmRleE9mKHZhbGlkYXRlUGFyYW1zLnBhcmFtU2tpcFRleHQudmFsdWVbaV0pICE9IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQW5jZXN0b3JVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2FuY2VzdG9yXCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBza2lwX21haW5fZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcInNraXBfbWFpbl9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQm9keV9GaXJzdEFTa2lwc19OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNraXBfbWFpbl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJza2lwX21haW5fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJza2lwX21haW5fZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIHBhZ2UgZG9lcyBub3QgcHJvdmlkZSBhIHdheSB0byBxdWlja2x5IG5hdmlnYXRlIHRvIHRoZSBtYWluIGNvbnRlbnQgKEFSSUEgXFxcIm1haW5cXFwiIGxhbmRtYXJrIG9yIGEgc2tpcCBsaW5rKVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2VzIG11c3QgcHJvdmlkZSBhIHdheSB0byBza2lwIGRpcmVjdGx5IHRvIHRoZSBtYWluIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGluc2lkZSBhIHByZXNlbnRhdGlvbmFsIGZyYW1lXG4gICAgICAgIGlmIChBbmNlc3RvclV0aWwuaXNQcmVzZW50YXRpb25GcmFtZShjb250ZXh0SGllcmFyY2hpZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBHZXQgdGhlIGFuY2hvcnMgb24gdGhlIHBhZ2VcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGxhbmRtYXJrcyBmaXJzdFxuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBpZiAoZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBudWxsKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFtcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICAgICAgXCJmb3JtXCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJzZWFyY2hcIlxuICAgICAgICAgICAgXSwgdHJ1ZSwgdHJ1ZSkubGVuZ3RoID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFzc2VkID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHsgLy8gTm8gbGFuZG1hcmtzLCBjaGVjayBmb3Igc2tpcCBsaW5rc1xuICAgICAgICAgICAgbGV0IGFuY2hvcnMgPSBSUFRVdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiYVwiKTtcblxuICAgICAgICAgICAgLy8gU2tpcCBhbmNob3Igc2hvdWxkIGJlIHRoZSBmaXJzdCBvbmUgb24gdGhlIHBhZ2Ugd2l0aCBhbiBocmVmIGF0dHJpYnV0ZVxuICAgICAgICAgICAgbGV0IHRlc3RBbmNob3IgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbmNob3JzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcnNbaV0uaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUoYW5jaG9yc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdEFuY2hvciA9IGFuY2hvcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHVsbCBvdXQgdGhlIHRhcmdldCBpZFxuICAgICAgICAgICAgbGV0IHRhcmdldElkID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0ZXN0QW5jaG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgaHJlZlN0ciA9IHRlc3RBbmNob3IuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgICAgICAgICBsZXQgaWR4ID0gaHJlZlN0ci5pbmRleE9mKFwiI1wiKTtcbiAgICAgICAgICAgICAgICBpZiAoaWR4ICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldElkID0gaHJlZlN0ci5zdWJzdHJpbmcoaWR4ICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGFuIGVsZW1lbnQgaWQgb3IgbmFtZWQgYW5jaG9yIG9uIHRoZSBwYWdlIHdpdGggdGhpc1xuICAgICAgICAgICAgLy8gdGFyZ2V0IGlkLlxuXG4gICAgICAgICAgICBpZiAodGFyZ2V0SWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGRvYy5nZXRFbGVtZW50QnlJZCh0YXJnZXRJZCkgIT0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgYW5jaG9ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFuY2hvcnNbaV0uaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yc1tpXS5oYXNBdHRyaWJ1dGUoXCJuYW1lXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzW2ldLmdldEF0dHJpYnV0ZShcIm5hbWVcIikgPT0gdGFyZ2V0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIFtdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgc3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206KltzdHlsZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TdHlsZV9CYWNrZ3JvdW5kSW1hZ2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZSBDU1MgYmFja2dyb3VuZCBpbWFnZSBkb2VzIG5vdCBjb252ZXkgaW1wb3J0YW50IGluZm9ybWF0aW9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW1hZ2VzIGluY2x1ZGVkIGJ5IHVzaW5nIENTUyBhbG9uZSBtdXN0IG5vdCBjb252ZXkgaW1wb3J0YW50IGluZm9ybWF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImxpbmtcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyZWxcIikgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJlbFwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlc2hlZXRcIikge1xuICAgICAgICAgICAgLy8gRXh0ZXJuYWwgc3R5bGVzaGVldCAtIHRyaWdnZXJcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwudHJpZ2dlck9uY2UocnVsZUNvbnRleHQsIFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlXCIsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkICYmIG5vZGVOYW1lID09PSBcInN0eWxlXCIgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3R5bGVcIikpIHtcbiAgICAgICAgICAgIGxldCBzdHlsZVRleHQ7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIilcbiAgICAgICAgICAgICAgICBzdHlsZVRleHQgPSBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc3R5bGVUZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIik7XG4gICAgICAgICAgICBsZXQgYmdNYXRjaGVzID0gc3R5bGVUZXh0Lm1hdGNoKC9iYWNrZ3JvdW5kOlteO10qL2cpO1xuICAgICAgICAgICAgaWYgKGJnTWF0Y2hlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGJnTWF0Y2hlcy5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gYmdNYXRjaGVzW2ldLmluZGV4T2YoXCJ1cmwoXCIpID09PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIlxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZ2V0Q1NTU3R5bGUgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5cbi8qKlxuICogRGVzY3JpcHRpb246IFRyaWdnZXIgaWYgOmJlZm9yZSBhbmQgOmFmdGVyIGFyZSB1c2VkIGluIENTUyAoSW50ZXJuYWwgYW5kIEV4dGVybmFsKSB3aXRoIGNvbnRlbnRcbiAqIE9yaWdpbjogV0NBRyAyLjAgRjg3XG4gKi9cbmV4cG9ydCBsZXQgc3R5bGVfYmVmb3JlX2FmdGVyX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbTpsaW5rXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfU3R5bGVfQmVmb3JlQWZ0ZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHN0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXcuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3Lmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkRvIG5vdCB1c2UgQ1NTICc6OmJlZm9yZScgYW5kICc6OmFmdGVyJyBwc2V1ZG8tZWxlbWVudHMgdG8gaW5zZXJ0IG5vbi1kZWNvcmF0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlICc6OmJlZm9yZScgYW5kICc6OmFmdGVyJyBwc2V1ZG8tZWxlbWVudHMgZG8gbm90IGluc2VydCBub24tZGVjb3JhdGl2ZSBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIxLjMuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgLy9jaGVjayBJbnRlcm5hbCBzdHlsZXMgICAgICAgIFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICBsZXQgY3NzID0gZ2V0Q1NTU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgY3NzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBiYWQgQ1NTXG4gICAgICAgICAgICAgICAgaWYgKGNzc1tpXS5zZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoY3NzW2ldLnNlbGVjdG9yLmluZGV4T2YoXCI6YmVmb3JlXCIpID09PSAtMSAmJiBjc3NbaV0uc2VsZWN0b3IuaW5kZXhPZihcIjphZnRlclwiKSA9PT0gLTEpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhKFwiY29udGVudFwiIGluIGNzc1tpXS52YWx1ZXMpIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKS5sZW5ndGggPT09IDAgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcIlxcXCJcXFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJcXCdcXCdcIiB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkgPT09IFwibm9uZVwiIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJhdHRyKHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJhdHRyKHkpXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBzcGVjaWFsIHJ1bGVzIGluIHRoZSBzdHlsZXNoZWV0c1xuICAgICAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGVSdWxlSW5kZXggPSAwOyBwYXNzZWQgJiYgc3R5bGVSdWxlSW5kZXggPCBzdHlsZVJ1bGVzLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbc3R5bGVSdWxlSW5kZXhdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNoZWNrICdpZiAoc3R5bGVSdWxlIGluc3RhbmNlb2YgQ1NTTWVkaWFSdWxlKScgZG9lc24ndCB3b3JrIHdoZW4gcnVuIGluIEthcm1hKGJ1dCB3b3JrcyBpbiBEQVApIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gbGV0J3MgYWNjZXNzIHRoZSB0eXBlIGRpcmVjdGx5IGFzIGEgd29ya2Fyb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlSW1wb3J0UnVsZTogQ1NTSW1wb3J0UnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGUudHlwZSAmJiBzdHlsZVJ1bGUudHlwZSA9PT0gNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVNZWRpYVJ1bGUgPSBzdHlsZVJ1bGUgYXMgQ1NTTWVkaWFSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZWRpYVJ1bGVzID0gc3R5bGVNZWRpYVJ1bGUuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IG1lZGlhUnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1SdWxlID0gbWVkaWFSdWxlc1tySW5kZXhdIGFzIGFueTsgLy8gc2VsZWN0b3JUZXh0IG5vdCByZWNvZ25pemVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBtUnVsZS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5pbmRleE9mKFwiOmJlZm9yZVwiKSAhPT0gLTEgfHwgcnVsZS5pbmRleE9mKFwiOmFmdGVyXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IG1SdWxlLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbXBvcnQgcnVsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0eWxlUnVsZS50eXBlICYmIHN0eWxlUnVsZS50eXBlID09PSAzIC8qIENTU1J1bGUuSU1QT1JUX1JVTEUgKi8gJiYgKHN0eWxlSW1wb3J0UnVsZSA9IHN0eWxlUnVsZSBhcyBDU1NJbXBvcnRSdWxlKS5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQuY3NzUnVsZXMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydGVkUnVsZSA9IHJ1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRSdWxlLnR5cGUgJiYgaW1wb3J0ZWRSdWxlLnR5cGUgPT09IDQgLyogQ1NTUnVsZS5NRURJQV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhUnVsZXMgPSAoaW1wb3J0ZWRSdWxlIGFzIENTU01lZGlhUnVsZSkuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbUluZGV4ID0gMDsgbUluZGV4IDwgbWVkaWFSdWxlcy5sZW5ndGg7IG1JbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbVJ1bGUgPSBtZWRpYVJ1bGVzW21JbmRleF0gYXMgYW55OyAvLyBzZWxlY3RvclRleHQgbm90IHJlY29nbml6ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVsZS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgbVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IG1SdWxlLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gbVJ1bGUuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoaW1wb3J0ZWRSdWxlIGFzIGFueSkuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIChpbXBvcnRlZFJ1bGUgYXMgYW55KS5zZWxlY3RvclRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gKGltcG9ydGVkUnVsZSBhcyBhbnkpLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBib3RoIHNpbmdsZSBjb2xvbiAoOikgYW5kIGRvdWJsZSBjb2xvbiAoOjopIHBzZXVkbyAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gKGltcG9ydGVkUnVsZSBhcyBhbnkpLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBleHRlcm5hbCBzdHlsZXMgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxpbmtcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyZWxcIikgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJlbFwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlc2hlZXRcIiAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpLnRyaW0oKS5sZW5ndGggIT09IDApIHtcblxuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHBhc3NlZCAmJiBySW5kZXggPCBydWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlRnJvbUxpbmsgPSBydWxlc1tySW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlRnJvbUxpbmsudHlwZSAmJiBydWxlRnJvbUxpbmsudHlwZSA9PT0gNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZWRpYVJ1bGVzID0gKHJ1bGVGcm9tTGluayBhcyBDU1NNZWRpYVJ1bGUpLmNzc1J1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBtSW5kZXggPSAwOyBwYXNzZWQgJiYgbUluZGV4IDwgbWVkaWFSdWxlcy5sZW5ndGg7IG1JbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtUnVsZSA9IG1lZGlhUnVsZXNbbUluZGV4XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVsZS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgbVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlU2VsVHh0ID0gbVJ1bGUuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVNlbFR4dC5pbmRleE9mKFwiOmJlZm9yZVwiKSAhPT0gLTEgfHwgcnVsZVNlbFR4dC5pbmRleE9mKFwiOmFmdGVyXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gbVJ1bGUuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJub25lXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgocnVsZXNbckluZGV4XSBhcyBhbnkpLnNlbGVjdG9yVGV4dCAhPT0gbnVsbCAmJiAocnVsZXNbckluZGV4XSBhcyBhbnkpLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IChydWxlc1tySW5kZXhdIGFzIGFueSkuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgYm90aCBzaW5nbGUgY29sb24gKDopIGFuZCBkb3VibGUgY29sb24gKDo6KSBwc2V1ZG8gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAocnVsZXNbckluZGV4XSBhcyBhbnkpLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKSAhPT0gXCJcXFwiXFxcIlwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHgpXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgc3R5bGVfY29sb3JfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2NvbG9yX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206KltzdHlsZV0sIGRvbTpmb250W2NvbG9yXSwgZG9tOmxpbmtcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TdHlsZV9Db2xvclNlbWFudGljczFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBzdHlsZV9jb2xvcl9taXN1c2UuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgc3R5bGVfY29sb3JfbWlzdXNlLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgc3R5bGVfY29sb3JfbWlzdXNlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbWJpbmUgY29sb3IgYW5kIGRlc2NyaXB0aXZlIG1hcmt1cCB0byBjb252ZXkgaW5mb3JtYXRpb25cIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgY29sb3IgaXMgbm90IHVzZWQgYXMgdGhlIG9ubHkgdmlzdWFsIG1lYW5zIG9mIGNvbnZleWluZyBpbmZvcm1hdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMS40LjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgc3R5bGVUZXh0ID0gUlBUVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAvLyBjaGVjayBpbXBvcnRcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4ID0gMDsgc3R5bGVSdWxlSW5kZXggPCBzdHlsZVJ1bGVzLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGUgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVJbXBvcnRSdWxlOiBDU1NJbXBvcnRSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGUudHlwZSAmJiBzdHlsZVJ1bGUudHlwZSA9PT0gMyAvKiBDU1NSdWxlLklNUE9SVF9SVUxFICovICYmIChzdHlsZUltcG9ydFJ1bGUgPSBzdHlsZVJ1bGUgYXMgQ1NTSW1wb3J0UnVsZSkuc3R5bGVTaGVldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0UnVsZXMgPSBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA/IHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzIDogc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IGltcG9ydFJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpUnVsZSA9IGltcG9ydFJ1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVRleHQgKz0gaVJ1bGUuY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpKSB7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImxpbmtcIiAmJiAvL2NoZWNrIGV4dGVybmFsIHN0eWxlc1xuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicmVsXCIpICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZXNoZWV0XCIgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhyZWZcIikudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVRleHQgKz0gcnVsZXNbckluZGV4XS5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaWxlbmNlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gRGVmZWN0IDEwMjI6IEZpbmQgdXNlcyBvZiAnY29sb3InIGFuZCAnKmJhY2tncm91bmQqJyBvbmx5XG4gICAgICAgIGxldCBpc0JnVXNlZCA9IHN0eWxlVGV4dC5tYXRjaCgvXFxiYmFja2dyb3VuZFxcYi9pKTtcblxuICAgICAgICBsZXQgdGhlQ29sb3JTdHlsZVRvQ2hlY2sgPSBzdHlsZVRleHQucmVwbGFjZSgvLWNvbG9yL2csIFwiXCIpO1xuICAgICAgICBsZXQgaXNDb2xvclVzZWQgPSB0aGVDb2xvclN0eWxlVG9DaGVjay5tYXRjaCgvXFxiY29sb3JcXGIvaSk7XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNvbG9yXCIpIHx8IGlzQ29sb3JVc2VkIHx8IGlzQmdVc2VkKSB7XG4gICAgICAgICAgICBsZXQgZ29vZFRhZ05hbWVzID0ge1xuICAgICAgICAgICAgICAgIFwiZW1cIjogXCJcIiwgXCJzdHJvbmdcIjogXCJcIiwgXCJjaXRlXCI6IFwiXCIsIFwiZGZuXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJjb2RlXCI6IFwiXCIsIFwic2FtcFwiOiBcIlwiLCBcImtiZFwiOiBcIlwiLCBcInZhclwiOiBcIlwiLCBcImFiYnJcIjogXCJcIiwgXCJhY3JvbnltXCI6IFwiXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvbG9yIHVzZWQg77+9IGFyZSB0aGVyZSBzZW1hbnRpY3MgaW52b2x2ZWQ/XG4gICAgICAgICAgICBwYXNzZWQgPSBub2RlTmFtZSBpbiBnb29kVGFnTmFtZXMgfHxcbiAgICAgICAgICAgICAgICBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBnb29kVGFnTmFtZXMpICE9PSBudWxsO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQgJiYgcnVsZUNvbnRleHQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIGluIGdvb2RUYWdOYW1lcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJpZ2dlciBvbmx5IG9uY2VcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCB0cmlnZ2VyZWQgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2NvbG9yX21pc3VzZVwiLCBmYWxzZSk7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cmlnZ2VyZWQ7XG4gICAgICAgICAgICBzZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2NvbG9yX21pc3VzZVwiLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGdldERlZmluZWRTdHlsZXMgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5cbmV4cG9ydCBsZXQgc3R5bGVfZm9jdXNfdmlzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9mb2N1c192aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX0hpbmRlckZvY3VzMVwiOiB7XG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfZm9jdXNfdmlzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYHN0eWxlX2ZvY3VzX3Zpc2libGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGtleWJvYXJkIGZvY3VzIGluZGljYXRvciBtdXN0IGJlIGhpZ2hseSB2aXNpYmxlIHdoZW4gZGVmYXVsdCBib3JkZXIgb3Igb3V0bGluZSBpcyBtb2RpZmllZCBieSBDU1NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJDaGVjayB0aGUga2V5Ym9hcmQgZm9jdXMgaW5kaWNhdG9yIGlzIGhpZ2hseSB2aXNpYmxlIHdoZW4gdXNpbmcgQ1NTIGRlY2xhcmF0aW9uIGZvciAnYm9yZGVyJyBvciAnb3V0bGluZSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgbnVtOiBcIjIuNC43XCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHNraXBOb2Rlczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJ0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGVja1BhcmFtczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJib3JkZXJcIiwgXCJib3JkZXItd2lkdGhcIiwgXCJib3JkZXItY29sb3JcIiwgXCJib3JkZXItc3R5bGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvdXRsaW5lXCIsIFwib3V0bGluZS13aWR0aFwiLCBcIm91dGxpbmUtY29sb3JcIiwgXCJvdXRsaW5lLXN0eWxlXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIVJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkgfHwgdmFsaWRhdGVQYXJhbXMuc2tpcE5vZGVzLnZhbHVlLmluY2x1ZGVzKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXJyU3R5bGVzID0gW11cbiAgICAgICAgYXJyU3R5bGVzLnB1c2goZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCkpO1xuICAgICAgICBhcnJTdHlsZXMucHVzaChnZXREZWZpbmVkU3R5bGVzKHJ1bGVDb250ZXh0LCBcIjpmb2N1c1wiKSk7XG4gICAgICAgIGFyclN0eWxlcy5wdXNoKGdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQsIFwiOmZvY3VzLXZpc2libGVcIikpO1xuICAgICAgICBhcnJTdHlsZXMucHVzaChnZXREZWZpbmVkU3R5bGVzKHJ1bGVDb250ZXh0LCBcIjpmb2N1cy13aXRoaW5cIikpO1xuICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIGFyclN0eWxlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiB2YWxpZGF0ZVBhcmFtcy5jaGVja1BhcmFtcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbSBpbiBzdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IHN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbTpsaW5rLCBkb206KltzdHlsZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TdHlsZV9UcmlnZ2VyMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJDb25maXJtIFdpbmRvd3MgaGlnaCBjb250cmFzdCBtb2RlIGlzIHN1cHBvcnRlZCB3aGVuIHVzaW5nIENTUyB0byBpbmNsdWRlLCBwb3NpdGlvbiBvciBhbHRlciBub24tZGVjb3JhdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiV2luZG93cyBoaWdoIGNvbnRyYXN0IG1vZGUgbXVzdCBiZSBzdXBwb3J0ZWQgd2hlbiB1c2luZyBDU1MgdG8gaW5jbHVkZSwgcG9zaXRpb24gb3IgYWx0ZXIgbm9uLWRlY29yYXRpdmUgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiICYmXG4gICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSAhPT0gXCJzdHlsZXNoZWV0XCIpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAobm9kZU5hbWUgIT09IFwic3R5bGVcIiAmJiBub2RlTmFtZSAhPT0gXCJsaW5rXCIgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGxldCB0cmlnZ2VyZWQgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsIGZhbHNlKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRyaWdnZXJlZDtcbiAgICAgICAgLy8gICAgICAgIFBhY2thZ2VzLmphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4odHJpZ2dlcmVkKTtcbiAgICAgICAgc2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZVwiLCB0cnVlKTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHN0eWxlX2hvdmVyX3BlcnNpc3RlbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206KltzdHlsZV0sIGRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzJcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzNcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGhlIGhvdmVyOiBwc2V1ZG8tY2xhc3MgaXMgbm90IHVzZWQgdG8gZGlzcGxheSBjb250ZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcImNvbnRlbnQgZGlzcGxheWVkIHZpYSB0aGUgOmhvdmVyIHBzZXVkby1jbGFzcyBpcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgdHJpZ2dlciBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcImNvbnRlbnQgZGlzcGxheWVkIHZpYSB0aGUgOmhvdmVyIHBzZXVkby1jbGFzcyBpcyB0aGUgYWRqYWNlbnQgc2libGluZyBvZiB0aGUgdHJpZ2dlciBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ29uZmlybSB0aGUgcG9pbnRlciBjYW4gYmUgcG9zaXRpb25lZCBvdmVyIHRoZSBkaXNwbGF5ZWQgZWxlbWVudCwgbm90IGp1c3QgdGhlIHRyaWdnZXJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJDb25maXJtIHRoZSBwb2ludGVyIGNhbiBiZSBwb3NpdGlvbmVkIG92ZXIgYWxsIHRoZSBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgb24gaG92ZXJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzNcIjogXCJDb25maXJtIHRoZSBtYXJnaW4gc3R5bGUgYXR0cmlidXRlIGhhcyBub3QgcHJldmVudGVkIHRoZSBwb2ludGVyIGZyb20gaG92ZXJpbmcgb3ZlciB0aGUgZGlzcGxheWVkIGVsZW1lbnQsIG5vdCBqdXN0IHRoZSB0cmlnZ2VyXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHBvaW50ZXIgc2hvdWxkIGJlIGFibGUgdG8gbW92ZSBvdmVyIGNvbnRlbnQgZGlzcGxheWVkIG9uIGhvdmVyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjEzXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGxldCBwYXNzMCA9IGZhbHNlO1xuICAgICAgICBsZXQgcGFzczEgPSBmYWxzZTtcbiAgICAgICAgbGV0IHBhc3MyID0gZmFsc2U7IC8vIG5ldmVyIGhhcHBlblxuICAgICAgICBsZXQgcG90ZW50aWFsMSA9IGZhbHNlO1xuICAgICAgICBsZXQgcG90ZW50aWFsMiA9IGZhbHNlO1xuICAgICAgICBsZXQgcG90ZW50aWFsMyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJSVUxFIFJVTiAqKioqKioqKioqKioqKioqKipcIik7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGltcG9ydFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCA9IFwiK3J1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyArK3NJbmRleCkge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlcy5sZW5ndGggPSBcIitzdHlsZVJ1bGVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKipcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqKioqKioqIEZPUiBMT09QIHN0eWxlUnVsZUluZGV4ID0gXCIrc3R5bGVSdWxlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZEhvdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdmVyRWxlbWVudCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsdXNDb21iaW5hdG9yID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbGRlQ29tYmluYXRvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50SG92ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0VsZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGphY2VudFBsdXNTaWJsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkamFjZW50VGlsZGVNdWx0aXBsZVNpYmxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVUZXh0ID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZXNbXCIrc3R5bGVSdWxlSW5kZXgrXCJdID0gXCIrcnVsZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIENoZWNrIGZvciA6aG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3Zlci9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEhvdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxLiBmb3VuZCA6aG92ZXIgPSBcIisgZm91bmRIb3Zlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIEdldCBob3ZlciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyRWxlbWVudCA9IHJ1bGVUZXh0LnNwbGl0KFwiOlwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIyLiBmb3VuZCBlbGVtZW50IHRoYXQgZ29lcyB3aXRoIDpob3ZlciA9IFwiK2hvdmVyRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxLiBObyBob3ZlciBvbiBjc3MgZWxlbWVudCBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIG5vIDpob3ZlciBza2lwIHRoaXMgcnVsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzYS4gQ2hlY2sgZm9yIGNzcyBjb21iaW5hdG9yICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0YS4gaWYgc28gZG8gd2UgaGF2ZSBhbiBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c1RlbXBTdHIgPSBydWxlVGV4dC5zdWJzdHJpbmcocnVsZVRleHQuaW5kZXhPZihcIitcIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzVGVtcFN0ciA9IHBsdXNUZW1wU3RyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3ZlciBcXCsvZykgfHwgcnVsZVRleHQubWF0Y2goLzpob3ZlclxcKy9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzQ29tYmluYXRvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiM2EuIEZvdW5kIHBsdXNDb21iaW5hdG9yID0gXCIrIHBsdXNDb21iaW5hdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IHBsdXNUZW1wU3RyLnNwbGl0KFwiIFwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI0YS4gRm91bmQgcGx1cyBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gM2IuIENoZWNrIGZvciBjc3MgY29tYmluYXRvciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNGIuIGlmIHNvIGRvIHdlIGhhdmUgYW4gYWZ0ZXIgY29tYmluYXRvciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVUZXh0Lm1hdGNoKC86aG92ZXIgXFx+L2cpIHx8IHJ1bGVUZXh0Lm1hdGNoKC86aG92ZXJcXH4vZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJtYXRjaCA9IFwiK3J1bGVUZXh0Lm1hdGNoKFwiOmhvdmVyIFxcflwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGRlQ29tYmluYXRvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiM2IuIEZvdW5kIHRpbGRlQ29tYmluYXRvciA9IFwiKyB0aWxkZUNvbWJpbmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c1RlbXBTdHIgPSBydWxlVGV4dC5zdWJzdHJpbmcocnVsZVRleHQuaW5kZXhPZihcIn5cIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1c1RlbXBTdHIgPSBwbHVzVGVtcFN0ci50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBwbHVzVGVtcFN0ci5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNGIuIEZvdW5kIHRpbGRlIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIithZnRlckNvbWJpbmF0b3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsdXNDb21iaW5hdG9yICYmICF0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk8gcGx1c0NvbWJpbmF0b3Igb3IgdGlsZGVDb21iaW5hdG9yIHNvIHNraXAgdGhpcyBydWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1c0NvbWJpbmF0b3Igb3IgdGlsZGVDb21iaW5hdG9yIHNvIFBBU1NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBSRVBPUlQgUEFTUyAwIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTsgLy8gSkNIOiBzaG91bGQgd2UgaGF2ZSBhIE4vQSBwYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU28gbm93IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGhvdmVyIC0gZWxlbWVudDpob3ZlciBzbyB3ZSBoYXZlIHByb2JsZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2hlY2tcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuIENoZWNrIGlmIHRoZSBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnQgaGFzIGRpc3BsYXk6IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNi4gQ2hlY2sgaWYgZGlzcGxheSBwcm9wZXJ0eSBpcyBub3Qgbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbmRleCBvZiBkaXNwbGF5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBsdXNUZW1wU3RyID0gXCIrcGx1c1RlbXBTdHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBwbHVzVGVtcFN0ci5pbmRleE9mKFwiZGlzcGxheTpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI1LiBGb3VuZCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVzVGVtcFN0ci5zbGljZShpbmRleCArIDgpLnRyaW0oKS5zcGxpdChcIiBcIilbMF0gIT09IFwibm9uZTtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNi4gRm91bmQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IG5vbmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMCBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiYWQgY3NzIHNvIGl0IHdvbid0IGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiYWQgY3NzIHNvIGl0IHdvbid0IGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgc28gc2tpcCB0aGlzIHJ1bGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSB2ZXJpZmllZCB0aGF0IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGEgaG92ZXIgb2YgdGhlIGZvcm1hdCBzcGFuOmhvdmVyICsgZGl2IHsgZGlzcGxheTogYmxvY2s7IH0gd2l0aCBhbGwgdGhlIHByb3BlciBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgdmVyaWZpZWQgdGhhdCB3ZSBoYXZlIGEgY3NzIGVsZW1lbnQgd2l0aCBhIGhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBvZiB0aGUgZm9ybWF0IHNwYW46aG92ZXIgKyBkaXYgeyBkaXNwbGF5OiBibG9jazsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgd2l0aCBhbGwgdGhlIHByb3BlciBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlczIgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4MiA9IDA7IHN0eWxlUnVsZUluZGV4MiA8IHN0eWxlUnVsZXMyLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgyKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgcnVsZSBmb3IgYWZ0ZXJDb21pbmF0b3JFbGVtZW50OmhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGZpbmQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudDpob3ZlciBzZWUgaWYgcnVsZSBoYXMgcHJvcGVydHkgZGlzcGxheTogdmFsdWUgd2hlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgIT0gbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKipcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKioqKioqKiAybmQgRk9SIHN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlVGV4dDIgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4Ml0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydWxlVGV4dDIgPSBcIiwgcnVsZVRleHQyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGFsbCBzdXBwb3J0aW5nIGVsZW1lbnRzIGZvciBtYXJnaW4gcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmluZCBtYXJnaW4gU1RPUCBhbmQgUkVQT1JUIEVSUk9SXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWdFeFN0cmluZyA9IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgKyBcIiB7XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0cmltUnVsZVRleHQyID0gcnVsZVRleHQyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ0luZGV4ID0gdHJpbVJ1bGVUZXh0Mi5pbmRleE9mKHJlZ0V4U3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFmdGVyQ29tYmluYXRvckVsZW1lbnRQcm9wZXJ0aWVzID0gdHJpbVJ1bGVUZXh0Mi5zbGljZShyZWdJbmRleCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCFhZnRlckNvbWJpbmF0b3JFbGVtZW50UHJvcGVydGllcy5tYXRjaCgvbWFyZ2luL2cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJpbVJ1bGVUZXh0Mi5tYXRjaCgvbWFyZ2luL2cpKSB7ICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJObyBtYXJnaW4gcHJvYmxlbSBzbyBjb250aW51ZSBvbi4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHdlIGhhdmUgYSBzdXBwb3J0aW5nIGVsZW1lbnQgY3NzIGRlZmluaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudCA9IHJ1bGVUZXh0Mi5zcGxpdChcIjpcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXJFbGVtZW50ID0gc3VwcG9ydGluZ0hvdmVyRWxlbWVudC5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXJFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBORUVEIFRPIENIRUNLIEZPUiBhZnRlckNvbWluYXRvckVsZW1lbnQ6aG92ZXIgaW4gT05FIFNURVBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPT09IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgJiYgcnVsZVRleHQyLm1hdGNoKC86aG92ZXIvZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjcuIEZvdW5kIHN1cHBvcnRpbmcgaG92ZXIgZWxlbWVudCBzYW1lIGFzIGFmdGVyQ29tYmluYXRvckVsZW1lbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA3LiBGb3VuZCBzdXBwb3J0aW5nIGhvdmVyIGVsZW1lbnQgc2FtZSBhcyBhZnRlckNvbWJpbmF0b3JFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGluZ0VsZW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgc3VwcG9ydGluZyBlbGVtZW50IGhhdmUgaG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjguIFN1cHBvcnRpbmcgZWxlbWVudCBoYXMgaG92ZXIgYWxzbyA9IFwiKyBmb3VuZEhvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4LiBTdXBwb3J0aW5nIGVsZW1lbnQgaGFzIGhvdmVyIGFsc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHJ1bGVUZXh0Mi5pbmRleE9mKFwiZGlzcGxheTpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpbmRleCA9IFwiK2luZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOS4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI5LiBGb3VuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID0gXCIrc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVzVGVtcFN0ci5zbGljZShpbmRleCArIDgpLnRyaW0oKS5zcGxpdChcIiBcIilbMF0gIT09IFwibm9uZTtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAuIEZvdW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgbm90IG5vbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMC4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZSA9IFwiK3N1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGxpc3Qgb2YgaG92ZXIgZWxlbWVudHMgYW5kIG5leHQgc2libGluZyBmb3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yICsgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQURKQUNFTlQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVyRWxlbWVudCAhPT0gXCJcIiAmJiBwbHVzQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3ZlckVsZW1lbnRMaXN0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShob3ZlckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJob3ZlckVsZW1lbnRMaXN0Lmxlbmd0aCA9IFwiK2hvdmVyRWxlbWVudExpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudExpc3RbMF0udGFnTmFtZSA9IFwiK2hvdmVyRWxlbWVudExpc3RbMF0udGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGFkamFjZW50IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkFkamFjZW50IHNpYmxpbmcgPSBcIitob3ZlckVsZW1lbnRMaXN0WzBdLm5leHRFbGVtZW50U2libGluZy50YWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJDb21iaW5hdG9yRWxlbWVudC50b1VwcGVyQ2FzZSgpID09PSBob3ZlckVsZW1lbnRMaXN0WzBdLm5leHRFbGVtZW50U2libGluZy50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMTFhLiBIb3ZlciB3aXRoIHBsdXMgaGFzIGFkamFjZW50IHNpYmxpbmcuXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExYS4gSG92ZXIgd2l0aCBwbHVzIGhhcyBhZGphY2VudCBzaWJsaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFBsdXNTaWJsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHZlcmlmaWVkIGEgc3VwcG9ydGluZyBhZnRlckNvbWJpbmF0b3JFbGVtZW50IGNzcyBydWxlIHRoYXQgY29udGFpbnMgaG92ZXIgYW5kIGRpc3BsYXkgcHJvcGVydHkgdGhhdCBpcyBub3QgZXF1YWwgdG8gbm9uZSBhbmQgaGFzIGEgaG92ZXIgZWxlbWVudCBpbiB0aGUgYm9keSB3aXRoIGFuIGFkamFjZW50IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFJFUE9SVCBQQVNTIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzczAgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMWEuIE1haW4gaG92ZXIgd2l0aCArIGNvbWJpbmF0b3IgaGFzIG5vIGFkamFjZW50IHNpYmxpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsMSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBsaXN0IG9mIGhvdmVyIGVsZW1lbnRzIGFuZCBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIDIgb3IgbW9yZSBhZGphY2VudCBzaWJsaW5ncyBmb3IgflxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIH4gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQURKQUNFTlQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVyRWxlbWVudCAhPT0gXCJcIiAmJiB0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpID0gXCIraG92ZXJFbGVtZW50LnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3ZlckVsZW1lbnRMaXN0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJob3ZlckVsZW1lbnRMaXN0Lmxlbmd0aCA9IFwiK2hvdmVyRWxlbWVudExpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdHdvIG9yIG1vcmUgYWRqYWNlbnQgc2libGluZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZyA9IGhvdmVyRWxlbWVudExpc3RbMF0ubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzaWJsaW5nLnRhZ05hbWUgPSBcIitzaWJsaW5nLnRhZ05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZy50YWdOYW1lID09PSBhZnRlckNvbWJpbmF0b3JFbGVtZW50LnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goc2libGluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKChzaWJsaW5nID0gc2libGluZy5uZXh0RWxlbWVudFNpYmxpbmcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZ0NvdW50ID0gc2libGluZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic2libGluZ0NvdW50ID0gXCIrc2libGluZ0NvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKQ0ggVE9ETzogd2hhdCBpZiBzaWJsaW5nIGNvdW50IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZ0NvdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMTFiLiBIb3ZlciB3aXRoIHRpbGRlIGFuZCBvbmUgYWRqYWNlbnQgc2libGluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnRUaWxkZU11bHRpcGxlU2libGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBSRVBPUlQgUEFTUyAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpYmxpbmdDb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJNYWluIGhvdmVyIHdpdGggfiBjb21iaW5hdG9yIGhhcyB0d28gb3IgbW9yZSBzaWJsaW5nc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgaXMgc3RpbGwgZmFsc2UgPT4gcG90ZW50aWFsMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1cyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMiBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHJ1bGVzIG11c3QgaGF2ZSBhIGRpc3BsYXkgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1cyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyB0aWxkZSBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMiBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHJ1bGVzIG11c3QgaGF2ZSBhIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nRWxlbWVudCBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVJbmRleDIgPSBcIitzdHlsZVJ1bGVJbmRleDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlczIubGVuZ3RoID0gXCIrc3R5bGVSdWxlczIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN1cHBvcnRpbmdFbGVtZW50ID0gXCIrc3VwcG9ydGluZ0hvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAxIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdFbGVtZW50IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3VwcG9ydGluZ0VsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHRpbGRlIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUaGVyZSBpcyBhIG1hcmdpbiBpbiB0aGUgc3VwcG9ydGluZyBlbGVtZW50XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMyBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbDMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVuY2UgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczAgPSBcIitwYXNzMCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczEgPSBcIitwYXNzMSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczIgPSBcIitwYXNzMik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicG90ZW50aWFsMSA9IFwiK3BvdGVudGlhbDEpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBvdGVudGlhbDIgPSBcIitwb3RlbnRpYWwyKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwb3RlbnRpYWwzID0gXCIrcG90ZW50aWFsMyk7XG4gICAgICAgIGlmIChwYXNzMCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAocGFzczEpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTtcbiAgICAgICAgaWYgKHBhc3MyKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzNcIik7XG4gICAgICAgIGlmIChwb3RlbnRpYWwxKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICBpZiAocG90ZW50aWFsMikgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcbiAgICAgICAgaWYgKHBvdGVudGlhbDMpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzNcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG4vKipcbiAqIERlc2NyaXB0aW9uOiBUcmlnZ2VyIHdoZW4gdmlld3BvcnQgdW5pdHMgYXJlIHVzZWQgZm9yIGZvbnQgc2l6ZS5cbiAqIE9yaWdpbjogVmFyaW91c1xuICovXG5leHBvcnQgbGV0IHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV92aWV3cG9ydF9yZXNpemFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpsaW5rLCBkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX1N0eWxlX1ZpZXdwb3J0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUZXh0IG11c3Qgc2NhbGUgdXAgdG8gMjAwJSB3aXRob3V0IGxvc3Mgb2YgY29udGVudCBvciBmdW5jdGlvbmFsaXR5XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGV4dCBzaXplZCB1c2luZyB2aWV3cG9ydCB1bml0cyBjYW4gYmUgcmVzaXplZCB1cCB0byAyMDAlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIxLjQuNFwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHRoZVBhdHRlcm4gPSAvXFxkKyh2d3x2aHx2bWlufHZtYXgpL2dpO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXRcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4ID0gMDsgcGFzc2VkICYmIHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUudHlwZSAmJiBydWxlLnR5cGUgPT09IDEgLyogQ1NTUnVsZS5TVFlMRV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gcnVsZSBhcyBDU1NTdHlsZVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlLnN0eWxlWydmb250U2l6ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbnRTaXplID0gc3R5bGVSdWxlLnN0eWxlWydmb250U2l6ZSddLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmb250U2l6ZS5tYXRjaCh0aGVQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFNpemUubGVuZ3RoICYmIGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbXBvcnQgcnVsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocnVsZS50eXBlICYmIHJ1bGUudHlwZSA9PT0gMyAvKiBDU1NSdWxlLklNUE9SVF9SVUxFICovICYmIChydWxlIGFzIENTU0ltcG9ydFJ1bGUpLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRSdWxlID0gcnVsZSBhcyBDU1NJbXBvcnRSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gaW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzID8gaW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzIDogaW1wb3J0UnVsZS5zdHlsZVNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydGVkUnVsZSA9IHJ1bGVzW3JJbmRleF0gYXMgYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZFJ1bGUudHlwZSAmJiBpbXBvcnRlZFJ1bGUudHlwZSA9PT0gMSAvKiBDU1NSdWxlLlNUWUxFX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZFJ1bGUuc3R5bGVbJ2ZvbnRTaXplJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9udFNpemUgPSBpbXBvcnRlZFJ1bGUuc3R5bGVbJ2ZvbnRTaXplJ10udHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZvbnRTaXplLm1hdGNoKHRoZVBhdHRlcm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb250U2l6ZS5sZW5ndGggJiYgZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZUZyb21MaW5rID0gcnVsZXNbckluZGV4XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHJ1bGVzIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUZyb21MaW5rLnR5cGUgJiYgcnVsZUZyb21MaW5rLnR5cGUgPT09IDEgLyogQ1NTUnVsZS5TVFlMRV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUZyb21MaW5rLnN0eWxlWydmb250U2l6ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbnRTaXplID0gcnVsZUZyb21MaW5rLnN0eWxlWydmb250U2l6ZSddLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmb250U2l6ZS5tYXRjaCh0aGVQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFNpemUubGVuZ3RoICYmIGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc3R5bGVWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgICAgIGlmIChzdHlsZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlUGF0dGVybiA9IC9mb250LXNpemU6XFxzKlxcZCsodnd8dmh8dm1pbnx2bWF4KS9naTtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBzdHlsZVZhbHVlLm1hdGNoKHN0eWxlUGF0dGVybik7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IGlzVGFibGVEZXNjZW5kYW50IH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgbGV0IHRhYmxlX2FyaWFfZGVzY2VuZGFudHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfYXJpYV9kZXNjZW5kYW50c1wiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTp0YWJsZSBkb206dHJbcm9sZV0sIGFyaWE6dGFibGUgZG9tOnRoW3JvbGVdLCBhcmlhOnRhYmxlIGRvbTp0ZFtyb2xlXSwgYXJpYTpncmlkIGRvbTp0cltyb2xlXSwgYXJpYTpncmlkIGRvbTp0aFtyb2xlXSwgYXJpYTpncmlkIGRvbTp0ZFtyb2xlXSwgYXJpYTp0cmVlZ3JpZCBkb206dHJbcm9sZV0sIGFyaWE6dHJlZWdyaWQgZG9tOnRoW3JvbGVdLCBhcmlhOnRyZWVncmlkIGRvbTp0ZFtyb2xlXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfYXJpYV9kZXNjZW5kYW50cy5odG1sXCIsXG4gICAgICAgICAgICBcImV4cGxpY2l0X3JvbGVcIjogXCJ0YWJsZV9hcmlhX2Rlc2NlbmRhbnRzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUYWJsZSBzdHJ1Y3R1cmUgZWxlbWVudHMgY2Fubm90IHNwZWNpZnkgYW4gZXhwbGljaXQgJ3JvbGUnIHdpdGhpbiB0YWJsZSBjb250YWluZXJzXCIsXG4gICAgICAgICAgICBcImV4cGxpY2l0X3JvbGVcIjogXCJBbiBleHBsaWNpdCBBUklBICdyb2xlJyBpcyBub3QgdmFsaWQgZm9yIDx7MH0+IGVsZW1lbnQgd2l0aGluIGEgQVJJQSByb2xlICd7MX0nIHBlciB0aGUgQVJJQSBpbiBIVE1MIHNwZWNpZmljYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7IFxuICAgICAgICBsZXQgcGFyZW50Um9sZSA9IGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgIC8vIGNhY2hlIHRoZSByZXN1bHRcbiAgICAgICAgaWYgKHBhcmVudFJvbGUgPT09IG51bGwgfHwgcGFyZW50Um9sZS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZXhwbGljaXRfcm9sZVwiLCBbY29udGV4dFtcImRvbVwiXS5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHBhcmVudFJvbGVbMF0ucm9sZV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgdGFibGVfY2FwdGlvbl9lbXB0eTogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9jYXB0aW9uX2VtcHR5XCIsXG4gICAgY29udGV4dDogXCJkb206Y2FwdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9DYXB0aW9uX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9jYXB0aW9uX2VtcHR5Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8dGFibGU+IGVsZW1lbnQgaGFzIGFuIGVtcHR5IDxjYXB0aW9uPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8Y2FwdGlvbj4gZWxlbWVudCBmb3IgYSA8dGFibGU+IGVsZW1lbnQgbXVzdCBjb250YWluIGRlc2NyaXB0aXZlIHRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHRhYmxlX2NhcHRpb25fbmVzdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206Y2FwdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9DYXB0aW9uX0luVGFibGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9jYXB0aW9uX25lc3RlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9jYXB0aW9uX25lc3RlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIjxjYXB0aW9uPiBlbGVtZW50IGlzIG5vdCBuZXN0ZWQgaW5zaWRlIGEgPHRhYmxlPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxjYXB0aW9uPiBlbGVtZW50IG11c3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgYXNzb2NpYXRlZCA8dGFibGU+IGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwidGFibGVcIikgIT0gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgdGFibGVfaGVhZGVyc19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfaGVhZGVyc19leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1RhYmxlX0RhdGFIZWFkaW5nc0FyaWFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9oZWFkZXJzX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRhYmxlIGhhcyBubyBoZWFkZXJzIGlkZW50aWZpZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJEYXRhIHRhYmxlIG11c3QgaWRlbnRpZnkgaGVhZGVyc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTFRhYmxlRWxlbWVudDtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxheW91dCB0YWJsZSBvciB0aGVyZSBhcmUgbm8gcm93cywgdGhlIHJ1bGUgZG9lcyBub3QgYXBwbHkuXG4gICAgICAgIGxldCByb3dzID0gcnVsZUNvbnRleHQucm93cztcbiAgICAgICAgaWYgKCFSUFRVdGlsLmlzRGF0YVRhYmxlKHJ1bGVDb250ZXh0KSB8fCByb3dzID09PSBudWxsIHx8IHJvd3MubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwudGFibGVIZWFkZXJFeGlzdHMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFzc2VkID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcblxuZXhwb3J0IGxldCB0YWJsZV9oZWFkZXJzX3JlZl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRkW2hlYWRlcnNdLCBkb206dGhbaGVhZGVyc11cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSAnaGVhZGVycycgYXR0cmlidXRlIHZhbHVlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IHJlZmVyZW5jZSBhIHZhbGlkICdpZCcgaW4gdGhpcyBkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiByZWZlcnMgdG8gaXRzZWxmXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlRoZSAnaGVhZGVycycgYXR0cmlidXRlIHZhbHVlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IHJlZmVyIHRvIGEgY2VsbCBpbiB0aGUgc2FtZSB0YWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCByZWZlciB0byBhIGNlbGwgaW5kaWNhdGVkIHdpdGggPHRoPiBvciBhIHJvbGUgb2YgXFxcImNvbHVtbmhlYWRlclxcXCIgb3IgXFxcInJvd2hlYWRlclxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSBzaG91bGQgcmVmZXIgdG8gYSB2YWxpZCBjZWxsIGluIHRoZSBzYW1lIHRhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXCJhMjVmNDVcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhcmVudFRhYmxlID0gUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJ0YWJsZVwiKTtcbiAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocGFyZW50VGFibGUpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGF5b3V0IHRhYmxlIG9yIGEgc2ltcGxlIHRhYmxlIHRoZSBydWxlIGRvZXMgbm90IGFwcGx5LlxuICAgICAgICBpZiAocGFyZW50VGFibGUgPT0gbnVsbCB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBhcmVudFRhYmxlKSB8fCAhW1widGFibGVcIiwgXCJncmlkXCJdLmluY2x1ZGVzKHBhcmVudFJvbGUpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCB2YWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhlYWRlcnNcIik7XG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgaWRzID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xuICAgICAgICBsZXQgaW52YWxpZEhlYWRlclZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgc2FtZU5vZGVIZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IHNhbWVUYWJsZUhlYWRlclZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBpZCA9IGlkc1tpXTtcbiAgICAgICAgICAgIGlmIChpZC50cmltKCkgPT09ICcnKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICAgICAgaWYgKCFlbGVtKVxuICAgICAgICAgICAgICAgIGludmFsaWRIZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICBlbHNlIGlmIChET01VdGlsLnNhbWVOb2RlKGVsZW0sIHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICBzYW1lTm9kZUhlYWRlclZhbHVlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCFET01VdGlsLmlzSW5TYW1lVGFibGUoZWxlbSwgcnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHNhbWVUYWJsZUhlYWRlclZhbHVlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbU5hbWUgIT09ICd0aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKGVsZW0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJvbGVzLmluY2x1ZGVzKCdjb2x1bW5oZWFkZXInKSAmJiAhcm9sZXMuaW5jbHVkZXMoJ3Jvd2hlYWRlcicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgaWYgKGludmFsaWRIZWFkZXJWYWx1ZXMubGVuZ3RoICE9IDApXG4gICAgICAgICAgICByZXN1bHRzLnB1c2goUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2ludmFsaWRIZWFkZXJWYWx1ZXMudG9TdHJpbmcoKV0pKTtcbiAgICAgICAgaWYgKHNhbWVOb2RlSGVhZGVyVmFsdWVzLmxlbmd0aCAhPSAwKVxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtzYW1lTm9kZUhlYWRlclZhbHVlcy50b1N0cmluZygpXSkpO1xuICAgICAgICBpZiAoc2FtZVRhYmxlSGVhZGVyVmFsdWVzLmxlbmd0aCAhPSAwKVxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFJ1bGVGYWlsKFwiRmFpbF8zXCIsIFtzYW1lVGFibGVIZWFkZXJWYWx1ZXMudG9TdHJpbmcoKV0pKTtcbiAgICAgICAgaWYgKGludmFsaWRFbGVtSGVhZGVyVmFsdWVzLmxlbmd0aCAhPSAwKVxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFJ1bGVGYWlsKFwiRmFpbF80XCIsIFtpbnZhbGlkRWxlbUhlYWRlclZhbHVlcy50b1N0cmluZygpXSkpO1xuXG4gICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCB0YWJsZV9oZWFkZXJzX3JlbGF0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206dGQsIGRvbTp0aFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9UYWJsZV9EYXRhQ2VsbFJlbGF0aW9uc2hpcHNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkNvbXBsZXggdGFibGUgZG9lcyBub3QgaGF2ZSBoZWFkZXJzIGZvciBlYWNoIGNlbGwgcHJvcGVybHkgZGVmaW5lZCB3aXRoICdoZWFkZXInIG9yICdzY29wZSdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJGb3IgYSBjb21wbGV4IGRhdGEgdGFibGUsIGFsbCA8dGg+IGFuZCA8dGQ+IGVsZW1lbnRzIG11c3QgYmUgcmVsYXRlZCB2aWEgJ2hlYWRlcicgb3IgJ3Njb3BlJyBhdHRyaWJ1dGVzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFyZW50VGFibGUgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGF5b3V0IHRhYmxlIG9yIGEgc2ltcGxlIHRhYmxlIHRoZSBydWxlIGRvZXMgbm90IGFwcGx5LlxuICAgICAgICBpZiAocGFyZW50VGFibGUgPT0gbnVsbCB8fCAhUlBUVXRpbC5pc0NvbXBsZXhEYXRhVGFibGUocGFyZW50VGFibGUpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gSWYgdGhpcyB0YWJsZSBoYXNuJ3QgYmVlbiBwcmVwcm9jZXNzZWQsIHByb2Nlc3MgaXQuXG4gICAgICAgIGlmIChnZXRDYWNoZShydWxlQ29udGV4dCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEJ1aWxkIGEgZ3JpZCB0aGF0J3MgYWN0dWFsbHkgdXNhYmxlIChyb3dzcGFuIGFuZCBjb2xzcGFuIGVsZW1lbnRzIGFyZSBkdXBsaWNhdGVkKVxuICAgICAgICAgICAgLy8gVGhpcyBidWlsZHMgYSByZWFsIDJkIHRhYmxlIGFycmF5LlxuICAgICAgICAgICAgbGV0IGdyaWQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyZW50VGFibGUucm93cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxldCByb3cgPSBwYXJlbnRUYWJsZS5yb3dzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghZ3JpZFtpXSkgZ3JpZFtpXSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93LmNlbGxzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93LmNlbGxzW2pdO1xuICAgICAgICAgICAgICAgICAgICBzZXRDYWNoZShjZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBpICsgXCI6XCIgKyBqKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aWR0aCkgd2lkdGggPSAxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoZWlnaHQpIGhlaWdodCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGxldCBnWCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChncmlkW2ldW2dYXSkgZ1ggKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZWlnaHQ7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncmlkW2kgKyBrXSkgZ3JpZFtpICsga10gPSBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCB3aWR0aDsgKytsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFtpICsga11bZ1ggKyBsXSA9IGNlbGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdGFibGUgZ3JpZCBhbmQgcmVjb3JkIGhlYWRlcnMgdGhhdCBwb2ludCB0byBjZWxscyBhbmRcbiAgICAgICAgICAgIC8vIGNlbGxzIHRoYXQgYXJlIHBvaW50ZWQgdG8gYnkgaGVhZGVyc1xuICAgICAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICBsZXQgbG9va3VwID0ge31cbiAgICAgICAgICAgIGxldCBzY29wZWRDb2xzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyaWQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm93U2NvcGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBncmlkW2ldLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmlkQ2VsbCA9IGdyaWRbaV1bal07XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmlkTm9kZU5hbWUgPSBncmlkQ2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZE5vZGVOYW1lID09IFwidGhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWRDZWxsLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09IFwicm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTY29wZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXhpcyBhdHRyaWJ1dGUsIGl0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY29wZSBpcyBub3QgZW5vdWdoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShncmlkQ2VsbCwgXCJheGlzXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbZ2V0Q2FjaGUoZ3JpZENlbGwsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyaWRDZWxsLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09IFwiY29sXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRDb2xzW2pdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGF4aXMgYXR0cmlidXRlLCBpdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NvcGUgaXMgbm90IGVub3VnaC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiYXhpc1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW2dldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVycyBjYW4gcmVmZXIgdG8gb3RoZXIgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZHJzID0gZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHJzLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkRWxlbSA9IGRvYy5nZXRFbGVtZW50QnlJZChoZHJzW2tdLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkRWxlbSAmJiBSUFRVdGlsLmdldEFuY2VzdG9yKGhlYWRFbGVtLCBcInRhYmxlXCIpID09IHBhcmVudFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbZ2V0Q2FjaGUoaGVhZEVsZW0sIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JpZE5vZGVOYW1lID09IFwidGRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvd1Njb3BlZCB8fCBzY29wZWRDb2xzW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW2dldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGdyaWRDZWxsLCBcImhlYWRlcnNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGRycyA9IGdyaWRDZWxsLmdldEF0dHJpYnV0ZShcImhlYWRlcnNcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGRycy5sZW5ndGg7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZEVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaGRyc1trXS50cmltKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZEVsZW0gJiYgUlBUVXRpbC5nZXRBbmNlc3RvcihoZWFkRWxlbSwgXCJ0YWJsZVwiKSA9PSBwYXJlbnRUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW2dldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW2dldENhY2hlKGhlYWRFbGVtLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIGxvb2t1cCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmNJbmZvID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpO1xuICAgICAgICBsZXQgdEluZm8gPSBnZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSByY0luZm8gIT09IG51bGwgJiYgdEluZm8gIT09IG51bGwgJiYgcmNJbmZvIGluIHRJbmZvO1xuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHJjSW5mbyA9PT0gXCIwOjBcIiAmJlxuICAgICAgICAgICAgUlBUVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3QgdGVzdCBpZiBpdCdzIHRoZSB1cHBlci1sZWZ0IGNlbGwgYW5kIGl0J3MgZW1wdHlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHRhYmxlIGhhcyBubyB0aCdzLCBpdCBtYXkganVzdCBiZSB0aGF0IHRoaXMgd2FzIHN1cHBvc2VkIHRvIGJlIGEgbGF5b3V0XG4gICAgICAgIC8vIHRhYmxlLCB3aGljaCBpbnRyb2R1Y2VzIGEgbG90IG9mIG5vaXNlLiAgSW4gdGhhdCBjYXNlLCBvbmx5IHRyaWdnZXIgdGhpcyBlcnJvclxuICAgICAgICAvLyBvbmNlIHBlciB0YWJsZS5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgcGFyZW50VGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0aFwiKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgaWYgKGdldENhY2hlKHBhcmVudFRhYmxlLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZF9UcmlnT25jZVwiLCBmYWxzZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRfVHJpZ09uY2VcIiwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCB0YWJsZV9sYXlvdXRfbGluZWFyaXplZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGFibGVfTGF5b3V0VHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGFibGVfbGF5b3V0X2xpbmVhcml6ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2xheW91dF9saW5lYXJpemVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGFibGUgaXMgbm90IGJlaW5nIHVzZWQgdG8gZm9ybWF0IHRleHQgY29udGVudCBpbiBjb2x1bW5zIHVubGVzcyB0aGUgdGFibGUgY2FuIGJlIGxpbmVhcml6ZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdm9pZCB1c2luZyB0YWJsZXMgdG8gZm9ybWF0IHRleHQgZG9jdW1lbnRzIGluIGNvbHVtbnMgdW5sZXNzIHRoZSB0YWJsZSBjYW4gYmUgbGluZWFyaXplZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gIVJQVFV0aWwuaXNMYXlvdXRUYWJsZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgdGFibGVfc2NvcGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfc2NvcGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTp0ZFtzY29wZV0sIGRvbTp0aFtzY29wZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9UYWJsZV9TY29wZV9WYWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX3Njb3BlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwidGFibGVfc2NvcGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX3Njb3BlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVmFsdWUgcHJvdmlkZWQgaXMgaW52YWxpZCBmb3IgdGhlICdzY29wZScgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSAnc2NvcGUnIGF0dHJpYnV0ZSBzaG91bGQgb25seSBiZSB1c2VkIG9uIGEgPHRoPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVmFsdWUgZm9yICdzY29wZScgYXR0cmlidXRlIG11c3QgYmUgXFxcInJvd1xcXCIsIFxcXCJjb2xcXFwiLCBcXFwicm93Z3JvdXBcXFwiLCBvciBcXFwiY29sZ3JvdXBcXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3RkJylcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcblxuICAgICAgICAvL29ubHkgY29udGludWUgZm9yICd0aCdcbiAgICAgICAgbGV0IHNjb3BlVmFsID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic2NvcGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSAvXihyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKSQvLnRlc3Qoc2NvcGVWYWwpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCB0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RhYmxlX1N0cnVjdHVyZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgd2l0aCBcXFwicHJlc2VudGF0aW9uXFxcIiByb2xlIG9yIFxcXCJub25lXFxcIiByb2xlIGhhcyBzdHJ1Y3R1cmFsIGVsZW1lbnQocykgYW5kL29yIGF0dHJpYnV0ZShzKSAnezF9J1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRhYmxlIGVsZW1lbnRzIHdpdGggJ3JvbGU9XFxcInByZXNlbnRhdGlvblxcXCIgb3IgJ3JvbGU9XFxcIm5vbmVcXFwiIHNob3VsZCBub3QgaGF2ZSBzdHJ1Y3R1cmFsIGVsZW1lbnRzIG9yIGF0dHJpYnV0ZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmIChSUFRVdGlsLmlzRGF0YVRhYmxlKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChSUFRVdGlsLmlzTm9kZUluR3JpZChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBlcnJvck5vZGVzID0gW107XG4gICAgICAgIGlmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInN1bW1hcnlcIikpXG4gICAgICAgICAgICBlcnJvck5vZGVzLnB1c2gocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCBjYXB0aW9uRWxlbXMgPSBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNhcHRpb25cIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FwdGlvbkVsZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3RvcihjYXB0aW9uRWxlbXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4oY2FwdGlvbkVsZW1zW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGVycm9yTm9kZXNcbiAgICAgICAgICAgICAgICBlcnJvck5vZGVzLnB1c2goY2FwdGlvbkVsZW1zW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0aE5vZGVzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0aFwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aE5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3Rvcih0aE5vZGVzW2ldLCBcInRhYmxlXCIpID09IHJ1bGVDb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QgYmFzZWQgb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgYW5kIGlmIHRoZSBub2RlIGlzVmlzaWJsZSBvclxuICAgICAgICAgICAgICAgIC8vIG5vdC5cbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHRoTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgZXJyb3JOb2Rlc1xuICAgICAgICAgICAgICAgIGVycm9yTm9kZXMucHVzaCh0aE5vZGVzW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdGROb2RlcyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGRcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCh0ZE5vZGVzW2ldLmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpIHx8IHRkTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSkgJiZcbiAgICAgICAgICAgICAgICBSUFRVdGlsLmdldEFuY2VzdG9yKHRkTm9kZXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4odGROb2Rlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBub2RlIHRvIHRoZSBlcnJvck5vZGVzXG4gICAgICAgICAgICAgICAgZXJyb3JOb2Rlcy5wdXNoKHRkTm9kZXNbaV0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIG5vdCBhY3R1YWxseSBtYWtpbmcgdXNlIG9mIHRoZXNlcyBlcnJvck5vZGVzIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHBhc3NlZCBhbG9uZyB3aXRoXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGlvblJlc3VsdCwgd2UgZG8gbm90IG5lZWQgdG8ga2VlcCBsb29waW5nIG92ZXIgYW5kIGdldHRpbmcgZXZlcnkgc2luZ2xlIHZpb2xhdGluZyBub2RlIHVuZGVyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJ1bGUgY29udGV4dC4gVGhpcyBjYW4gYmUgYSBmdXR1cmUgZW5oYW5jZW5tZW50IHdoZXJlIHdlIGFjdHVhbGx5IG1ha2UgdXNlIG9mIHRoZSBlcnJvciBub2RlcyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gYXJlIHBhc3NlZCBhbG9uZy4gQWRkaW5nIHRoaXMgYnJlYWsgdG8gc3BlZWQgdXAgcGVyZm9ybWFuY2UgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgICAgICBicmVhazsgLy8gVGhlcmUgaXMgbm8gcG9pbnQgdG8ga2VlcCBhZGRpbmcgdGhlIGVycm9yIG5vZGVzLCBzdG9wIGFmdGVyIGZpbmRpbmcgdGhlIGZpcnN0IG9uZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBub2RlIG5hbWUgZm9yIHRoZSBydWxlIGNvbnRleHQgZWxlbWVudCBpbiB0aGlzIGNhc2UgaXQgd2lsbCBhbHdheXMgYmUgdGFibGVcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50VG9rZW4gPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhIG5ldyBhcnJheSB3aGljaCB3aWxsIGNvbnRhbiBvbmx5IHRoZSBlbGVtZW50IHRhZyBmb3IgdGhlIHZpb2xhdGlvbiBlbGVtZW50c1xuICAgICAgICBsZXQgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYSBzZWVuIGhhc2ggdGhhdCB3aWxsIGtlZXAgdHJhc2sgb2YgYWxsIHRoZSBlbGVtZW50cyB0aGF0IHdlcmUgYWxyZWFkeSBhZGRlZCB0byB0aGUgdG9rZW4gYXJyYXksIHRvIG1ha2Ugc3VyZVxuICAgICAgICAvLyB3ZSBkbyBub3QgZHVwbGljYXRlIGFueSBvZiB0aGUgZWxlbWVudHMuIER1cGxpY2F0ZSBlbGVtZW50IHRhZ3MgaW4gdGhlIHRva2VuIG1lc3NhZ2UgbG9va3MgYmFkIGFuZCBjb25mdXNpbmcuXG4gICAgICAgIGxldCBzZWVuID0ge307XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgdmlvbGF0aW5nIHN0cnVjdHVyYWwgZWxlbWVudHMgYW5kIGV4dHJhY3QgdGhlIGVsZW1lbnQgdGFnIHRvIGJlIHVzZWQgYXMgYSB0b2tlblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9yTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBuYW1lICh0YWcgbmFtZSkgZm9yIHRoZSB2aW9sYXRpbmcgc3RydWN0dXJhbCBlbGVtZW50XG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBlcnJvck5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgbmVlZCB0byBhZGQgdGhlIHZpb2xhdGluZyBlbGVtZW50IG9uY2VcbiAgICAgICAgICAgIGlmICghc2Vlbi5oYXNPd25Qcm9wZXJ0eShub2RlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgYWRkaW5nIHRoZSB0b2tlbiBhcyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB3ZSBuZWVkIHRvIGhhbmRsZVxuICAgICAgICAgICAgICAgIC8vIHRoZSBzdW1tYXJ5IGF0dHJpYnV0ZSBvbiB0aGUgcnVsZUNvbnRleHQgKHRhYmxlKS4gV2Ugb25seSBhZGQgc3VtbWFyeSBvbmNlLCBzYW1lIGFzXG4gICAgICAgICAgICAgICAgLy8gZm9yIGVsZW1lbnRzIHRvIGF2b2lkIGR1cGxpY2F0aW9uIGluIHRoZSBtZXNzYWdlLiAoU3VtbWFyeSBzaG91bGQgbm90IGR1cGxpY2F0ZSwgYnV0IGp1c3QgaW4gY2FzZSlcbiAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJ0YWJsZVwiICYmICFzZWVuLmhhc093blByb3BlcnR5W1wic3VtbWFyeVwiXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIHNlZW5bXCJzdW1tYXJ5XCJdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIGEgbmV3IHZpb2xhdGluZyBlbGVtZW50IGFkZCBpdCB0byB0aGUgc3RydWN0dXJhbCBlbGVtZW50IHRva2VucyBhcnJheVxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsRWxlbWVudFRva2Vucy5wdXNoKFwic3VtbWFyeVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBzZWVuW25vZGVOYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIG5ldyB2aW9sYXRpbmcgZWxlbWVudCBhZGQgaXQgdG8gdGhlIHN0cnVjdHVyYWwgZWxlbWVudCB0b2tlbnMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMucHVzaChub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB0YWtlIHRoZSBhcnJheSBvZiBzdHJ1Y3R1cmFsIGVsZW1lbnRzIGFuZCBqb2luIHRoZW0gd2l0aCBhIGNvbW1hIGFuZCBhIHNwYWNlIHRvIG1ha2UgZ3JhbW1hdGljYWwgY29ycmVjdCBpblxuICAgICAgICAvLyB0aGUgbWVzc2FnZS5cbiAgICAgICAgbGV0IHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyID0gc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMuam9pbihcIiwgXCIpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KGVycm9yTm9kZXMubGVuZ3RoID09IDAsIGVycm9yTm9kZXMsICcnLCAnJywgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zXSk7XG4gICAgICAgIGlmIChlcnJvck5vZGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyXSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBsZXQgdGFibGVfc3VtbWFyeV9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfc3VtbWFyeV9yZWR1bmRhbnRcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RhYmxlX0NhcFN1bW1SZWR1bmRhbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSB0YWJsZSBzdW1tYXJ5IGR1cGxpY2F0ZXMgdGhlIGNhcHRpb25cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgdGFibGUgc3VtbWFyeSBtdXN0IG5vdCBkdXBsaWNhdGUgdGhlIGNhcHRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBvZklkO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHN1bVN0cjtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN1bW1hcnlcIikpIHtcbiAgICAgICAgICAgIHBvZklkID0gMDtcbiAgICAgICAgICAgIHN1bVN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN1bW1hcnlcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiKSkge1xuICAgICAgICAgICAgcG9mSWQgPSAxO1xuICAgICAgICAgICAgbGV0IHN1bW1hcnlOb2RlSWRzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGVDb25jYXQgPSBcIlwiO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdW1tYXJ5Tm9kZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBzdW1tYXJ5Tm9kZUlkID0gc3VtbWFyeU5vZGVJZHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHN1bW1hcnlOb2RlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN1bW1hcnlOb2RlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIHN1bW1hcnlOb2RlSWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3VtbWFyeU5vZGUgJiYgIURPTVV0aWwuc2FtZU5vZGUoc3VtbWFyeU5vZGUscnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5Tm9kZUNvbmNhdCArPSBcIiBcIiArIFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHN1bW1hcnlOb2RlKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1bVN0ciA9IHN1bW1hcnlOb2RlQ29uY2F0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3VtU3RyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjYXBFbGVtcyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY2FwdGlvblwiKTtcbiAgICAgICAgICAgIGlmIChjYXBFbGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VtU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgY2FwU3RyID0gUlBUVXRpbC5nZXRJbm5lclRleHQoY2FwRWxlbXNbMF0pLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmICghc3VtU3RyLmluY2x1ZGVzKGNhcFN0cikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgbGV0IHRleHRfYmxvY2tfaGVhZGluZzogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X2Jsb2NrX2hlYWRpbmdcIixcbiAgICBjb250ZXh0OiBcImRvbTpwLCBkb206ZGl2LCBkb206YnJcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9CbG9ja19TaG91bGRCZUhlYWRpbmdcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGV4dF9ibG9ja19oZWFkaW5nLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJ0ZXh0X2Jsb2NrX2hlYWRpbmcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRleHRfYmxvY2tfaGVhZGluZy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ2hlY2sgaWYgdGhpcyB0ZXh0IHNob3VsZCBiZSBtYXJrZWQgdXAgYXMgYSBoZWFkaW5nOiB7MH1cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIZWFkaW5nIHRleHQgbXVzdCB1c2UgYSBoZWFkaW5nIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgbnVtV29yZHM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMTAsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBudW1Xb3JkcyA9IHZhbGlkYXRlUGFyYW1zLm51bVdvcmRzLnZhbHVlO1xuICAgICAgICBsZXQgd29yZHNTZWVuID0gMDtcbiAgICAgICAgbGV0IHdvcmRTdHI6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBlbXBoYXNpemVkVGV4dCA9IGZhbHNlO1xuICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiZcbiAgICAgICAgICAgIG53Lm5leHROb2RlKCkgJiZcbiAgICAgICAgICAgIG53Lm5vZGUgIT09IHJ1bGVDb250ZXh0ICYmXG4gICAgICAgICAgICBudy5ub2RlICE9PSBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCkgJiZcbiAgICAgICAgICAgICFbXCJiclwiLCBcImRpdlwiLCBcInBcIl0uaW5jbHVkZXMobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkgLy8gRG9uJ3QgcmVwb3J0IHR3aWNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBud05hbWUgPSBudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoKG53TmFtZSA9PSBcImJcIiB8fCBud05hbWUgPT0gXCJlbVwiIHx8IG53TmFtZSA9PSBcImlcIiB8fFxuICAgICAgICAgICAgICAgIG53TmFtZSA9PSBcInN0cm9uZ1wiIHx8IG53TmFtZSA9PSBcInVcIiB8fCBud05hbWUgPT0gXCJmb250XCIpICYmICFSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4obncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFN0ciA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KG53Lm5vZGUpO1xuICAgICAgICAgICAgICAgIGxldCB3YyA9IFJQVFV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgIGlmICh3YyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgd29yZFN0ci5wdXNoKG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHdvcmRzU2VlbiArPSB3YztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIG5vZGUgYmVjYXVzZSBpdCdzIGVtcGhhc2l6ZWRcbiAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwiYWx0XCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAobndOYW1lID09IFwiYXBwbGV0XCIgfHwgbndOYW1lID09IFwiZW1iZWRcIiB8fCBud05hbWUgPT0gXCJpbWdcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChud05hbWUgPT09IFwiaW5wdXRcIiAmJiBudy5lbGVtKCkuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJiBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PSBcImltYWdlXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfHwgKG53TmFtZSA9PT0gXCIjdGV4dFwiICYmIG53Lm5vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAvLyBHaXZlIHRoZW0gdGhlIGJlbmVmaXQgb2YgdGhlIGRvdWJ0IGlmIHRoZXJlJ3MgYSBsaW5rXG4gICAgICAgICAgICAgICAgICAgIHx8IChud05hbWUgPT09IFwiYVwiICYmIG53LmVsZW0oKS5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpICYmIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJocmVmXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod29yZHNTZWVuID09IDApIHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiLCBbd29yZFN0ci5qb2luKFwiIFwiKV0pO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBDb2xvclV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0NvbG9yVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbi8vaW1wb3J0IHsgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IGdldFdlaWdodE51bWJlciwgZ2V0Rm9udEluUGl4ZWxzIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuXG5leHBvcnQgbGV0IHRleHRfY29udHJhc3Rfc3VmZmljaWVudDogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJJQk1BX0NvbG9yX0NvbnRyYXN0X1dDQUcyQUFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsX3NhbWVfY29sb3JcIlxuICAgICAgICB9LFxuICAgICAgICBcIklCTUFfQ29sb3JfQ29udHJhc3RfV0NBRzJBQV9QVlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHRleHRfY29udHJhc3Rfc3VmZmljaWVudC5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9zYW1lX2NvbG9yXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIjogYHRleHRfY29udHJhc3Rfc3VmZmljaWVudC5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX3RleHRfc2hhZG93XCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRleHQgd2l0aCBpdHMgYmFja2dyb3VuZCBtdXN0IG1lZXQgV0NBRyAyLjEgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRleHQgY29udHJhc3Qgb2YgezB9IHdpdGggaXRzIGJhY2tncm91bmQgaXMgbGVzcyB0aGFuIHRoZSBXQ0FHIEFBIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciB0ZXh0IG9mIHNpemUgezF9cHggYW5kIHdlaWdodCBvZiB7Mn1cIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX3NhbWVfY29sb3JcIjogXCJUaGUgZm9yZWdyb3VuZCB0ZXh0IGFuZCBpdHMgYmFja2dyb3VuZCBjb2xvciBhcmUgYm90aCBkZXRlY3RlZCBhcyB7M30uIFZlcmlmeSB0aGUgdGV4dCBtZWV0cyB0aGUgV0NBRyAyLjEgQUEgcmVxdWlyZW1lbnRzIGZvciBtaW5pbXVtIGNvbnRyYXN0XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IGFnYWluc3QgdGhlIGxpZ2h0ZXN0IGFuZCB0aGUgZGFya2VzdCBjb2xvcnMgb2YgdGhlIGJhY2tncm91bmQgbWVldHMgdGhlIFdDQUcgMi4xIEFBIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciB0ZXh0IG9mIHNpemUgezF9cHggYW5kIHdlaWdodCBvZiB7Mn1cIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX3RleHRfc2hhZG93XCI6IFwiVmVyaWZ5IHRoZSBjb250cmFzdCByYXRpbyBvZiB0aGUgdGV4dCB3aXRoIHNoYWRvdyBtZWV0cyB0aGUgV0NBRyAyLjEgQUEgbWluaW11bSByZXF1aXJlbWVudHMgZm9yIHRleHQgb2Ygc2l6ZSB7MX1weCBhbmQgd2VpZ2h0IG9mIHsyfVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMS40LjNcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFsnYWZ3NGY3J10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIGF2b2lkIGRpYWdub3NpbmcgZWxlbWVudHMgdGhhdCBhcmUgbm90IHZpc2libGVcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8XG4gICAgICAgICAgICAoVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cyAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cyAhPSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluZGV4T2Yobm9kZU5hbWUpID4gLTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy9UT0RPID8gc2hvdWxkIG9ubHkgY29uc2lkZXIgbmF0aXZlIGRpc2FibGVkLCBpZ25vcmUgYXJpYS1kaXNhYmxlZFxuICAgICAgICAvL3NraXAgZGlzYWJsZWQgZWxlbWVudFxuICAgICAgICBpZiAoUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgZWxlbWVudHNcbiAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInN2Z1wiLCBcInNjcmlwdFwiLCBcIm1ldGFcIl0pKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBsZXQgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuICAgICAgICBpZiAoIXdpbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHQuXG4gICAgICAgIGxldCBjaGlsZFN0ciA9IFJQVFV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFSUFRVdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpIHx8IChSUFRVdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpICYmIFJQVFV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQuc2hhZG93Um9vdCkgPT09ICcnKSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT0gMCApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgdGV4dCBkb2VzIG5vdCBjb252ZXkgYW55dGhpbmcgaW4gaHVtYW4gbGFuZ3VhZ2VcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqICgxKSBpZ25vcmUgbm9uLWFscGhhbnVtZXJpYyBvciBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gQVNDSTogXihhLXpBLVpcXGRcXHMpXG4gICAgICAgICAgICAgKiAoMikgaWdub3JlIG5vbi1wcmludGFibGUgdW5pY29kZSBjaGFyYWN0ZXJzOiBcXHUwMDAwLVxcdTAwMDhcXHUwMDBCLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHUyMDVGLVxcdTIwNkZcXHUzMDAwXFx1RkVGRlxuICAgICAgICAgICAgICogIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzcwMTE3L3doYXQtaXMtdGhlLXJhbmdlLW9mLXVuaWNvZGUtcHJpbnRhYmxlLWNoYXJhY3RlcnNcbiAgICAgICAgICAgICAqICgzKSBmb3Igbm93IG5vdCBjb25zaWRlciB1bmljb2RlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IGFyZSBkaWZmZXJlbnQgaW4gZGlmZmVyZW50IGxhbmd1YWdlc1xuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGxldCByZWdleCA9IC9bXihhLXpBLVpcXGRcXHMpXFx1MDAwMC1cXHUwMDA4XFx1MDAwQi1cXHUwMDFGXFx1MDA3Ri1cXHUwMDlGXFx1MjAwMC1cXHUyMDBGXFx1MjAyOC1cXHUyMDJGXFx1MjA1Ri1cXHUyMDZGXFx1MzAwMFxcdUZFRkZdKy9nO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGNoaWxkU3RyLnRyaW0oKS5yZXBsYWNlKHJlZ2V4LCAnJyk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZC50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVsZW0gPSBydWxlQ29udGV4dDtcbiAgICAgICAgLy8gdGhlIGNoaWxkIGVsZW1lbnRzIChyYXRoZXIgdGhhbiBzaGFkb3cgcm9vdCkgb2YgYSBzaGFkb3cgaG9zdCBpcyBlaXRoZXIgcmUtYXNzaWduZWQgdG8gdGhlIHNoYWRvdyBzbG90IGlmIHRoZSBzbG90IGV4aXN0cyBcbiAgICAgICAgLy8gb3Igbm90IGRpc3BsYXllZCwgc28gc2hvdWxkbid0IGJlIGNoZWNrZWQgZnJvbSB0aGUgbGlnaHQgRE9NLCByYXRoZXIgaXQgc2hvdWxkIGJlIGNoZWNrZWQgYXMgcmVhc3NnaW5nZWQgc2xvdCBlbGVtZW50KHMpIGluIHRoZSBzaGFkb3cgRE9NLlxuICAgICAgICBpZiAoUlBUVXRpbC5pc1NoYWRvd0hvc3RFbGVtZW50KHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgLy8gaWYgaXQncyBkaXJlY3QgdGV4dCBvZiBhIHNoYWRvdyBob3N0XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuc2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG5vZGU9cnVsZUNvbnRleHQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZT1ub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlPT0zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2lmIG11bHRpcGxlIHRleHRzIGV4aXN0LCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSA9IChub2RlIGFzIFRleHQpLmFzc2lnbmVkU2xvdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9ICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW0gPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHN0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgIFxuICAgICAgICAvLyBKQ0ggY2xpcCBJTkZPOlxuICAgICAgICAvLyAgICAgIFRoZSBjbGlwIHByb3BlcnR5IGxldHMgeW91IHNwZWNpZnkgYSByZWN0YW5nbGUgdG8gY2xpcCBhbiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgZWxlbWVudC4gXG4gICAgICAgIC8vICAgICAgVGhlIHJlY3RhbmdsZSBzcGVjaWZpZWQgYXMgZm91ciBjb29yZGluYXRlcywgYWxsIGZyb20gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudCB0byBiZSBjbGlwcGVkLlxuICAgICAgICAvLyAgICAgIFByb3BlcnR5IHZhbHVlczpcbiAgICAgICAgLy8gICAgICAgICAgbm9uZSAgICAgICAgVGhpcyBpcyBkZWZhdWx0LiBObyBjbGlwcGluZyBpcyBkb25lXG4gICAgICAgIC8vICAgICAgICAgIGF1dG8gICAgICAgIE5vIGNsaXBwaW5nIHdpbGwgYmUgZG9uZVxuICAgICAgICAvLyAgICAgICAgICBzaGFwZSAgICAgICBUaGUgb25seSB2YWxpZCB2YWx1ZSBpczogcmVjdCAodG9wLCByaWdodCwgYm90dG9tLCBsZWZ0KVxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICBlLmcuLCBjbGlwOiByZWN0KDEwcHgsIDIwcHgsIDMwcHgsIDQwcHgpO1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICBOb3RlOiB0aGUgZm91ciB2YWx1ZXMgYXJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIG1hcmdpbi9wYWRkaW5nXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFRoZSByZWN0IHZhbHVlcyBhcmUgcG9zaXRpdmUgcGl4ZWwgdmFsdWVzLCBlLmcuLCAxMHB4LCBldGMuXG4gICAgICAgIC8vICAgICAgICAgIG1hcmdpbi1ib3ggIFVzZXMgdGhlIG1hcmdpbiBib3ggYXMgdGhlIHJlZmVyZW5jZSBib3hcbiAgICAgICAgLy8gICAgICAgICAgYm9yZGVyLWJveCAgVXNlcyB0aGUgYm9yZGVyIGJveCBhcyB0aGUgcmVmZXJlbmNlIGJveFxuICAgICAgICAvLyAgICAgICAgICBwYWRkaW5nLWJveCBVc2VzIHRoZSBwYWRkaW5nIGJveCBhcyB0aGUgcmVmZXJlbmNlIGJveFxuICAgICAgICAvLyAgICAgICAgICBjb250ZW50LWJveFxuICAgICAgICAvLyAgICAgICAgICBmaWxsLWJveFxuICAgICAgICAvLyAgICAgICAgICBzdHJva2UtYm94XG4gICAgICAgIC8vICAgICAgTk9URTogdGhlIENTUyBjbGlwIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWRcbiAgICAgICAgLy8gICAgICBBbHNvOiBjbGlwIG9ubHkgd29ya3MgaWYgdGhlIGVsZW1lbnQgaXMgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGFuZCBjYW4gb25seSBkbyByZWN0YW5nbGVzXG4gICAgICAgIC8vIGNoZWNrIGlmIGVsZW1lbnQgdmlzaWJsZVxuICAgICAgICBsZXQgdmlzaWJsZSA9IHRydWU7XG4gICAgICAgIGlmIChzdHlsZS53aWR0aCAhPT0gXCIwXCIgJiZcbiAgICAgICAgICAgIHN0eWxlLmhlaWdodCAhPT0gXCIwXCIgJiZcbiAgICAgICAgICAgIHN0eWxlLm9wYWNpdHkgIT09IFwiMFwiICYmXG4gICAgICAgICAgICBzdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiZcbiAgICAgICAgICAgIHN0eWxlLnZpc2liaWxpdHkgIT09ICdoaWRkZW4nICYmXG4gICAgICAgICAgICBzdHlsZS5vdmVyZmxvdyAhPT0gJ2hpZGRlbicgJiZcbiAgICAgICAgICAgIC8vIGxlZnQgYW5kIHJpZ2h0IHdvcmsgd2l0aCBhbGwgYWJzb2x1dGUgdW5pdHNcbiAgICAgICAgICAgIChzdHlsZS5sZWZ0ID09PSBcImF1dG9cIiB8fCAoc3R5bGUucG9zaXRpb24gPT09ICdhYnNvbHV0ZScgJiYgcGFyc2VJbnQoc3R5bGUubGVmdC5yZXBsYWNlKC9bXjAtOS4rLV0vLCAnJykpID4gMCkpICYmXG4gICAgICAgICAgICAoc3R5bGUubGVmdCA9PT0gXCJhdXRvXCIgfHwgKHN0eWxlLnBvc2l0aW9uID09PSAnYWJzb2x1dGUnICYmIHBhcnNlSW50KHN0eWxlLnRvcC5yZXBsYWNlKC9bXjAtOS4rLV0vLCAnJykpID4gMCkpKSB7XG4gICAgICAgICAgICB2aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZWxlbWVudCBJUyB2aXNpYmxlXCIpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJDSEVDSyBDT0xPUiBDT05UUkFTVCB1bmxlc3MgdG8gc21hbGxcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVsZW1lbnQgTk9UIHZpc2libGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRPIE5PVCBDSEVDSyBDT0xPUiBDT05UUkFTVFwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgY2xpcEhlaWdodCA9IC0xO1xuICAgICAgICBpZiAoc3R5bGUuY2xpcCAhPT0gXCJhdXRvXCIpIHtcbiAgICAgICAgICAgIGxldCBjbGlwU3RyaW5nID0gc3R5bGUuY2xpcC50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKGNsaXBTdHJpbmcuaW5jbHVkZXMoXCJyZWN0XCIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlQnJhY2tldHMgPSAvXFwoKC4qKVxcKS9nO1xuICAgICAgICAgICAgICAgIHZhciBsaXN0T2ZUZXh0ID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGZvdW5kID0gcmVCcmFja2V0cy5leGVjKGNsaXBTdHJpbmcpO1xuICAgICAgICAgICAgICAgIHZhciBmb3VuZEFyciA9IGZvdW5kWzFdLnNwbGl0KCcsICcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm91bmRBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJmb3VuZEFycltcIixpLFwiXSA9IFwiLGZvdW5kQXJyW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgbGlzdE9mVGV4dC5wdXNoKGZvdW5kQXJyW2ldKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJsaXN0T2ZUZXh0ID0gXCIsbGlzdE9mVGV4dCk7XG4gICAgICAgICAgICBjbGlwSGVpZ2h0ID0gcGFyc2VJbnQobGlzdE9mVGV4dFswXS5yZXBsYWNlKC9weC9nLCAnJykpIC0gcGFyc2VJbnQobGlzdE9mVGV4dFsyXS5yZXBsYWNlKC9weC9nLCAnJykpO1xuICAgICAgICAgICAgY2xpcEhlaWdodCA9IE1hdGguYWJzKGNsaXBIZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSkNIIGNsaXAtcGF0aCBJTkZPOlxuICAgICAgICAvLyAgICAgIEV4Y2VsbGVudCBhcnRpY2xlIG9uIGNsaXAtcGF0aDogaHR0cHM6Ly9pc2hhZGVlZC5jb20vYXJ0aWNsZS9jbGlwLXBhdGgvXG4gICAgICAgIC8vICAgICAgY2xpcC1wYXRoIGlzIGEgdG90YWxseSBkaWZmZXJlbnQgYW5pbWFsIHdpdGggbWFueSwgbWFueSBkaWZmZXJlbnQgdmFyaWF0aW9uc1xuICAgICAgICAvLyAgICAgIFRoZSBnb2FsIHdhcyBmb3IgaXQgdG8gbm90IGJlIGFzIGxpbWl0ZWQgYXMgY2xpcFxuICAgICAgICAvLyAgICAgIFRoZSBzeW50YXggaXMgbW9yZSBjb21wbGljYXRlZCAoYXMgaXQgZG9lcyBtb3JlKSBhbmQgaXQgaXMgZGlmZmVyZW50IGZyb20gY2xpcCxcbiAgICAgICAgLy8gICAgICBlLmcuLCB0aGUgYWJvdmUgY2xpcCByZWN0YW5nbGUgd291bGQgYmUgY2xpcC1wYXRoOiBpbnNldCgxMHB4IDIwcHggMzBweCA0MHB4KTtcbiAgICAgICAgLy8gICAgICBOb3RlOiB0aGVyZSBhcmUgbm8gY29tbWFzXG4gICAgICAgIC8vICAgICAgQWxzbywgaXQgY2FuIHRha2Ugc2luZ2xlIHZhbHVlcyB0byBtYWtlIGFsbCBzaWRlcyB0aGUgc2FtZSwgb3IgMiB2YWx1ZXMgKHZlcnQvaG9yaSkuXG4gICAgICAgIC8vICAgICAgb3IgMyB2YWx1ZXMgKHRvcC9ob3JpL2JvdHRvbSlcbiAgICAgICAgLy8gICAgICBBbmQgcGVyY2VudGFnZXMgY2FuIHdvcmtzIGFzIHdlbGwgYXMgcHhcbiAgICAgICAgLy8gICAgICBcbiAgICAgICAgLy8gICAgICBBbHRob3VnaCB0aGVyZSBhcmUgZml2ZSBkaWZmZXJlbnQgc2hhcGVzOiBpbnNldCAodGVybSB1c2VkIGZvciByZWN0YW5nbGUpLCBjaXJjbGUsXG4gICAgICAgIC8vICAgICAgICAgIGVsbGlwc2UsIHBvbHlnb24sIHBhdGggLSB3ZSB3aWxsIG9ubHkgY29uY2VybiBvdXJzZWx2ZXMgd2l0aCBpbnNldFxuICAgICAgICAvLyAgICAgIFRoZXJlIGFyZSA3IGJveCB2YWx1ZXM6IG1hcmdpbi1ib3gsIGJvcmRlci1ib3gsIHBhZGRpbmctYm94LCBjb250ZW50LWJveCwgZmlsbC1ib3gsIHN0cm9rZS1ib3gsIHZpZXctYm94XG4gICAgICAgIC8vICAgICAgQm94IGFuZCBzaGFwZSB2YWx1ZXMgbWF5IGJlIGNvbWJpbmVkOiBjbGlwLXBhdGg6IHBhZGRpbmctYm94IGNpcmNsZSg1MHB4IGF0IDAgMTAwcHgpO1xuICAgICAgICAvLyAgICAgIE5PVEU6IHRoZSBib3ggdmFsdWVzIGFyZSBOT1QgaW50dWl0aXZlLCBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2hhcGVzL0Zyb21fYm94X3ZhbHVlcyNtYXJnaW4tYm94XG4gICAgICAgIC8vICAgICAgXG4gICAgICAgIC8vICAgICAgU28gdGhlIGtleSBxdWVzdGlvbiBpcyB3aGF0IGFtb3VudCBvZiBlZmZvcnQgZG8gd2Ugd2FudCB0byBpbnZlc3QgaW50byBjbGlwLXBhdGhcbiAgICAgICAgLy8gXG5cbiAgICAgICAgLy8gSkNIIGRvbid0IGRvIGNsaXAtcGF0aCBub3cgXG4gICAgICAgIGxldCBjbGlwUGF0aEhlaWdodCA9IC0xO1xuICAgICAgICAvLyBpZiAoc3R5bGUuY2xpcFBhdGggIT09IFwiYXV0b1wiKSB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcInN0eWxlLmNsaXBQYXRoID0gXCIsc3R5bGUuY2xpcFBhdGgpO1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJzdHlsZS5jbGlwUGF0aC50b1N0cmluZyA9IFwiLHN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nKCkpO1xuICAgICAgICAvLyAgICAgbGV0IGNsaXBTdHJpbmcgPSBzdHlsZS5jbGlwUGF0aC50b1N0cmluZygpO1xuICAgICAgICAvLyAgICAgaWYgKGNsaXBTdHJpbmcuaW5jbHVkZXMoXCJpbnNldFwiKSkge1xuICAgICAgICAvLyAgICAgICAgIHZhciByZUJyYWNrZXRzID0gL1xcKCguKilcXCkvZztcbiAgICAgICAgLy8gICAgICAgdmFyIGxpc3RPZlRleHQgPSBbXTtcbiAgICAgICAgLy8gICAgICAgdmFyIGZvdW5kID0gcmVCcmFja2V0cy5leGVjKGNsaXBTdHJpbmcpO1xuICAgICAgICAvLyAgICAgICB2YXIgZm91bmRBcnIgPSBmb3VuZFsxXS5zcGxpdCgnICcpO1xuICAgICAgICAvLyAgICAgICBmb3IgKGxldCBpPTA7IGk8Zm91bmRBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcImZvdW5kQXJyW1wiLGksXCJdID0gXCIsZm91bmRBcnJbaV0pO1xuICAgICAgICAvLyAgICAgICAgIGxpc3RPZlRleHQucHVzaChmb3VuZEFycltpXSk7XG4gICAgICAgIC8vICAgICAgIH07XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImxpc3RPZlRleHQgPSBcIixsaXN0T2ZUZXh0KTtcbiAgICAgICAgLy8gY2xpcFBhdGhIZWlnaHQgPSBwYXJzZUludChsaXN0T2ZUZXh0WzBdLnJlcGxhY2UoL3B4L2csICcnKSkgLSBwYXJzZUludChsaXN0T2ZUZXh0WzJdLnJlcGxhY2UoL3B4L2csICcnKSk7XG4gICAgICAgIC8vIGNsaXBQYXRoSGVpZ2h0ID0gTWF0aC5hYnMoY2xpcEhlaWdodCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJjbGlwUGF0aEhlaWdodCA9IFwiLCBjbGlwUGF0aEhlaWdodCk7XG5cbiAgICAgICAgLy8gaWYgKHN0eWxlLnBvc2l0aW9uID09PSBcImFic29sdXRlXCIgJiYgc3R5bGUuY2xpcCA9PT0gXCJyZWN0KDBweCwgMHB4LCAwcHgsIDBweClcIiAmJiBzdHlsZS5vdmVyZmxvdyAhPT0gXCJ2aXNpYmxlXCIpIHtcbiAgICAgICAgLy8gSkNIIGFyYml0cmFyaWx5IHVzZSBsZXNzIHRoYXQgN3B4IGZvciBjbGlwSGVpZ2h0XG4gICAgICAgIGlmIChzdHlsZS5wb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiICYmIGNsaXBIZWlnaHQgPCA3ICYmIGNsaXBIZWlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRPIE5PVCBDSEVDSyBDT0xPUiBDT05UUkFTVCBiZWNhdXNlIHRvbyBzbWFsbFwiKTtcbiAgICAgICAgICAgIC8vIENvcm5lciBjYXNlIHdoZXJlIGl0ZW0gaXMgaGlkZGVuIChhY2Nlc3NpYmlsaXR5IGhpZGluZyB0ZWNobmlxdWUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gRmlyc3QgZGV0ZXJtaW5lIHRoZSBjb2xvciBjb250cmFzdCByYXRpb1xuICAgICAgICBsZXQgY29sb3JDb21ibyA9IENvbG9yVXRpbC5Db2xvckNvbWJvKGVsZW0pO1xuICAgICAgICBpZiAoY29sb3JDb21ibyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy9zb21lIGV4Y2VwdGlvbiBvY2N1cnJlZCwgb3Igbm90IGFibGUgdG8gZ2V0IGNvbG9yIGNvbWJvIGZvciBzb21lIHJlYXNvblxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJ1bmFibGUgdG8gZ2V0IGNvbG9yIGNvbWJvIGZvciBlbGVtZW50OiBcIiArIGVsZW0ubm9kZU5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmZyA9IGNvbG9yQ29tYm8uZmc7XG4gICAgICAgIGxldCBiZyA9IGNvbG9yQ29tYm8uYmc7XG4gICAgICAgIGxldCByYXRpbyA9IGZnLmNvbnRyYXN0UmF0aW8oYmcpO1xuICAgICAgICBsZXQgd2VpZ2h0ID0gZ2V0V2VpZ2h0TnVtYmVyKHN0eWxlLmZvbnRXZWlnaHQpO1xuICAgICAgICBsZXQgc2l6ZSA9IGdldEZvbnRJblBpeGVscyhzdHlsZS5mb250U2l6ZSwgZWxlbSk7XG4gICAgICAgIGxldCBpc0xhcmdlU2NhbGUgPSBzaXplID49IDI0IHx8IHNpemUgPj0gMTguNiAmJiB3ZWlnaHQgPj0gNzAwO1xuICAgICAgICBsZXQgcGFzc2VkID0gcmF0aW8gPj0gNC41IHx8IChyYXRpbyA+PSAzICYmIGlzTGFyZ2VTY2FsZSk7XG4gICAgICAgIGxldCBoYXNCYWNrZ3JvdW5kID0gY29sb3JDb21iby5oYXNCR0ltYWdlIHx8IGNvbG9yQ29tYm8uaGFzR3JhZGllbnQ7XG4gICAgICAgIGxldCB0ZXh0U2hhZG93ID0gY29sb3JDb21iby50ZXh0U2hhZG93O1xuICAgICAgICBsZXQgaXNEaXNhYmxlZCA9IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQoZWxlbSk7XG4gICAgICAgIGlmICghaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBSUFRVdGlsLmdldENvbnRyb2xPZkxhYmVsKGVsZW0pO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICBpc0Rpc2FibGVkID0gUlBUVXRpbC5pc05vZGVEaXNhYmxlZChjb250cm9sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkICYmIG5vZGVOYW1lID09PSAnbGFiZWwnICYmIFJQVFV0aWwuaXNEaXNhYmxlZEJ5Rmlyc3RDaGlsZEZvcm1FbGVtZW50KGVsZW0pKSB7XG4gICAgICAgICAgICBpc0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNEaXNhYmxlZCAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJpZFwiKSAmJiBSUFRVdGlsLmlzRGlzYWJsZWRCeVJlZmVycmluZ0VsZW1lbnQoZWxlbSkpIHtcbiAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiRVhUX0NvbG9yX0NvbnRyYXN0X1dDQUcyQUFcIiwge1xuICAgICAgICAgICAgXCJyYXRpb1wiOiByYXRpbyxcbiAgICAgICAgICAgIFwiaXNMYXJnZVNjYWxlXCI6IGlzTGFyZ2VTY2FsZSxcbiAgICAgICAgICAgIFwid2VpZ2h0XCI6IHdlaWdodCxcbiAgICAgICAgICAgIFwic2l6ZVwiOiBzaXplLFxuICAgICAgICAgICAgXCJoYXNCYWNrZ3JvdW5kXCI6IGhhc0JhY2tncm91bmQsXG4gICAgICAgICAgICBcImlzRGlzYWJsZWRcIjogaXNEaXNhYmxlZFxuICAgICAgICB9KTsqL1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgZWxlbWVudCBvciBwYXJlbnQgaXMgZGlzYWJsZWQsIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSAoYnV0IG1heSBiZSAzOjEgaW4gZnV0dXJlKVxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBpc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICBpZiAoaGFzQmFja2dyb3VuZCkge1xuICAgICAgICAgICAgICAgIC8vIGZpcmUgcG90ZW50aWFsIHNpbmNlIGEgdGV4dCBvbiBhbiBpbWFnZSBvciBncmFkaWVudCBtYXkgYmUgc3RpbGwgdmlld2FibGUsIGRlcGVuZGluZyBvbiB0aGUgdGV4dCBsb2NhdGlvbiBvbiB0aGUgZ3JhZGllbnQgb3IgaW1hZ2VcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodF0pOztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dFNoYWRvdykge1xuICAgICAgICAgICAgICAgIC8vIGZpcmUgcG90ZW50aWFsIHNpbmNlIGEgdGV4dCB3aXRoIHNoYWRvdyBtYXkgYmUgc3RpbGwgdmlld2FibGUsIGRlcGVuZGluZyBvbiB0aGUgc2hhZG93IGVmZmZlY3RzXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfdGV4dF9zaGFkb3dcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodF0pOztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGZnLnRvSGV4KCkgPT09IGJnLnRvSGV4KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfc2FtZV9jb2xvclwiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0LCBmZy50b0hleCgpLCBiZy50b0hleCgpLCBjb2xvckNvbWJvLmhhc0JHSW1hZ2UsIGNvbG9yQ29tYm8uaGFzR3JhZGllbnRdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodCwgZmcudG9IZXgoKSwgYmcudG9IZXgoKSwgY29sb3JDb21iby5oYXNCR0ltYWdlLCBjb2xvckNvbWJvLmhhc0dyYWRpZW50XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0LCBmZy50b0hleCgpLCBiZy50b0hleCgpLCBjb2xvckNvbWJvLmhhc0JHSW1hZ2UsIGNvbG9yQ29tYm8uaGFzR3JhZGllbnRdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCB0ZXh0X3F1b3RlZF9jb3JyZWN0bHk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5XCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRleHRfcXVvdGVkX2NvcnJlY3RseS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3F1b3RlZF9jb3JyZWN0bHkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIklmIHRoZSBmb2xsb3dpbmcgdGV4dCBpcyBhIHF1b3RhdGlvbiwgbWFyayBpdCBhcyBhIDxxPiBvciA8YmxvY2txdW90ZT4gZWxlbWVudDogezB9XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUXVvdGF0aW9ucyBzaG91bGQgYmUgbWFya2VkIHdpdGggPHE+IG9yIDxibG9ja3F1b3RlPiBlbGVtZW50c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBpZ25vcmUgdGhlIGNoZWNrIGlmIHRoZSBub2RlIGlzIGhpZGRlblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIGJvZHlcbiAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIG1pbldvcmRzOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDMsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWluV29yZHMgPSB2YWxpZGF0ZVBhcmFtcy5taW5Xb3Jkcy52YWx1ZTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgdmlvbGF0ZWR0ZXh0ID0gbnVsbDtcbiAgICAgICAgLy8gaWdub3JlIHRoZSBjaGVjayBmb3IgdGhlIHRleHQgb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50c1xuICAgICAgICBjb25zdCBpZ25vcmVkID0gW1wiYmxvY2txdW90ZVwiLCBcInFcIiwgXCJzY3JpcHRcIiwgXCJzdHlsZVwiLCBcInByZVwiLCBcImNvZGVcIiwgXCJydWJ5XCIsIFwic2FtcFwiXTtcbiAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gQ29tcGx5IHRvIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHdpbGwgYmUgZG9uZSBieSBkZWZhdWx0IGFzIHRoaXMgcnVsZSB0cmlnZ2VycyBvbiBlYWNoIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIGFuZCBmb3IgZWFjaCBlbGVtZW50IGl0IG9ubHkgY2hlY2tzIHRoYXQgc2luZ2xlIGVsZW1lbnRzIHRleHQgbm9kZXMgYW5kIG5vdGhpbmcgZWxzZS4gU28gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmVcbiAgICAgICAgICAgIC8vIGNvdmVyZWQgb24gdGhlaXIgb3duLiBDdXJyZW50bHkgZm9yIHRoaXMgcnVsZSBieSBkZWZhdWx0IENoZWNrIEhpZGRlbiBDb250ZW50IHdpbGwgd29yaywgYXMgd2UgYXJlIGRvaW5nXG4gICAgICAgICAgICAvLyBhIG5vZGUgd2FsayBvbmx5IG9uIHNpYmxpbmdzIHNvIGl0IHdvdWxkIG5vdCBnZXQgdGV4dCBub2RlcyBmcm9tIG90aGVyIHNpYmxpbmdzIGF0IGFsbC5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIGluIHRoZSBmdXR1cmUgc29tZXRoaW5nIGNobmdlcywganVzdCBuZWVkIHRvIGFkZCAmJiAhUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSB0byB0aGUgYmVsb3dcbiAgICAgICAgICAgIC8vIGlmLlxuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIC8vIERvIHRoZSByZWdleCB0ZXN0cyBmaXJzdCAtIHNob3VsZCBiZSBmYXN0XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYXBvc3Ryb3BoZSdzXG4gICAgICAgICAgICAgICAgdHh0VmFsID0gdHh0VmFsLnJlcGxhY2UoLyhcXFMpJyhcXFMpL2csIFwiJDEkMlwiKTtcbiAgICAgICAgICAgICAgICBsZXQgZGJsUXVvdGVzID0gdHh0VmFsLm1hdGNoKC8oXCJbXlwiXStcIikvZyk7XG4gICAgICAgICAgICAgICAgbGV0IHNuZ2xRdW90ZXMgPSB0eHRWYWwubWF0Y2goLygnW14nXSsnKS9nKTtcbiAgICAgICAgICAgICAgICAvLyBXYWxrIHRoZSBwYXJlbnRzIC0gb25seSBjb250aW51ZSB0ZXN0aW5nIGlmIHdlIGZvdW5kIGEgcXVvdGUsIGJ1dFxuICAgICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBhbHJlYWR5IG1hcmtlZCB1cFxuICAgICAgICAgICAgICAgIC8vIEFsc28gc2tpcCBpZiB3ZSdyZSBpbiBhIHNjcmlwdCAtIHRoZXJlJ3MgbG90cyBvZiBxdW90ZXMgdXNlZCBpbiBzY3JpcHRzXG4gICAgICAgICAgICAgICAgaWYgKChkYmxRdW90ZXMgIT09IG51bGwgfHwgc25nbFF1b3RlcyAhPT0gbnVsbCkgJiZcbiAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5nZXRBbmNlc3Rvcih3YWxrTm9kZSwgaWdub3JlZCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRibFF1b3RlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBkYmxRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC53b3JkQ291bnQoZGJsUXVvdGVzW2ldKSA8IG1pbldvcmRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzbmdsUXVvdGVzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IHNuZ2xRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC53b3JkQ291bnQoc25nbFF1b3Rlc1tpXSkgPCBtaW5Xb3JkcztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgbGluZWZlZWQgaW5zaWRlIHRoZSBxdW90ZVxuICAgICAgICAgICAgICAgICAgICAvLyB2aW9sYXRlZHRleHQgPSB0eHRWYWwucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIixcImdcIiksXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYmxRdW90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHNuZ2xRdW90ZXMuam9pbihcIiwgXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIlxcXFxyP1xcXFxufFxcXFxyXCIsIFwiZ1wiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc25nbFF1b3RlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmpvaW4oXCIsIFwiKS5yZXBsYWNlKG5ldyBSZWdFeHAoXCJcXFxccj9cXFxcbnxcXFxcclwiLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmNvbmNhdChzbmdsUXVvdGVzKS5qb2luKFwiLCBcIikucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIiwgXCJnXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHRoZSB2aW9sYXRlZHRleHQgaXMgbG9uZ2VyIHRoYW4gNjkgY2hhcnMsIG9ubHkga2VlcCB0aGUgZmlyc3QgMzIsIHRoZSBcIiAuLi4gXCIsIGFuZCB0aGUgbGFzdCAzMiBjaGFycyBcbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgdmlvbGF0ZWR0ZXh0Lmxlbmd0aCAmJiB2aW9sYXRlZHRleHQubGVuZ3RoID4gNjkpIHtcbiAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHZpb2xhdGVkdGV4dC5zdWJzdHJpbmcoMCwgMzIpICsgXCIgLi4uIFwiICsgdmlvbGF0ZWR0ZXh0LnN1YnN0cmluZyh2aW9sYXRlZHRleHQubGVuZ3RoIC0gMzIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFt2aW9sYXRlZHRleHRdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgdGV4dF9zZW5zb3J5X21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206Ym9keSwgZG9tOmJvZHkgZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9UZXh0X1NlbnNvcnlSZWZlcmVuY2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiSWYgdGhlIHdvcmQocykgJ3swfScgaXMgcGFydCBvZiBpbnN0cnVjdGlvbnMgZm9yIHVzaW5nIHBhZ2UgY29udGVudCwgY2hlY2sgaXQgaXMgc3RpbGwgdW5kZXJzdGFuZGFibGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIG9yIHNoYXBlIGluZm9ybWF0aW9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW5zdHJ1Y3Rpb25zIG11c3QgYmUgbWVhbmluZ2Z1bCB3aXRob3V0IHNoYXBlIG9yIGxvY2F0aW9uIHdvcmRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuM1wiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHNlbnNvcnlUZXh0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcInRvcC1sZWZ0XCIsIFwidG9wLXJpZ2h0XCIsIFwiYm90dG9tLXJpZ2h0XCIsIFwiYm90dG9tLWxlZnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJyb3VuZFwiLCBcInNxdWFyZVwiLCBcInNoYXBlXCIsIFwicmVjdGFuZ2xlXCIsIFwidHJpYW5nbGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJyaWdodFwiLCBcImxlZnRcIiwgXCJhYm92ZVwiLCBcImJlbG93XCIsIFwidG9wXCIsIFwiYm90dG9tXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidXBwZXJcIiwgXCJsb3dlclwiLCBcImNvcm5lclwiLCBcImJlc2lkZVwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmNsdWRlcyhydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBub2RlTmFtZSBvZiB0aGUgY29udGV4dCBub2RlXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhpcyBpcyBhIHN0eWxlIG9yIGxpbmsgZWxlbWVudCwgc2tpcCB0cmlnZ2VyaW5nIHJ1bGUgYXMgd2UgZG8gbm90IHdhbnQgdG8gc2NhblxuICAgICAgICAvLyBDU1MgZm9yIHNlbnNvcnkgd29yZHMsIGFzIHRoZXJlIGNhbiBiZSBDU1Mga2V5cyB3aGljaCBjb250YWluIHRoZXNlcyBzZW5zb3J5IHRleHQgdGhhdCBpcyBtYXRjaGluZy5cbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIgfHwgbm9kZU5hbWUgPT09IFwibGlua1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmlvbGF0ZWR0ZXh0QXJyYXkgPSBudWxsO1xuICAgICAgICBsZXQgdmlvbGF0ZWR0ZXh0ID0gbnVsbDtcbiAgICAgICAgbGV0IHNlbnNvcnlSZWdleCA9IGdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwidGV4dF9zZW5zb3J5X21pc3VzZVwiLCBudWxsKTtcbiAgICAgICAgaWYgKHNlbnNvcnlSZWdleCA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgc2Vuc29yeVRleHQgPSB2YWxpZGF0ZVBhcmFtcy5zZW5zb3J5VGV4dC52YWx1ZTtcbiAgICAgICAgICAgIGxldCByZWdleFN0ciA9IFwiKFwiICsgc2Vuc29yeVRleHRbMF07XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHNlbnNvcnlUZXh0Lmxlbmd0aDsgKytqKVxuICAgICAgICAgICAgICAgIHJlZ2V4U3RyICs9IFwifFwiICsgc2Vuc29yeVRleHRbal07XG4gICAgICAgICAgICByZWdleFN0ciArPSBcIilcXFxcV1wiO1xuICAgICAgICAgICAgc2Vuc29yeVJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleFN0ciwgXCJnaVwiKTtcbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwidGV4dF9zZW5zb3J5X21pc3VzZVwiLCBzZW5zb3J5UmVnZXgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAodHh0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0QXJyYXkgPSB0eHRWYWwubWF0Y2goc2Vuc29yeVJlZ2V4KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpb2xhdGVkdGV4dEFycmF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNoID0ge30sIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGV4ZW1wdFdvcmRzID0gW1wicmlnaHQtY2xpY2tcIiwgXCJsZWZ0LWNsaWNrXCIsIFwicmlnaHQtY2xpY2tpbmdcIiwgXCJyaWdodC1jbGlja3NcIiwgXCJsZWZ0LWNsaWNraW5nXCIsIFwibGVmdC1jbGlja3NcIl07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHNwbGl0KC9bXFxuXFxyIF0rLykgd2lsbCBzcHJlYWQgdGhlIHN0cmluZyBpbnRvIGdyb3VwIG9mIHdvcmRzIHVzaW5nIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FycmlhZ2UgcmV0dXJuIG9yIGxpbmVmZWVkIGFzIHNlcGFyYXRvcnMuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY291bnRzID0gdHh0VmFsLnNwbGl0KC9bXFxuXFxyIF0rLykucmVkdWNlKGZ1bmN0aW9uIChtYXAsIHdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2Vuc29yeVRleHRBcnIgPSB2YWxpZGF0ZVBhcmFtcy5zZW5zb3J5VGV4dC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgd29yZFdvVHJhaWxpbmdQdW5jID0gd29yZC5yZXBsYWNlKC9bLj8hOjsoKSdcIixgXFxdXSskLywgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxjV29yZFdvUHVuYyA9IHdvcmQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLj8hOjsoKSdcIixgXFxdXS9nLCBcIlwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgc2Vuc29yeVRleHRBcnIubGVuZ3RoOyBjb3VudGVyKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGEgPSBsY1dvcmRXb1B1bmMuaW5kZXhPZihzZW5zb3J5VGV4dEFycltjb3VudGVyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiID0gZXhlbXB0V29yZHMuaW5kZXhPZihsY1dvcmRXb1B1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2Vuc29yeVdvcmRMZW4gPSBzZW5zb3J5VGV4dEFycltjb3VudGVyXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFyRm9sbG93U2Vuc29yeVRleHQgPSBsY1dvcmRXb1B1bmMuY2hhckF0KHNlbnNvcnlXb3JkTGVuICsgYSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHdvcmQgZG9lcyBub3QgY29udGFpbnMgc3Vic3RyaW5nIG9mIHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2NlZWQgdG8gdGhlIG5leHQgbG9vcCBpdGVyYXRpb24gZm9yIG5leHQgc2Vuc29yeVRleHQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhIDwgMCkgeyBjb250aW51ZTsgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc1B1bmNmb2xsb3dpbmcgPSAoKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFwtJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcLicpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXD8nKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCEnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw6JykgfHwgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw7JykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcKCcpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcKScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCcnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXFwiJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcLCcpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJy5cXGAnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFxcXCcpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcXScpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNQdW5jUHJlY2VkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPSBsY1dvcmRXb1B1bmMuY2hhckF0KGEgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHVuY1ByZWNlZGluZyA9ICgoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwtJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwuJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFw/JykgfHwgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcIScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcOicpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXDsnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCgnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwpJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwnJykgfHwgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcXCInKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCwnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnLlxcYCcpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcXFwnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFxdJykpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChsY1dvcmRXb1B1bmMubGVuZ3RoID09IHNlbnNvcnlXb3JkTGVuKSB8fCAoaXNQdW5jZm9sbG93aW5nID09IHRydWUpIHx8IChpc1B1bmNQcmVjZWRpbmcgPT0gdHJ1ZSkpICYmIChiIDwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNoLmhhc093blByb3BlcnR5KHdvcmRXb1RyYWlsaW5nUHVuYykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoW3dvcmRXb1RyYWlsaW5nUHVuY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHdvcmRXb1RyYWlsaW5nUHVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyID0gc2Vuc29yeVRleHRBcnIubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdID0gKG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aW9sYXRlZHRleHQgPSByZXN1bHQuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGlmIHdlJ3JlIG5vdCBpbiB0aGUgYm9keSBvciBpZiB3ZSdyZSBpbiBhIHNjcmlwdFxuICAgICAgICAgICAgbGV0IGNoZWNrQW5jZXN0b3IgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJib2R5XCIsIFwic2NyaXB0XCJdKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IChjaGVja0FuY2VzdG9yID09IG51bGwgfHwgY2hlY2tBbmNlc3Rvci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9IFwiYm9keVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiLCBbdmlvbGF0ZWR0ZXh0XSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IGdldERlZmluZWRTdHlsZXMsIGdldENvbXB1dGVkU3R5bGUsIGNvbnZlcnRWYWx1ZTJQaXhlbHMgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5cbmV4cG9ydCBsZXQgdGV4dF9zcGFjaW5nX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcInRleHRfc3BhY2luZ192YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwidGV4dF9zcGFjaW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlXCI6IFwidGV4dF9zcGFjaW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF93b3JkX3NwYWNpbmdfc3R5bGVcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xpbmVfaGVpZ2h0X3N0eWxlXCI6IFwidGV4dF9zcGFjaW5nX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkNTUyAhaW1wb3J0YW50IGlzIG5vdCB1c2VkIGluIGlubGluZSBzdHlsZSB0byBjb250cm9sIGxldHRlciBvciB3b3JkIHNwYWNpbmcgb3IgbGluZSBoZWlnaHRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJDU1MgIWltcG9ydGFudCBzaG91bGQgbm90IGJlIHVzZWQgaW4gaW5saW5lIHN0eWxlIHRvIGNvbnRyb2wgbGV0dGVyIG9yIHdvcmQgc3BhY2luZyBvciBsaW5lIGhlaWdodFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlXCI6IFwiQ1NTICFpbXBvcnRhbnQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGlubGluZSDigJhsZXR0ZXItc3BhY2luZ+KAmSBzdHlsZVwiLFxuICAgICAgICAgICAgXCJmYWlsX3dvcmRfc3BhY2luZ19zdHlsZVwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUg4oCYd29yZC1zcGFjaW5n4oCZIHN0eWxlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGluZV9oZWlnaHRfc3R5bGVcIjogXCJDU1MgIWltcG9ydGFudCBzaG91bGQgbm90IGJlIHVzZWQgaW4gaW5saW5lIOKAmGxpbmUtaGVpZ2h04oCZIHN0eWxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgIFwibnVtXCI6IFtcIjEuNC4xMlwiXSxcbiAgICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDpbJzllNDVlYycsICcyNGFmYzInLCAnNzhmZDMyJ10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgb2ZmIHNjcmVlblxuICAgICAgICBjb25zdCBib3VuZHMgPSBjb250ZXh0W1wiZG9tXCJdLmJvdW5kcztcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChib3VuZHNbJ3RvcCddIDwgMCB8fCBib3VuZHNbJ2xlZnQnXSA8IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgbm8taHRtbCBlbGVtZW50XG4gICAgICAgIGlmIChSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInN2Z1wiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoaXMgZWxlbWVudCBoYXMgY2hpbGRyZW4gd2l0aCBhY3R1YWwgdGV4dC5cbiAgICAgICAgbGV0IGNoaWxkU3RyID0gXCJcIjtcbiAgICAgICAgbGV0IGNoaWxkTm9kZXMgPSBydWxlQ29udGV4dC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChjaGlsZE5vZGVzW2ldLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgICAgICAgICBjaGlsZFN0ciArPSBjaGlsZE5vZGVzW2ldLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGRTdHIudHJpbSgpLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9mb250IHNpemUgYWx3YXlzIHJlc29sdmVkIHRvICdweCcgICAgXG4gICAgICAgIGNvbnN0IGZvbnRfc2l6ZV9zdHlsZSA9IGdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtc2l6ZScpO1xuICAgICAgICBsZXQgZm9udF9zaXplID0gcGFyc2VGbG9hdChmb250X3NpemVfc3R5bGUpOyBcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IGdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc3R5bGVzKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vbm90ZSB0aGF0IENTUyB1bml0IGlzIHJlcXVpcmVkIGZvciBub24temVybyB2YWx1ZXMsIG90aGVyd2lzZSBpdCdzIGlnbm9yZWRcbiAgICAgICAgbGV0IHJldCA9IFtdOyBcbiAgICAgICAgLy8gbWF0Y2hlZCBzdHJpbmc6IG9yaWdpbmFsIHN0eWxlLCB0aGUgc3R5bGUgdmFsdWUgYW5kIHVuaXRcbiAgICAgICAgY29uc3QgcmVnZXggPSAvKC0/W1xcZC5dKykoW2EteiVdKikvO1xuICAgICAgICBsZXQgd29yZF9zdHlsZSA9IHN0eWxlc1snd29yZC1zcGFjaW5nJ107XG4gICAgICAgIGlmICh3b3JkX3N0eWxlKSB7XG4gICAgICAgICAgICBpZiAod29yZF9zdHlsZS5zdGFydHNXaXRoKCdpbmhlcml0JykgfHwgd29yZF9zdHlsZS5zdGFydHNXaXRoKCd1bnNldCcpKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY2xvc2V0IGFuY2VzdG9yJ3Mgd29yZC1zcGFjaW5nXG4gICAgICAgICAgICAgICAgbGV0IGFuY2VzdG9yID0gUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhTdHlsZXMocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCwge1wid29yZC1zcGFjaW5nXCI6IFtcIipcIl19LCBbJ2luaGVyaXQnLCAndW5zZXQnXSk7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmRfc3R5bGUgPSBnZXREZWZpbmVkU3R5bGVzKGFuY2VzdG9yKVsnd29yZC1zcGFjaW5nJ107ICBcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdvcmRfc3R5bGUuc3RhcnRzV2l0aCgndW5zZXQnKSkge1xuICAgICAgICAgICAgICAgICAgICB3b3JkX3N0eWxlID0gXCJpbml0aWFsXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAgXG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5zdHlsZS5nZXRQcm9wZXJ0eVByaW9yaXR5KFwid29yZC1zcGFjaW5nXCIpID09PSAnaW1wb3J0YW50Jykge1xuICAgICAgICAgICAgICAgIHdvcmRfc3R5bGUgPSB3b3JkX3N0eWxlLnN1YnN0cmluZygwLCB3b3JkX3N0eWxlLmxlbmd0aCAtIFwiIWltcG9ydGFudFwiLmxlbmd0aCAtMSk7XG4gICAgICAgICAgICAgICAgLy8gY29tcHV0ZWQgc3BhY2UgaXMgMCBmb3IgJ25vcm1hbCcgb3IgJ2luaXRpYWwnLlxuICAgICAgICAgICAgICAgIGlmICh3b3JkX3N0eWxlID09PSAnaW5pdGlhbCcgfHwgd29yZF9zdHlsZSA9PT0gJ25vcm1hbCcpXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF93b3JkX3NwYWNpbmdfc3R5bGVcIikpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JkU3BhY2luZyA9IHBhcnNlRmxvYXQod29yZF9zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4od29yZFNwYWNpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkID0gd29yZF9zdHlsZS50cmltKCkubWF0Y2gocmVnZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFsyXSAhPT0gJycgJiYgcGFyc2VkWzFdICE9PSAwKSB7IC8vbm8gemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgd2hpY2ggaXMgY29uc2lkZXJlZCBhcyBlcnJvciwgc28gaW1wbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwaXhlbHMgPSBjb252ZXJ0VmFsdWUyUGl4ZWxzKHBhcnNlZFsyXSwgcGFyc2VkWzFdLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVscyAhPT0gbnVsbCAmJiBwaXhlbHMvZm9udF9zaXplIDwgMC4xNilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX3dvcmRfc3BhY2luZ19zdHlsZVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpOyBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7ICAgICAgICAgXG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7ICBcbiAgICAgICAgfSBcblxuICAgICAgICBsZXQgbGV0dGVyX3N0eWxlID0gc3R5bGVzWydsZXR0ZXItc3BhY2luZyddOyBcbiAgICAgICAgaWYgKGxldHRlcl9zdHlsZSkge1xuICAgICAgICAgICAgaWYgKGxldHRlcl9zdHlsZS5zdGFydHNXaXRoKCdpbmhlcml0JykgfHwgbGV0dGVyX3N0eWxlLnN0YXJ0c1dpdGgoJ3Vuc2V0JykpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBjbG9zZXQgYW5jZXN0b3IncyB3b3JkLXNwYWNpbmdcbiAgICAgICAgICAgICAgICBsZXQgYW5jZXN0b3IgPSBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFN0eWxlcyhydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50LCB7XCJsZXR0ZXItc3BhY2luZ1wiOiBbXCIqXCJdfSwgWydpbmhlcml0JywgJ3Vuc2V0J10pO1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXR0ZXJfc3R5bGUgPSBnZXREZWZpbmVkU3R5bGVzKGFuY2VzdG9yKVsnbGV0dGVyLXNwYWNpbmcnXTsgIFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGV0dGVyX3N0eWxlLnN0YXJ0c1dpdGgoJ3Vuc2V0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0dGVyX3N0eWxlID0gXCJpbml0aWFsXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkoXCJsZXR0ZXItc3BhY2luZ1wiKSA9PT0gJ2ltcG9ydGFudCcpIHtcbiAgICAgICAgICAgICAgICBsZXR0ZXJfc3R5bGUgPSBsZXR0ZXJfc3R5bGUuc3Vic3RyaW5nKDAsIGxldHRlcl9zdHlsZS5sZW5ndGggLSBcIiFpbXBvcnRhbnRcIi5sZW5ndGggLTEpO1xuICAgICAgICAgICAgICAgIC8vIGNvbXB1dGVkIHNwYWNlIGlzIDAgZm9yICdub3JtYWwnIG9yICdpbml0aWFsJy5cbiAgICAgICAgICAgICAgICBpZiAobGV0dGVyX3N0eWxlID09PSAnaW5pdGlhbCcgfHwgbGV0dGVyX3N0eWxlID09PSAnbm9ybWFsJylcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlXCIpKTtcbiAgICAgICAgICAgICAgICBlbHNlIHsgICAgXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxldHRlclNwYWNpbmcgPSBwYXJzZUZsb2F0KGxldHRlcl9zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obGV0dGVyU3BhY2luZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJzZWQgPSBsZXR0ZXJfc3R5bGUudHJpbSgpLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWRbMl0gIT09ICcnICYmIHBhcnNlZFsxXSAhPT0gMCkgeyAvL25vIHplcm8gdmFsdWUgd2l0aG91dCB1bml0IHdoaWNoIGlzIGNvbnNpZGVyZWQgYXMgZXJyb3IsIHNvIGltcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGl4ZWxzID0gY29udmVydFZhbHVlMlBpeGVscyhwYXJzZWRbMl0sIHBhcnNlZFsxXSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbHMgIT09IG51bGwgJiYgcGl4ZWxzL2ZvbnRfc2l6ZSA8IDAuMTIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9sZXR0ZXJfc3BhY2luZ19zdHlsZVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgICAgICB9ICAgICAgICBcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgIH0gXG5cbiAgICAgICAgbGV0IGxpbmVfc3R5bGUgPSBzdHlsZXNbJ2xpbmUtaGVpZ2h0J107XG4gICAgICAgIGxldCBvdmVyZmxvdyA9IHtcIm92ZXJmbG93XCI6WydhdXRvJywgJ3Njcm9sbCddLCBcIm92ZXJmbG93LXhcIjpbJ2F1dG8nLCAnc2Nyb2xsJ10sIFwib3ZlcmZsb3cteVwiOlsnYXV0bycsICdzY3JvbGwnXX07XG4gICAgICAgIGlmIChsaW5lX3N0eWxlICYmIFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoU3R5bGVzKHJ1bGVDb250ZXh0LCBvdmVyZmxvdykgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChsaW5lX3N0eWxlLnN0YXJ0c1dpdGgoJ2luaGVyaXQnKSB8fCBsaW5lX3N0eWxlLnN0YXJ0c1dpdGgoJ3Vuc2V0JykpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBjbG9zZXQgYW5jZXN0b3IncyB3b3JkLXNwYWNpbmdcbiAgICAgICAgICAgICAgICBsZXQgYW5jZXN0b3IgPSBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFN0eWxlcyhydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50LCB7XCJsaW5lLWhlaWdodFwiOiBbXCIqXCJdfSwgWydpbmhlcml0JywgJ3Vuc2V0J10pO1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lX3N0eWxlID0gZ2V0RGVmaW5lZFN0eWxlcyhhbmNlc3RvcilbJ2xpbmUtaGVpZ2h0J107ICBcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmVfc3R5bGUuc3RhcnRzV2l0aCgndW5zZXQnKSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lX3N0eWxlID0gXCJpbml0aWFsXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuc3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eShcImxpbmUtaGVpZ2h0XCIpID09PSAnaW1wb3J0YW50Jykge1xuICAgICAgICAgICAgICAgIGxpbmVfc3R5bGUgPSBsaW5lX3N0eWxlLnN1YnN0cmluZygwLCBsaW5lX3N0eWxlLmxlbmd0aCAtIFwiIWltcG9ydGFudFwiLmxlbmd0aCAtMSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY29tcHV0ZWQgc3BhY2UgaXMgMCBmb3IgJ25vcm1hbCcgb3IgJ2luaXRpYWwnLlxuICAgICAgICAgICAgICAgIGlmIChsaW5lX3N0eWxlID09PSAnaW5pdGlhbCcgfHwgbGluZV9zdHlsZSA9PT0gJ25vcm1hbCcpXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9saW5lX2hlaWdodF9zdHlsZVwiKSk7XG4gICAgICAgICAgICAgICAgZWxzZSB7ICBcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IHBhcnNlRmxvYXQobGluZV9zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obGluZUhlaWdodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJzZWQgPSBsaW5lX3N0eWxlLnRyaW0oKS5tYXRjaChyZWdleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkWzJdID09PSAnJykgeyAvL2xpbmUtaGVpZ2h0IGFyZSBhbGxvd2VkIHVuaXRsZXNzIHdoZW4gdGhlIHZhbGllIGlzIG11bHRpcGxlIChvciBmcmFjdGlvbikgb2YgdGhlIGZvbnQgc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWRbMV0gPCAxLjUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9saW5lX2hlaWdodF9zdHlsZVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGl4ZWxzID0gY29udmVydFZhbHVlMlBpeGVscyhwYXJzZWRbMl0sIHBhcnNlZFsxXSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbHMgIT09IG51bGwgJiYgcGl4ZWxzL2ZvbnRfc2l6ZSA8IDEuNSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX2xpbmVfaGVpZ2h0X3N0eWxlXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgXG4gICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTsgXG4gICAgICAgIH0gXG4gICAgICAgICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgXG4gICAgICAgIHJldHVybiBudWxsOyAgLy9pbXBsaWNhYmxlIG9yIGlnbm9yZVxuICAgICAgICBcbiAgICB9ICAgIFxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHRleHRfd2hpdGVzcGFjZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInRleHRfd2hpdGVzcGFjZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0XCI6IFwidGV4dF93aGl0ZXNwYWNlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3RleHRcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjcmVhdGUgc3BhY2UgYmV0d2VlbiB0aGUgbGV0dGVycyBvZiBhIHdvcmRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjb250cm9sIHNwYWNpbmcgd2l0aGluIGEgd29yZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgaWYgd2UncmUgbm90IGluIHRoZSBib2R5IG9yIGlmIHdlJ3JlIGluIGEgc2NyaXB0XG4gICAgICAgIGxldCBjaGVja0FuY2VzdG9yID0gUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYm9keVwiLCBcInNjcmlwdFwiLCBcImNvZGVcIl0pO1xuICAgICAgICBpZiAoY2hlY2tBbmNlc3RvciA9PSBudWxsIHx8IGNoZWNrQW5jZXN0b3Iubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcImJvZHlcIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICEoLyhefFxccylbYS16QS1aXSBbYS16QS1aXSBbYS16QS1aXSgkfFxccykvLnRlc3QodHh0VmFsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdGV4dFwiKTtcblxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBOb2RlV2Fsa2VyLCBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCB3aWRnZXRfdGFiYmFibGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcIndpZGdldF90YWJiYWJsZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6bGluayxhcmlhOnNwaW5idXR0b24sYXJpYTp0YWJsaXN0LGFyaWE6Y29tYm9ib3gsYXJpYTpsaXN0Ym94LGFyaWE6bWVudSxhcmlhOnJhZGlvZ3JvdXAsYXJpYTp0cmVlLGFyaWE6Y2hlY2tib3gsYXJpYTpzbGlkZXIsYXJpYTpzcGluYnV0dG9uLGFyaWE6dGV4dGJveCxhcmlhOnNjcm9sbGJhcixhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIklCTUFfRm9jdXNfVGFiYmFibGVcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RhYmJhYmxlXCI6IFwiZmFpbF9ub190YWJiYWJsZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIndpZGdldF90YWJiYWJsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RhYmJhYmxlXCI6IFwid2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwid2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RhYmJhYmxlXCI6IFwiQ29tcG9uZW50IHdpdGggXFxcInswfVxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGEgdGFiYmFibGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbXBvbmVudCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHRhYmJhYmxlIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4zXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChSUFRVdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICArK2NvdW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIC8vIHNraXAgdGhlIGNvdW50IGlmIHRoZSBlbGVtZW50IHJlcXVpcmVzIHByZXNlbnRhdGlvbmFsIGNoaWxkcmVuIG9ubHlcbiAgICAgICAgaWYgKGNvdW50IDwgMSAmJiAhUlBUVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihydWxlQ29udGV4dCk7XG4gICAgICAgICAgICB3aGlsZSAoY291bnQgPCAxICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09IDEgJiYgIW53LmJFbmRUYWcgJiYgUlBUVXRpbC5pc1RhYmJhYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwYXNzZWQgPSBjb3VudCA+PSAxO1xuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJwYXNzXCIpIDogUnVsZVBvdGVudGlhbChcImZhaWxfbm9fdGFiYmFibGVcIiwgW3JvbGVdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCB3aWRnZXRfdGFiYmFibGVfc2luZ2xlOiBSdWxlID0ge1xuICAgIGlkOiBcIndpZGdldF90YWJiYWJsZV9zaW5nbGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6bGluayxhcmlhOm1lbnVpdGVtLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnRhYmxpc3QsYXJpYTpjb21ib2JveCxhcmlhOmxpc3Rib3gsYXJpYTptZW51LGFyaWE6cmFkaW9ncm91cCxhcmlhOnRyZWUsYXJpYTpjaGVja2JveCxhcmlhOm9wdGlvbixhcmlhOnJhZGlvLGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnRleHRib3gsYXJpYTpjb2x1bW5oZWFkZXIsYXJpYTpyb3doZWFkZXIsYXJpYTpzbGlkZXIsYXJpYTp0YWJcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIklCTUFfRm9jdXNfTXVsdGlUYWJcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwiZmFpbF9tdWx0aXBsZV90YWJiYWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ3aWRnZXRfdGFiYmFibGVfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9tdWx0aXBsZV90YWJiYWJsZVwiOiBcIndpZGdldF90YWJiYWJsZV9zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIndpZGdldF90YWJiYWJsZV9zaW5nbGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiZmFpbF9tdWx0aXBsZV90YWJiYWJsZVwiOiBcIkNvbXBvbmVudCB3aXRoIFxcXCJ7MH1cXFwiIHJvbGUgaGFzIG1vcmUgdGhhbiBvbmUgdGFiYmFibGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNlcnRhaW4gY29tcG9uZW50cyBtdXN0IGhhdmUgbm8gbW9yZSB0aGFuIG9uZSB0YWJiYWJsZSBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuM1wiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgaWYgKFJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm9kZSBoYXMgY2hpbGRyZW4sIGxvb2sgZm9yIHRhYiBzdG9wcyBpbiB0aGUgY2hpbGRyZW5cbiAgICAgICAgLy9za2lwIHRoZSBjb3VudCBpZiB0aGUgZWxlbWVudCByZXF1aXJlcyBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiBvbmx5XG4gICAgICAgIGlmIChjb3VudCA8IDIgJiYgIVJQVFV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkgJiYgcnVsZUNvbnRleHQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgd2hpbGUgKGNvdW50IDwgMiAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PSAxICYmICFudy5iRW5kVGFnICYmIFJQVFV0aWwuaXNUYWJiYWJsZShudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICArK2NvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFzc2VkID0gY291bnQgPCAyO1xuICAgICAgICBpZiAoIXBhc3NlZClcbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0LCBcIndpZGdldF90YWJiYWJsZV9zaW5nbGVcIiwgXCJmYWlsX211bHRpcGxlX3RhYmJhYmxlXCIpO1xuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJwYXNzXCIpIDogUnVsZVBvdGVudGlhbChcImZhaWxfbXVsdGlwbGVfdGFiYmFibGVcIiwgW3JvbGVdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlc2V0IH0gZnJvbSBcIi4vY2hlY2tlci9DaGVja2VyXCI7XG5pbXBvcnQgeyBlUnVsZUNhdGVnb3J5LCBlUnVsZXNldFR5cGUgfSBmcm9tIFwiLi4vdjIvYXBpL0lFbmdpbmVcIjtcbi8vIFRoaXMgZmlsZSBjb21lcyBmcm9tIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hY3QtcnVsZXMvYWN0LXRvb2xzL21haW4vc3JjL2RhdGEvc2MtdXJscy5qc29uXG5pbXBvcnQgKiBhcyBTQ1VSTHMgZnJvbSBcIi4vc2MtdXJscy5qc29uXCJcbmNvbnN0IFNDcyA9IFtdO1xuZm9yIChjb25zdCBrZXkgaW4gU0NVUkxzKSB7XG4gICAgU0NzLnB1c2goU0NVUkxzW2tleV0pO1xufVxuXG5jb25zdCBzdW1tYXJpZXMgPSB7XG4gICAgXCIxLjEuMVwiOiBcIkFsbCBub24tdGV4dCBjb250ZW50IHRoYXQgaXMgcHJlc2VudGVkIHRvIHRoZSB1c2VyIGhhcyBhIHRleHQgYWx0ZXJuYXRpdmUgdGhhdCBzZXJ2ZXMgdGhlIGVxdWl2YWxlbnQgcHVycG9zZS5cIixcbiAgICBcIjEuMi4xXCI6IFwiRm9yIHByZXJlY29yZGVkIGF1ZGlvLW9ubHkgb3IgdmlkZW8tb25seSBtZWRpYSwgYW4gYWx0ZXJuYXRpdmUgcHJvdmlkZXMgZXF1aXZhbGVudCBpbmZvcm1hdGlvbi5cIixcbiAgICBcIjEuMi4yXCI6IFwiQ2FwdGlvbnMgYXJlIHByb3ZpZGVkIGZvciBhbGwgcHJlcmVjb3JkZWQgYXVkaW8gY29udGVudCBpbiBzeW5jaHJvbml6ZWQgbWVkaWEuXCIsXG4gICAgXCIxLjIuM1wiOiBcIkFuIGFsdGVybmF0aXZlIGZvciB0aW1lLWJhc2VkIG1lZGlhIG9yIGF1ZGlvIGRlc2NyaXB0aW9uIG9mIHRoZSBwcmVyZWNvcmRlZCB2aWRlbyBjb250ZW50IGlzIHByb3ZpZGVkIGZvciBzeW5jaHJvbml6ZWQgbWVkaWEuXCIsXG4gICAgXCIxLjIuNFwiOiBcIkNhcHRpb25zIGFyZSBwcm92aWRlZCBmb3IgYWxsIGxpdmUgYXVkaW8gY29udGVudCBpbiBzeW5jaHJvbml6ZWQgbWVkaWEuXCIsXG4gICAgXCIxLjIuNVwiOiBcIkF1ZGlvIGRlc2NyaXB0aW9uIGlzIHByb3ZpZGVkIGZvciBhbGwgcHJlcmVjb3JkZWQgdmlkZW8gY29udGVudCBpbiBzeW5jaHJvbml6ZWQgbWVkaWEuXCIsXG4gICAgXCIxLjMuMVwiOiBcIkluZm9ybWF0aW9uLCBzdHJ1Y3R1cmUsIGFuZCByZWxhdGlvbnNoaXBzIGNvbnZleWVkIHRocm91Z2ggcHJlc2VudGF0aW9uIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQgb3IgYXJlIGF2YWlsYWJsZSBpbiB0ZXh0LlwiLFxuICAgIFwiMS4zLjJcIjogXCJXaGVuIHRoZSBzZXF1ZW5jZSBpbiB3aGljaCBjb250ZW50IGlzIHByZXNlbnRlZCBhZmZlY3RzIGl0cyBtZWFuaW5nLCBhIGNvcnJlY3QgcmVhZGluZyBzZXF1ZW5jZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMS4zLjNcIjogXCJJbnN0cnVjdGlvbnMgcHJvdmlkZWQgZm9yIHVuZGVyc3RhbmRpbmcgYW5kIG9wZXJhdGluZyBjb250ZW50IGRvIG5vdCByZWx5IHNvbGVseSBvbiBzZW5zb3J5IGNoYXJhY3RlcmlzdGljcyBvZiBjb21wb25lbnRzIHN1Y2ggYXMgc2hhcGUsIHNpemUsIHZpc3VhbCBsb2NhdGlvbiwgb3JpZW50YXRpb24sIG9yIHNvdW5kLlwiLFxuICAgIFwiMS4zLjRcIjogXCJDb250ZW50IGRvZXMgbm90IHJlc3RyaWN0IGl0cyB2aWV3IGFuZCBvcGVyYXRpb24gdG8gYSBzaW5nbGUgZGlzcGxheSBvcmllbnRhdGlvbiwgc3VjaCBhcyBwb3J0cmFpdCBvciBsYW5kc2NhcGUuXCIsXG4gICAgXCIxLjMuNVwiOiBcIlRoZSBwdXJwb3NlIG9mIGVhY2ggaW5wdXQgZmllbGQgdGhhdCBjb2xsZWN0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIHdoZW4gdGhlIGZpZWxkIHNlcnZlcyBhIGNvbW1vbiBwdXJwb3NlLlwiLFxuICAgIFwiMS40LjFcIjogXCJDb2xvciBpcyBub3QgdXNlZCBhcyB0aGUgb25seSB2aXN1YWwgbWVhbnMgb2YgY29udmV5aW5nIGluZm9ybWF0aW9uLCBpbmRpY2F0aW5nIGFuIGFjdGlvbiwgcHJvbXB0aW5nIGEgcmVzcG9uc2UsIG9yIGRpc3Rpbmd1aXNoaW5nIGEgdmlzdWFsIGVsZW1lbnQuXCIsXG4gICAgXCIxLjQuMlwiOiBcIklmIGFueSBhdWRpbyBwbGF5cyBhdXRvbWF0aWNhbGx5IGZvciBtb3JlIHRoYW4gMyBzZWNvbmRzLCBlaXRoZXIgYSBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIHRvIHBhdXNlIG9yIHN0b3AgdGhlIGF1ZGlvLCBvciBhIG1lY2hhbmlzbSBpcyBhdmFpbGFibGUgdG8gY29udHJvbCBhdWRpbyB2b2x1bWUgaW5kZXBlbmRlbnRseSBmcm9tIHRoZSBvdmVyYWxsIHN5c3RlbSB2b2x1bWUgbGV2ZWwuXCIsXG4gICAgXCIxLjQuM1wiOiBcIlRoZSB2aXN1YWwgcHJlc2VudGF0aW9uIG9mIHRleHQgYW5kIGltYWdlcyBvZiB0ZXh0IGhhcyBhIGNvbnRyYXN0IHJhdGlvIG9mIGF0IGxlYXN0IDQuNToxLCB3aXRoIGEgMzoxIHJhdGlvIGZvciBsYXJnZS1zY2FsZSB0ZXh0LlwiLFxuICAgIFwiMS40LjRcIjogXCJUZXh0IGNhbiBiZSByZXNpemVkIHdpdGhvdXQgYXNzaXN0aXZlIHRlY2hub2xvZ3kgdXAgdG8gMjAwIHBlcmNlbnQgd2l0aG91dCBsb3NzIG9mIGNvbnRlbnQgb3IgZnVuY3Rpb25hbGl0eS5cIixcbiAgICBcIjEuNC41XCI6IFwiSWYgdGhlIHRlY2hub2xvZ2llcyBiZWluZyB1c2VkIGNhbiBhY2hpZXZlIHRoZSB2aXN1YWwgcHJlc2VudGF0aW9uLCB0ZXh0IHNob3VsZCBub3QgYmUgdXNlZCB0byBjb252ZXkgaW5mb3JtYXRpb24gcmF0aGVyIHRoYW4gaW1hZ2VzIG9mIHRleHQuXCIsXG4gICAgXCIxLjQuMTBcIjogXCJDb250ZW50IGNhbiByZWZsb3cgd2l0aG91dCBsb3NzIG9mIGluZm9ybWF0aW9uIG9yIGZ1bmN0aW9uYWxpdHksIGFuZCB3aXRob3V0IHJlcXVpcmluZyBzY3JvbGxpbmcgaW4gdHdvIGRpbWVuc2lvbnMuXCIsXG4gICAgXCIxLjQuMTFcIjogXCJUaGUgcGFydHMgb2YgZ3JhcGhpY2FsIG9iamVjdHMgcmVxdWlyZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGVudCwgYW5kIHRoZSB2aXN1YWwgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gaWRlbnRpZnkgVUkgY29tcG9uZW50cyBhbmQgc3RhdGVzLCBoYXZlIGEgY29udHJhc3QgcmF0aW8gb2YgYXQgbGVhc3QgMzoxIGFnYWluc3QgYWRqYWNlbnQgY29sb3JzLlwiLFxuICAgIFwiMS40LjEyXCI6IFwiTm8gbG9zcyBvZiBjb250ZW50IG9yIGZ1bmN0aW9uYWxpdHkgb2NjdXJzIHdoZW4gdXNlcnMgY2hhbmdlIGxldHRlciwgd29yZCBhbmQgcGFyYWdyYXBoIHNwYWNpbmcsIGFzIHdlbGwgYXMgbGluZSBoZWlnaHQuXCIsXG4gICAgXCIxLjQuMTNcIjogXCJXaGVyZSBob3ZlciBvciBmb2N1cyBhY3Rpb25zIGNhdXNlIGFkZGl0aW9uYWwgY29udGVudCB0byBiZWNvbWUgdmlzaWJsZSBhbmQgaGlkZGVuLCB0aGUgYWRkaXRpb25hbCBjb250ZW50IGlzIGRpc21pc3NhYmxlLCBob3ZlcmFibGUgYW5kIHBlcnNpc3RlbnQuXCIsXG4gICAgXCIyLjEuMVwiOiBcIkFsbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSBjb250ZW50IGlzIG9wZXJhYmxlIHRocm91Z2ggYSBrZXlib2FyZCBpbnRlcmZhY2Ugd2l0aG91dCByZXF1aXJpbmcgc3BlY2lmaWMgdGltaW5ncyBmb3IgaW5kaXZpZHVhbCBrZXlzdHJva2VzLlwiLFxuICAgIFwiMi4xLjJcIjogXCJJZiBrZXlib2FyZCBmb2N1cyBjYW4gYmUgbW92ZWQgdG8gYSBjb21wb25lbnQgdXNpbmcgYSBrZXlib2FyZCBpbnRlcmZhY2UsIHRoZW4gZm9jdXMgY2FuIGJlIG1vdmVkIGF3YXkgZnJvbSB0aGF0IGNvbXBvbmVudCB1c2luZyBvbmx5IGEga2V5Ym9hcmQgaW50ZXJmYWNlLCBhbmQsIGlmIGl0IHJlcXVpcmVzIG1vcmUgdGhhbiB1bm1vZGlmaWVkIGFycm93IG9yIHRhYiBrZXlzIG9yIG90aGVyIHN0YW5kYXJkIGV4aXQgbWV0aG9kcywgdGhlIHVzZXIgaXMgYWR2aXNlZCBvZiB0aGUgbWV0aG9kIGZvciBtb3ZpbmcgZm9jdXMgYXdheS5cIixcbiAgICBcIjIuMS40XCI6IFwiSWYgYSBrZXlib2FyZCBzaG9ydGN1dCBpcyBpbXBsZW1lbnRlZCB1c2luZyBvbmx5IGxldHRlciwgcHVuY3R1YXRpb24sIG51bWJlciBvciBzeW1ib2wgY2hhcmFjdGVycywgdGhlbiB0aGUgc2hvcnRjdXQgY2FuIGJlIHR1cm5lZCBvZmYsIHJlbWFwcGVkIG9yIGFjdGl2YXRlZCBvbmx5IG9uIGZvY3VzLlwiLFxuICAgIFwiMi4yLjFcIjogXCJGb3IgZWFjaCB0aW1lIGxpbWl0IHRoYXQgaXMgc2V0IGJ5IHRoZSBjb250ZW50LCB0aGUgdXNlciBjYW4gdHVybiBvZmYsIGFkanVzdCwgb3IgZXh0ZW5kIHRoZSBsaW1pdC5cIixcbiAgICBcIjIuMi4yXCI6IFwiRm9yIG1vdmluZywgYmxpbmtpbmcsIHNjcm9sbGluZywgb3IgYXV0by11cGRhdGluZyBpbmZvcm1hdGlvbiwgdGhlIHVzZXIgY2FuIHBhdXNlLCBzdG9wLCBoaWRlIG9yIGFkanVzdCB0aGUgaW5mb3JtYXRpb24uXCIsXG4gICAgXCIyLjMuMVwiOiBcIkNvbnRlbnQgZG9lcyBub3QgY29udGFpbiBhbnl0aGluZyB0aGF0IGZsYXNoZXMgbW9yZSB0aGFuIHRocmVlIHRpbWVzIGluIGFueSBvbmUgc2Vjb25kIHBlcmlvZCwgb3IgdGhlIGZsYXNoIGlzIGJlbG93IHRoZSBnZW5lcmFsIGZsYXNoIGFuZCByZWQgZmxhc2ggdGhyZXNob2xkcy5cIixcbiAgICBcIjIuNC4xXCI6IFwiQSBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIHRvIGJ5cGFzcyBibG9ja3Mgb2YgY29udGVudCB0aGF0IGFyZSByZXBlYXRlZCBvbiBtdWx0aXBsZSBXZWIgcGFnZXMuXCIsXG4gICAgXCIyLjQuMlwiOiBcIldlYiBwYWdlcywgbm9uLXdlYiBkb2N1bWVudHMsIGFuZCBzb2Z0d2FyZSBoYXZlIHRpdGxlcyB0aGF0IGRlc2NyaWJlIHRvcGljIG9yIHB1cnBvc2UuXCIsXG4gICAgXCIyLjQuM1wiOiBcIklmIGNvbnRlbnQgY2FuIGJlIG5hdmlnYXRlZCBzZXF1ZW50aWFsbHkgYW5kIHRoZSBuYXZpZ2F0aW9uIHNlcXVlbmNlcyBhZmZlY3QgbWVhbmluZyBvciBvcGVyYXRpb24sIGZvY3VzYWJsZSBjb21wb25lbnRzIHJlY2VpdmUgZm9jdXMgaW4gYW4gb3JkZXIgdGhhdCBwcmVzZXJ2ZXMgbWVhbmluZyBhbmQgb3BlcmFiaWxpdHkuXCIsXG4gICAgXCIyLjQuNFwiOiBcIlRoZSBwdXJwb3NlIG9mIGVhY2ggbGluayBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBsaW5rIHRleHQgYWxvbmUgb3IgZnJvbSB0aGUgbGluayB0ZXh0IHRvZ2V0aGVyIHdpdGggaXRzIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZCBsaW5rIGNvbnRlbnQuXCIsXG4gICAgXCIyLjQuNVwiOiBcIk1vcmUgdGhhbiBvbmUgd2F5IGlzIGF2YWlsYWJsZSB0byBsb2NhdGUgYSBXZWIgcGFnZSB3aXRoaW4gYSBzZXQgb2YgV2ViIHBhZ2VzLCBleGNlcHQgd2hlcmUgdGhlIFdlYiBQYWdlIGlzIHRoZSByZXN1bHQgb2YsIG9yIGEgc3RlcCBpbiwgYSBwcm9jZXNzLlwiLFxuICAgIFwiMi40LjZcIjogXCJIZWFkaW5ncyBhbmQgbGFiZWxzIGRlc2NyaWJlIHRvcGljIG9yIHB1cnBvc2UuXCIsXG4gICAgXCIyLjQuN1wiOiBcIkFueSBrZXlib2FyZCBvcGVyYWJsZSB1c2VyIGludGVyZmFjZSBoYXMgYSBtb2RlIG9mIG9wZXJhdGlvbiB3aGVyZSB0aGUga2V5Ym9hcmQgZm9jdXMgaW5kaWNhdG9yIGlzIHZpc2libGUuXCIsXG4gICAgXCIyLjUuMVwiOiBcIkFsbCBmdW5jdGlvbmFsaXR5IHRoYXQgdXNlcyBtdWx0aXBvaW50IG9yIHBhdGgtYmFzZWQgZ2VzdHVyZXMgZm9yIG9wZXJhdGlvbiBjYW4gYmUgb3BlcmF0ZWQgd2l0aCBhIHNpbmdsZSBwb2ludGVyIHdpdGhvdXQgYSBwYXRoLWJhc2VkIGdlc3R1cmUuXCIsXG4gICAgXCIyLjUuMlwiOiBcIkZvciBmdW5jdGlvbmFsaXR5IHRoYXQgY2FuIGJlIG9wZXJhdGVkIHVzaW5nIGEgc2luZ2xlIHBvaW50ZXIsIGNvbXBsZXRpb24gb2YgdGhlIGZ1bmN0aW9uIGlzIG9uIHRoZSB1cC1ldmVudCB3aXRoIGFuIGFiaWxpdHkgdG8gYWJvcnQsIHVuZG8gb3IgcmV2ZXJzZSB0aGUgb3V0Y29tZS5cIixcbiAgICBcIjIuNS4zXCI6IFwiRm9yIHVzZXIgaW50ZXJmYWNlIGNvbXBvbmVudHMgd2l0aCBsYWJlbHMgdGhhdCBpbmNsdWRlIHRleHQgb3IgaW1hZ2VzIG9mIHRleHQsIHRoZSBhY2Nlc3NpYmxlIG5hbWUgY29udGFpbnMgdGhlIHRleHQgdGhhdCBpcyBwcmVzZW50ZWQgdmlzdWFsbHkuXCIsXG4gICAgXCIyLjUuNFwiOiBcIkZ1bmN0aW9uYWxpdHkgdGhhdCBjYW4gYmUgb3BlcmF0ZWQgYnkgbW90aW9uIGNhbiBhbHNvIGJlIG9wZXJhdGVkIGJ5IHVzZXIgaW50ZXJmYWNlIGNvbXBvbmVudHMsIGFuZCB0aGUgbW90aW9uIHRyaWdnZXIgY2FuIGJlIGRpc2FibGVkLlwiLFxuICAgIFwiMy4xLjFcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiBXZWIgcGFnZXMsIG5vbi1XZWIgZG9jdW1lbnRzLCBvciBzb2Z0d2FyZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4xLjJcIjogXCJUaGUgaHVtYW4gbGFuZ3VhZ2Ugb2YgZWFjaCBwYXNzYWdlIG9yIHBocmFzZSBpbiB0aGUgY29udGVudCBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4yLjFcIjogXCJXaGVuIGFueSBjb21wb25lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGRvZXMgbm90IGluaXRpYXRlIGEgY2hhbmdlIG9mIGNvbnRleHQuXCIsXG4gICAgXCIzLjIuMlwiOiBcIkNoYW5naW5nIHRoZSBzZXR0aW5nIG9mIGFueSB1c2VyIGludGVyZmFjZSBjb21wb25lbnQgZG9lcyBub3QgYXV0b21hdGljYWxseSBjYXVzZSBhIGNoYW5nZSBvZiBjb250ZXh0IHVubGVzcyB0aGUgdXNlciBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBiZWhhdmlvciBiZWZvcmUgdXNpbmcgdGhlIGNvbXBvbmVudC5cIixcbiAgICBcIjMuMi4zXCI6IFwiTmF2aWdhdGlvbmFsIG1lY2hhbmlzbXMgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzIHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgb2NjdXIgaW4gdGhlIHNhbWUgcmVsYXRpdmUgb3JkZXIgZWFjaCB0aW1lIHRoZXkgYXJlIHJlcGVhdGVkLCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4yLjRcIjogXCJDb21wb25lbnRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgYXJlIGlkZW50aWZpZWQgY29uc2lzdGVudGx5LlwiLFxuICAgIFwiMy4zLjFcIjogXCJJZiBhbiBpbnB1dCBlcnJvciBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLCB0aGUgaXRlbSB0aGF0IGlzIGluIGVycm9yIGlzIGlkZW50aWZpZWQgYW5kIHRoZSBlcnJvciBpcyBkZXNjcmliZWQgdG8gdGhlIHVzZXIgaW4gdGV4dC5cIixcbiAgICBcIjMuMy4yXCI6IFwiTGFiZWxzIG9yIGluc3RydWN0aW9ucyBhcmUgcHJvdmlkZWQgd2hlbiBjb250ZW50IHJlcXVpcmVzIHVzZXIgaW5wdXQuXCIsXG4gICAgXCIzLjMuM1wiOiBcIklmIGFuIGlucHV0IGVycm9yIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYW5kIHN1Z2dlc3Rpb25zIGZvciBjb3JyZWN0aW9uIGFyZSBrbm93biwgdGhlbiB0aGUgc3VnZ2VzdGlvbnMgYXJlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLCB1bmxlc3MgaXQgd291bGQgamVvcGFyZGl6ZSB0aGUgc2VjdXJpdHkgb3IgcHVycG9zZSBvZiB0aGUgY29udGVudC5cIixcbiAgICBcIjMuMy40XCI6IFwiRm9yIGNvbnRlbnQgdGhhdCBjYXVzZSBsZWdhbCBjb21taXRtZW50cyBvciBmaW5hbmNpYWwgdHJhbnNhY3Rpb25zIGZvciB0aGUgdXNlciB0byBvY2N1ciwgdGhhdCBtb2RpZnkgb3IgZGVsZXRlIHVzZXItY29udHJvbGxhYmxlIGRhdGEgaW4gZGF0YSBzdG9yYWdlIHN5c3RlbXMsIG9yIHRoYXQgc3VibWl0IHVzZXIgdGVzdCByZXNwb25zZXMsIHRoZSB1c2VyIGNhbiByZXZlcnNlLCBjb3JyZWN0LCBvciBjb25maXJtIHRoZSBhY3Rpb24uXCIsXG4gICAgXCI0LjEuMVwiOiBcIkluIGNvbnRlbnQgaW1wbGVtZW50ZWQgdXNpbmcgbWFya3VwIGxhbmd1YWdlcywgZWxlbWVudHMgaGF2ZSBjb21wbGV0ZSBzdGFydCBhbmQgZW5kIHRhZ3MsIGVsZW1lbnRzIGFyZSBuZXN0ZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHNwZWNpZmljYXRpb25zLCBlbGVtZW50cyBkbyBub3QgY29udGFpbiBkdXBsaWNhdGUgYXR0cmlidXRlcywgYW5kIGFueSBJRHMgYXJlIHVuaXF1ZSwgZXhjZXB0IHdoZXJlIHRoZSBzcGVjaWZpY2F0aW9ucyBhbGxvdyB0aGVzZSBmZWF0dXJlcy5cIixcbiAgICBcIjQuMS4yXCI6IFwiRm9yIGFsbCB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZm9ybSBlbGVtZW50cywgbGlua3MgYW5kIGNvbXBvbmVudHMgZ2VuZXJhdGVkIGJ5IHNjcmlwdHMpLCB0aGUgbmFtZSBhbmQgcm9sZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkOyBzdGF0ZXMsIHByb3BlcnRpZXMsIGFuZCB2YWx1ZXMgdGhhdCBjYW4gYmUgc2V0IGJ5IHRoZSB1c2VyIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IHNldDsgYW5kIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIHRvIHRoZXNlIGl0ZW1zIGlzIGF2YWlsYWJsZSB0byB1c2VyIGFnZW50cywgaW5jbHVkaW5nIGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXMuXCIsXG4gICAgXCI0LjEuM1wiOiBcIkluIGNvbnRlbnQgaW1wbGVtZW50ZWQgdXNpbmcgbWFya3VwIGxhbmd1YWdlcywgc3RhdHVzIG1lc3NhZ2VzIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQgdGhyb3VnaCByb2xlIG9yIHByb3BlcnRpZXMgc3VjaCB0aGF0IHRoZXkgY2FuIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciBieSBhc3Npc3RpdmUgdGVjaG5vbG9naWVzIHdpdGhvdXQgcmVjZWl2aW5nIGZvY3VzLlwiLFxufVxuXG5leHBvcnQgbGV0IGExMXlSdWxlc2V0czogUnVsZXNldFtdID0gW1xuICAgIC8vIHtcbiAgICAvLyAgICAgaWQ6IFwiREVCVUdcIixcbiAgICAvLyAgICAgbmFtZTogXCJERUJVRyBSdWxlc1wiLFxuICAgIC8vICAgICBjYXRlZ29yeTogZVJ1bGVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgIC8vICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgZGVidWdnaW5nXCIsXG4gICAgLy8gICAgIGNoZWNrcG9pbnRzOiBbe1xuICAgIC8vICAgICAgICAgbnVtOiBcIjFcIixcbiAgICAvLyAgICAgICAgIG5hbWU6IFwiRGVidWcgQ1AgMVwiLFxuICAgIC8vICAgICAgICAgd2NhZ0xldmVsOiBcIkFcIixcbiAgICAvLyAgICAgICAgIHN1bW1hcnk6IFwiUnVsZXMgZm9yIERlYnVnXCJcbiAgICAvLyAgICAgfV1cbiAgICAvLyB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiRVhURU5TSU9OU1wiLFxuICAgICAgICBuYW1lOiBcIkV4dGVuc2lvbiBSdWxlc1wiLFxuICAgICAgICBjYXRlZ29yeTogZVJ1bGVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgZW5hYmxpbmcgdGhlIGJyb3dzZXIgZXh0ZW5zaW9uc1wiLFxuICAgICAgICB0eXBlOiBlUnVsZXNldFR5cGUuRVhURU5TSU9OLFxuICAgICAgICBjaGVja3BvaW50czogW3tcbiAgICAgICAgICAgIG51bTogXCIxXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkV4dGVuc2lvbiBDUCAxXCIsXG4gICAgICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRXh0ZW5zaW9uXCJcbiAgICAgICAgfV1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiSUJNX0FjY2Vzc2liaWxpdHlcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eVwiLFxuICAgICAgICBjYXRlZ29yeTogZVJ1bGVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjEgQUEgcGx1cyBhZGRpdGlvbmFsIElCTSBjaGVja2xpc3Qgc3VwcGxlbWVudGFsIHJlcXVpcmVtZW50cy5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiKSlcbiAgICAgICAgICAgIC5tYXAoc2MgPT4gKHtcbiAgICAgICAgICAgICAgICBudW06IHNjLm51bSxcbiAgICAgICAgICAgICAgICBzY0lkOiBzYy5zY0lkLFxuICAgICAgICAgICAgICAgIG5hbWU6IHNjLmhhbmRsZSxcbiAgICAgICAgICAgICAgICB3Y2FnTGV2ZWw6IHNjLmxldmVsLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHN1bW1hcmllc1tzYy5udW1dXG4gICAgICAgICAgICB9KSlcbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiV0NBR18yXzFcIixcbiAgICAgICAgbmFtZTogXCJXQ0FHIDIuMSAoQSwgQUEpXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlUnVsZUNhdGVnb3J5LkFDQ0VTU0lCSUxJVFksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJ1bGVzIGZvciBXQ0FHIDIuMSBBQS4gVGhpcyBpcyB0aGUgY3VycmVudCBXM0MgcmVjb21tZW5kYXRpb24uIENvbnRlbnQgdGhhdCBjb25mb3JtcyB0byBXQ0FHIDIuMSBhbHNvIGNvbmZvcm1zIHRvIFdDQUcgMi4wLlwiLFxuICAgICAgICAvLyBUaGlzIHJ1bGVzZXQgaGFzIGFsbCAyLjAgYW5kIDIuMSBjaGVja3BvaW50cyB0aGF0IGFyZSBBIG9yIEFBXG4gICAgICAgIGNoZWNrcG9pbnRzOiBTQ3NcbiAgICAgICAgICAgIC5maWx0ZXIoc2MgPT4gKHNjLmxldmVsID09PSBcIkFcIiB8fCBzYy5sZXZlbCA9PT0gXCJBQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMFwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4wIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVSdWxlQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wIEFBLiBSZWZlcmVuY2VkIGJ5IFVTIFNlY3Rpb24gNTA4LCBidXQgbm90IHRoZSBsYXRlc3QgVzNDIHJlY29tbWVuZGF0aW9uLlwiLFxuICAgICAgICAvLyBUaGlzIHJ1bGVzZXQgaGFzIGFsbCAyLjAgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiKSlcbiAgICAgICAgICAgIC5tYXAoc2MgPT4gKHtcbiAgICAgICAgICAgICAgICBudW06IHNjLm51bSxcbiAgICAgICAgICAgICAgICBzY0lkOiBzYy5zY0lkLFxuICAgICAgICAgICAgICAgIG5hbWU6IHNjLmhhbmRsZSxcbiAgICAgICAgICAgICAgICB3Y2FnTGV2ZWw6IHNjLmxldmVsLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHN1bW1hcmllc1tzYy5udW1dXG4gICAgICAgICAgICB9KSlcbiAgICB9XG5dXG5cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5cbnR5cGUgUHNldWRvQ2xhc3MgPSBcIjpob3ZlclwiIHwgXCI6YWN0aXZlXCIgfCBcIjpmb2N1c1wiIHwgXCI6Zm9jdXMtdmlzaWJsZVwiIHwgXCI6Zm9jdXMtd2l0aGluXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Rvck1hdGNoZXNFbGVtKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHNlbGVjdG9yLnRyaW0oKSA9PT0gXCJcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQubWF0Y2hlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQubWF0Y2hlcyhzZWxlY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQubWF0Y2hlc1NlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5tYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTmF0aXZlIGZ1bmN0aW9ucyBub3QgdGhlcmUsIGZhbGxiYWNrXG4gICAgICAgIGxldCBtYXRjaGVzID0gKGVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudC5vd25lckRvY3VtZW50KS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgICAgbGV0IGkgPSAwO1xuXG4gICAgICAgIHdoaWxlIChpIDwgbWF0Y2hlcy5sZW5ndGggJiYgbWF0Y2hlc1tpXSAhPT0gZWxlbWVudCkge1xuICAgICAgICAgICAgKytpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGkgPCBtYXRjaGVzLmxlbmd0aDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQmFkIHNlbGVjdG9yPyBEb2Vzbid0IG1hdGNoIHRoZW4uLi5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdHlsZSBjb21wdXRlZCBmb3IgdGhpcyBlbGVtZW50XG4gKiBAcGFyYW0gZWxlbSBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbTogSFRNTEVsZW1lbnQsIHBzZXVkb0VsdD86IFBzZXVkb0NsYXNzKSB7XG4gICAgY29uc3QgZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xuICAgIGNvbnN0IHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICByZXR1cm4gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSwgcHNldWRvRWx0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdHlsZSBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnRcbiAqIFxuICogVGhpcyBkaWZmZXJzIGZyb20gdGhlIGNvbXB1dGVkIHN0eWxlIGluIHRoYXQgdGhlIGNvbXB1dGVkIHN0eWxlIHdpbGwgcmV0dXJuXG4gKiBzdHlsZXMgZGVmaW5lZCBieSB0aGUgdXNlciBhZ2VudC4gVGhpcyB3aWxsIG9ubHkgcmV0dXJuIHN0eWxlcyBkZWZpbmVkIGJ5IHRoZVxuICogYXBwbGljYXRpb25cbiAqIGlmIHJvdGF0aW9uIHRyYW5zZm9ybSBpcyB1c2VkLCB0aGUgY29tcHV0ZWQgc3R5bGUgcmV0dXJucyB0aGUgcmVzb2x2ZWQgbWF0cml4XG4gKiAgd2hpbGUgdGhlIGRlZmluZWQgc3R5bGUgcmV0dXJuIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24ocykgXG4gKiBmb3IgZXhhbXBsZSwgZm9yICd0cmFuc2Zvcm06IHJvdGF0ZSgyLjVkZWcpOycsIHRoZSBjb21wdXRlZCBzdHlsZSByZXR1cm5zICdtYXRyaXgoLTAuMDQzNjE5NCwgMC45OTkwNDgsIC0wLjk5OTA0OCwgLTAuMDQzNjE5NCwgMCwgMCknIFxuICogIGFuZCB0aGUgZGVmaW5lZCBzdHlsZSByZXR1cm5zICdyb3RhdGUoMi41ZGVnKScgIFxuICogXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtIFxuICogQHBhcmFtIHtzdHJpbmd9IFtwc2V1ZG9DbGFzc10gSWYgc3BlY2lmaWVkLCB3aWxsIHJldHVybiB2YWx1ZXMgdGhhdCBhcmUgZGlmZmVyZW50XG4gKiB0aGFuIHdoZW4gdGhlIHBzZXVkb0NsYXNzIGRvZXMgbm90IG1hdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmaW5lZFN0eWxlcyhlbGVtOiBIVE1MRWxlbWVudCwgcHNldWRvQ2xhc3M/OiBQc2V1ZG9DbGFzcykge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiRnVuY3Rpb246IGdldERlZmluZWRTdHlsZXNcIik7XG4gICAgbGV0IGRlZmluZWRTdHlsZXMgPSB7fTtcbiAgICBsZXQgZGVmaW5lZFN0eWxlUHNldWRvID0ge307XG4gICAgXG4gICAgZnVuY3Rpb24gZmlsbFN0eWxlKG1hcHMsIHN0eWxlKSB7XG4gICAgICAgIGZvciAobGV0IHNJbmRleD0wOyBzSW5kZXggPCBzdHlsZS5sZW5ndGg7ICsrc0luZGV4KSB7XG4gICAgICAgICAgICBpZiAoc3R5bGVbc0luZGV4XSA9PT0gXCJhbGxcIiAmJiBzdHlsZVtzdHlsZVtzSW5kZXhdXSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbWFwW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHN0eWxlW3NJbmRleF07XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXAgb2YgbWFwcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJpb3JpdHkgPSBzdHlsZS5nZXRQcm9wZXJ0eVByaW9yaXR5KGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgaW4gbWFwICYmIG1hcFtrZXldLmVuZHNXaXRoKFwiIWltcG9ydGFudFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmlvcml0eSA9PT0gJ2ltcG9ydGFudCcgJiYgIW1hcFtrZXldLnN0YXJ0c1dpdGgoXCJpbmhlcml0XCIpICYmICFtYXBba2V5XS5zdGFydHNXaXRoKFwidW5zZXRcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vdmVycmlkZSAhaW1wb3J0YW50IG9ubHkgaWYgaXQgaXMgYWxzbyAhaW1wb3J0YW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwW2tleV0gPSBzdHlsZVtrZXldICsgXCIgIWltcG9ydGFudFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBvdmVycmlkZSAhaW1wb3J0YW50IGlmIGl0IGlzIG5vdCAhaW1wb3J0YW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jcmVhdGUvb3ZlcmlkZSBhbnl3YXlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcFtrZXldID0gc3R5bGVba2V5XSArIChwcmlvcml0eSA9PT0gJ2ltcG9ydGFudCcgPyBcIiAhaW1wb3J0YW50XCIgOiBcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IFxuXG4gICAgbGV0IHN0b3JlZFN0eWxlcyA9IGdldENhY2hlKGVsZW0sIFwiUlBUVXRpbF9EZWZpbmVkU3R5bGVzXCIsIG51bGwpO1xuICAgIGlmICghcHNldWRvQ2xhc3MgJiYgc3RvcmVkU3R5bGVzICE9PSBudWxsKSAge1xuICAgICAgICBkZWZpbmVkU3R5bGVzID0gc3RvcmVkU3R5bGVzW1wiZGVmaW5lZFN0eWxlc1wiXTtcbiAgICAgICAgZGVmaW5lZFN0eWxlUHNldWRvID0gc3RvcmVkU3R5bGVzW1wiZGVmaW5lZFN0eWxlUHNldWRvXCJdO1xuICAgIH0gZWxzZSB7ICBcbiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgc3R5bGVzaGVldHMgYW5kIHJ1bGVzXG4gICAgICAgIGZvciAobGV0IHNzSW5kZXggPSAwOyBzc0luZGV4IDwgZWxlbS5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgKytzc0luZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBzaGVldCA9IGVsZW0ub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQuY3NzUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJHb3Qgc2hlZXRcIik7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiR290IHJ1bGU6IFwiLCBzaGVldC5jc3NSdWxlc1tySW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSBzaGVldC5jc3NSdWxlc1tySW5kZXhdIGFzIENTU1N0eWxlUnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxSdWxlU2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdWxsUnVsZVNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNldWRvTWF0Y2ggPSBmdWxsUnVsZVNlbGVjdG9yLm1hdGNoKC9eKC4qKSg6W2EtekEtWi1dKikkLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzUHNldWRvQ2xhc3MgPSAhIXBzZXVkb01hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxNYWluID0gaGFzUHNldWRvQ2xhc3MgPyBwc2V1ZG9NYXRjaFsxXSA6IGZ1bGxSdWxlU2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsUHNldWRvID0gaGFzUHNldWRvQ2xhc3MgPyBwc2V1ZG9NYXRjaFsyXSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2FtZVBzZXVkb0NsYXNzID0gc2VsUHNldWRvID09PSBwc2V1ZG9DbGFzcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHNldWRvQ2xhc3MgJiYgcHNldWRvQ2xhc3MgPT09IFwiOmZvY3VzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBlbGVtZW50IGhhcyBmb2N1cywgcmVtb3ZlIGZvY3VzLXdpdGhpbiBmcm9tIHBhcmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsTWFpbiA9IHNlbE1haW4ucmVwbGFjZSgvKFsgPl1bXit+ID5dKyk6Zm9jdXMtd2l0aGluL2csIFwiJDFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHN0eWxlcyBvZiBub24tcHNldWRvIHNlbGVjdG9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzUHNldWRvQ2xhc3MgJiYgc2VsZWN0b3JNYXRjaGVzRWxlbShlbGVtLCBzZWxNYWluKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsU3R5bGUoW2RlZmluZWRTdHlsZXMsIGRlZmluZWRTdHlsZVBzZXVkb10sIHJ1bGUuc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYW1lUHNldWRvQ2xhc3MgJiYgc2VsZWN0b3JNYXRjaGVzRWxlbShlbGVtLCBzZWxNYWluKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsU3R5bGUoW2RlZmluZWRTdHlsZVBzZXVkb10sIHJ1bGUuc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVyci50b1N0cmluZygpLmluY2x1ZGVzKFwiQ2Fubm90IGFjY2VzcyBydWxlc1wiKSAmJiAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJTZWN1cml0eUVycm9yOlwiKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vXG5cbiAgICAgICAgLy8gSGFuZGxlZCB0aGUgc3R5bGVzaGVldHMsIG5vdyBoYW5kbGUgdGhlIGVsZW1lbnQgZGVmaW5lZCBzdHlsZXNcbiAgICAgICAgZmlsbFN0eWxlKFtkZWZpbmVkU3R5bGVzLCBkZWZpbmVkU3R5bGVQc2V1ZG9dLCBlbGVtLnN0eWxlKTtcbiAgICAgICAgc2V0Q2FjaGUoZWxlbSwgXCJSUFRVdGlsX0RlZmluZWRTdHlsZXNcIiwge2RlZmluZWRTdHlsZXMsIGRlZmluZWRTdHlsZVBzZXVkb30pO1xuICAgIH0gICAgXG4gICAgLyoqXG4gICAgICogJ2luaXRpYWwnIHNldHMgdGhlIHN0eWxlIGJhY2sgdG8gZGVmYXVsdFxuICAgIGZvciAoY29uc3Qga2V5IGluIGRlZmluZWRTdHlsZXMpIHtcbiAgICAgICAgaWYgKGRlZmluZWRTdHlsZXNba2V5XSA9PT0gXCJpbml0aWFsXCIpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBkZWZpbmVkU3R5bGVzW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGVmaW5lZFN0eWxlUHNldWRvKSB7XG4gICAgICAgIGlmIChkZWZpbmVkU3R5bGVQc2V1ZG9ba2V5XSA9PT0gXCJpbml0aWFsXCIpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBkZWZpbmVkU3R5bGVQc2V1ZG9ba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAqL1xuICAgICAgICBcbiAgICBpZiAoIXBzZXVkb0NsYXNzKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW0RFQlVHOiBDU1NVdGlsOjpnZXREZWZpbmVkU3R5bGVzXVwiLCBlbGVtLm5vZGVOYW1lLCBwc2V1ZG9DbGFzcywgSlNPTi5zdHJpbmdpZnkoZGVmaW5lZFN0eWxlcywgbnVsbCwgMikpO1xuICAgICAgICByZXR1cm4gZGVmaW5lZFN0eWxlcztcbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkZWZpbmVkU3R5bGVQc2V1ZG8pIHtcbiAgICAgICAgICAgIGlmIChkZWZpbmVkU3R5bGVQc2V1ZG9ba2V5XSA9PT0gZGVmaW5lZFN0eWxlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGRlZmluZWRTdHlsZVBzZXVkb1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW0RFQlVHOiBDU1NVdGlsOjpnZXREZWZpbmVkU3R5bGVzXVwiLCBlbGVtLm5vZGVOYW1lLCBwc2V1ZG9DbGFzcywgSlNPTi5zdHJpbmdpZnkoZGVmaW5lZFN0eWxlUHNldWRvLCBudWxsLCAyKSk7XG4gICAgICAgIHJldHVybiBkZWZpbmVkU3R5bGVQc2V1ZG87XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG1lZGlhIHF1ZXJ5IGRlZmluZWQgZm9yIHRoZSBkb2N1bWVudFxuICogXG4gKiBcbiAqIEBwYXJhbSB7RG9jdW1lbnR9IGRvYyBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1lZGlhT3JpZW50YXRpb25UcmFuc2Zvcm0oZG9jOiBEb2N1bWVudCkge1xuICAgIGxldCBvcmllbnRhdGlvblRyYW5zZm9ybXMgPSB7fVxuICAgIFxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHN0eWxlc2hlZXRzIGFuZCBydWxlc1xuICAgIGZvciAobGV0IHNzSW5kZXggPSAwOyBzc0luZGV4IDwgZG9jLnN0eWxlU2hlZXRzLmxlbmd0aDsgKytzc0luZGV4KSB7XG4gICAgICAgIGNvbnN0IHNoZWV0ID0gZG9jLnN0eWxlU2hlZXRzW3NzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQuY3NzUnVsZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBySW5kZXggPCBzaGVldC5jc3NSdWxlcy5sZW5ndGg7ICsrckluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoZWV0UnVsZSA9IHNoZWV0LmNzc1J1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGlmICg0IC8qIENTU1J1bGUuTUVESUFfUlVMRSAqLyA9PT0gc2hlZXRSdWxlLk1FRElBX1JVTEUpIHsgXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBydWxlID0gc2hlZXRSdWxlIGFzIENTU01lZGlhUnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlICYmIHJ1bGUubWVkaWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYUxpc3QgPSBydWxlLm1lZGlhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVkaWFMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbGVtX3RyYW5zZm9ybXMgPSBvcmllbnRhdGlvblRyYW5zZm9ybXNbbWVkaWFMaXN0Lml0ZW0oaSkudG9Mb2NhbGVMb3dlckNhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWxlbV90cmFuc2Zvcm1zKSBlbGVtX3RyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBydWxlLmNzc1J1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0eWxlUnVsZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLyA9PT0gc3R5bGVSdWxlc1tpXS5TVFlMRV9SVUxFKSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbaV0gYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gc3R5bGVSdWxlLnNlbGVjdG9yVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gc3R5bGVSdWxlLnN0eWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzdHlsZXMubGVuZ3RoOyArK3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHN0eWxlc1tzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ0cmFuc2Zvcm1cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYWxsXCIgJiYgc3R5bGVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRyYW5zZm9ybXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3Jtc1trZXldID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1fdHJhbnNmb3Jtc1tzZWxlY3Rvcl0gPSB0cmFuc2Zvcm1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvblRyYW5zZm9ybXNbbWVkaWFMaXN0Lml0ZW0oaSkudG9Mb2NhbGVMb3dlckNhc2UoKV0gPSBlbGVtX3RyYW5zZm9ybXM7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKCFlcnIudG9TdHJpbmcoKS5pbmNsdWRlcyhcIkNhbm5vdCBhY2Nlc3MgcnVsZXNcIikgJiYgIWVyci50b1N0cmluZygpLmluY2x1ZGVzKFwiU2VjdXJpdHlFcnJvcjpcIikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9yaWVudGF0aW9uVHJhbnNmb3Jtcztcbn1cblxuLyoqXG4gKiBjb252ZXJ0IGdpdmVuIHJvdGF0aW9uIHRyYW5zZm9ybSBmdW5jdGlvbnMgdG8gdGhlIGRlZ3JlZSB0cmFuc2Zvcm1lZC4gXG4gKiBJZiBtdWx0aXBsZSBmdW5jdGlvbnMgYXJlIGdpdmVuLCB0aGVuIHRoZSBmdW5jdGlvbnMgYXJlIGFwcGxpZWQgbGluZWFybHkgaW4gdGhlIG9yZGVyLiBcbiAqICAgcm90YXRpb25fdHJhbnNmb3JtIGZ1bmN0aW9uIGV4YW1wbGU6ICByb3RhdGUoNDVkZWcpLCByb3RhdGUoMnR1cm4pLCByb3RhdGUoMnJhZCksIHJvdGF0ZTNkKDEsIDEsIDEsIDQ1ZGVnKSxcbiAqICAgICAgICByb3RhdGUoMnJhZCkgcm90YXRlM2QoMSwgMSwgMSwgNDVkZWcpXG4gKiBAcGFyYW0gcm90YXRpb25fdHJhbnNmb3JtIFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um90YXRpb25EZWdyZWUocm90YXRpb25fdHJhbnNmb3JtKSB7XG4gICAgbGV0IGRlZ3JlZSA9IDA7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyb3RhdGlvbl90cmFuc2Zvcm0pIHJldHVybiBkZWdyZWU7XG4gICAgICAgIC8vIG5vcm1hbGl6ZSB0aGUgcm90YXRpb25fdHJhbnNmb3JtXG4gICAgICAgIHJvdGF0aW9uX3RyYW5zZm9ybSA9IHJvdGF0aW9uX3RyYW5zZm9ybS5yZXBsYWNlQWxsKFwiLCBcIiwgXCIsXCIpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1fZnVuY3Rpb25zID0gcm90YXRpb25fdHJhbnNmb3JtLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9MDsgaSA8IHRyYW5zZm9ybV9mdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybV9mdW5jdGlvbiA9IHRyYW5zZm9ybV9mdW5jdGlvbnNbaV0udHJpbSgpO1xuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbiA9PT0gJycpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwicm90YXRlM2RcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBleGFtcGxlOiByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCByaWdodCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKVwiKTtcbiAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXRyaXggPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKGxlZnQrMSwgcmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0cml4KSB2YWx1ZXMgPSBtYXRyaXguc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzICYmIHZhbHVlcy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3RhdGlvbiA9IHZhbHVlc1szXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcm90YXRpb24pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24gPSByb3RhdGlvbi50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJ0dXJuXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZygwLCByb3RhdGlvbi5sZW5ndGggLSA0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSBudW0gKiAzNjA7IFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInJhZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoMCwgcm90YXRpb24ubGVuZ3RoIC0gMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gbnVtICogMTgwL01hdGguUEk7IFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoMCwgcm90YXRpb24ubGVuZ3RoIC0gMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlICs9IG51bTsgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFuc2Zvcm1fZnVuY3Rpb24uc3RhcnRzV2l0aChcInJvdGF0ZVwiKSB8fCB0cmFuc2Zvcm1fZnVuY3Rpb24uc3RhcnRzV2l0aChcInJvdGF0ZVpcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBleGFtcGxlOiByb3RhdGUoNDVkZWcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm90YXRpb24gPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKGxlZnQrMSwgcmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJvdGF0aW9uKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgcm90YXRpb24gPSByb3RhdGlvbi50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInR1cm5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoMCwgcm90YXRpb24ubGVuZ3RoIC0gNCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSA9IG51bSAqIDM2MDsgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJyYWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoMCwgcm90YXRpb24ubGVuZ3RoIC0gMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSA9IG51bSAqIDE4MC9NYXRoLlBJOyBcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZygwLCByb3RhdGlvbi5sZW5ndGggLSAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlICs9IG51bTsgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwibWF0cml4M2RcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHRocmVlIEV1bGVyIGFuZ2xlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0cml4ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLnN1YnN0cmluZyhsZWZ0KzEsIHJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRyaXgpIHZhbHVlcyA9IG1hdHJpeC5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpfYW5nbGUgPSBNYXRoLmF0YW4yKHZhbHVlc1s0XSwgdmFsdWVzWzVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JlZSArPSBNYXRoLnJvdW5kKE1hdGgucm91bmQoel9hbmdsZSAqIDE4MC9NYXRoLlBJKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJtYXRyaXhcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHRocmVlIEV1bGVyIGFuZ2xlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0cml4ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLnN1YnN0cmluZyhsZWZ0KzEsIHJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRyaXgpIHZhbHVlcyA9IG1hdHJpeC5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpfYW5nbGUgPSBNYXRoLmF0YW4yKHZhbHVlc1sxXSwgdmFsdWVzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JlZSArPSBNYXRoLnJvdW5kKE1hdGgucm91bmQoel9hbmdsZSAqIDE4MC9NYXRoLlBJKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB3aGlsZSAoZGVncmVlID49IDM2MCkgZGVncmVlIC09IDM2MDtcbiAgICAgICAgXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQ2Fubm90IHJldHJpZXZlIHJvdGF0aW9uIGRlZ3JlZTogXCIgKyBlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfSBcbiAgICByZXR1cm4gZGVncmVlOyBcbn1cblxuLyoqXG4gKiBDb252ZXJ0IENTUyBzdHlsZSBzdHJpbmcgdmFsdWVzIHRvIHBpeGVscy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgc3R5bGUgdmFsdWUgaW4gc3RyaW5nLCBzdWNoIGFzIDNyZW0sIDIzMHB4IGV0Yy5cbiAqIEBwYXJhbSB0YXJnZXQgZWxlbWVudC5cbiAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gKi9cbiBleHBvcnQgZnVuY3Rpb24gZ2V0UGl4ZWxzRnJvbVN0eWxlKHZhbHVlLCBlbGVtICkge1xuICAgIGlmICghdmFsdWUpIHJldHVybiAwO1xuICAgIGNvbnN0IHJlZ2V4ID0gLygtP1tcXGQuXSspKFthLXolXSopLztcbiAgICBsZXQgcGFyc2VkID0gdmFsdWUudHJpbSgpLm1hdGNoKHJlZ2V4KTtcbiAgICBpZiAocGFyc2VkWzJdID09PSAnJyB8fCBwYXJzZWRbMV0gPT09IDApIFxuICAgICAgIC8vbm8gemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgd2hpY2ggaXMgY29uc2lkZXJlZCBhcyBlcnJvciwgc28gaW1wbGljYWJsZVxuICAgICAgIHJldHVybiAwO1xuICAgIFxuICAgIGNvbnN0IHBpeGVscyA9IGNvbnZlcnRWYWx1ZTJQaXhlbHMocGFyc2VkWzJdLCBwYXJzZWRbMV0sIGVsZW0pO1xuICAgIHJldHVybiBwaXhlbHMgPT09IG51bGwgPyBwaXhlbHMgOiBwYXJzZUZsb2F0KHBpeGVscyk7XG59XG5cbi8qKlxuICogQ29udmVydCBhYnNvbHV0ZSBDU1MgbnVtZXJpY2FsIHZhbHVlcyB0byBwaXhlbHMuXG4gKlxuICogQHBhcmFtIHVuaXRWYWx1ZSBpbiBzdHJpbmdcbiAqIEBwYXJhbSB0YXJnZXQgZWxlbWVudC5cbiAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXQsIHVuaXRWYWx1ZSwgZWxlbSApIHtcbiAgICBpZiAodW5pdFZhbHVlID09IDApIHJldHVybiAwO1xuICAgIGNvbnN0IHN1cHBvcnRlZFVuaXRzID0ge1xuICAgICAgICAvLyBhYnNvbHV0ZSB1bml0XG4gICAgICAgICdweCc6IHZhbHVlID0+IHZhbHVlLFxuICAgICAgICAnY20nOiB2YWx1ZSA9PiB2YWx1ZSAqIDM3LjgsXG4gICAgICAgICdtbSc6IHZhbHVlID0+IHZhbHVlICogMy43OCxcbiAgICAgICAgJ3EnOiB2YWx1ZSA9PiB2YWx1ZSAqIDAuOTUsXG4gICAgICAgICdpbic6IHZhbHVlID0+IHZhbHVlICogOTYsXG4gICAgICAgICdwYyc6IHZhbHVlID0+IHZhbHVlICogMTYsXG4gICAgICAgICdwdCc6IHZhbHVlID0+IHZhbHVlICogMS4zMyxcbiAgICAgICAgXG4gICAgICAgIC8vIHJlbGF0aXZlIHVuaXRcbiAgICAgICAgJ3JlbSc6IHZhbHVlID0+IHZhbHVlICogcGFyc2VGbG9hdCggZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LXNpemUnKSApLFxuICAgICAgICAnZW0nOiB2YWx1ZSA9PiB2YWx1ZSAqIHBhcnNlRmxvYXQoIGdldENvbXB1dGVkU3R5bGUoZWxlbSkuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJykpLFxuICAgICAgICAndncnOiB2YWx1ZSA9PiB2YWx1ZSAvIDEwMCAqIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5pbm5lcldpZHRoLFxuICAgICAgICAndmgnOiB2YWx1ZSA9PiB2YWx1ZSAvIDEwMCAqIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5pbm5lckhlaWdodCxcbiAgICAgICAgJyUnOiAgdmFsdWUgPT4gdmFsdWUgLyAxMDAgKiBwYXJzZUZsb2F0KCBnZXRDb21wdXRlZFN0eWxlKGVsZW0pLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtc2l6ZScpKVxuICAgIH07XG5cbiAgICBpZiAoIHVuaXQgaW4gc3VwcG9ydGVkVW5pdHMgKVxuICAgICAgICByZXR1cm4gc3VwcG9ydGVkVW5pdHNbIHVuaXQgXSggdW5pdFZhbHVlICk7XG4gICAgXG4gICAgcmV0dXJuIG51bGw7XG59XG4gLypcbiAqIFJldHVybnMgaWYgdGhlIGZvbnQgZm9yIHZpc2libGUgdGV4dCBvZiB0aGUgZWxlbWVudCBpcyBkZWZpbmVkIGJ5IG1hdGVyaWFsIGljb25zXG4gKiAgXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtIFxuICovXG4gZXhwb3J0IGZ1bmN0aW9uIGlzTWF0ZXJpYWxJY29uRm9udChlbGVtOiBIVE1MRWxlbWVudCkge1xuICAgIC8vIFRPRE86IGNoZWNrIHRoZSBleGlzdGVuY2UgbWF0ZXJpYWwgaWNvbnMgdXNpbmcgZmV0Y2ggaW4gbm9kZSAxOCtcbiAgICAvLyBmb3Igbm93IChub2RlIDE2KSBqdXN0IGRlcnRlcm1pbmUgaWYgdGhlIHN0eWxlc2hlZXQgZm9yIHRoZSAnTWF0ZXJpYWwgSWNvbnMnIGV4aXN0cyBzdGF0aWNhbGx5LiBub3RlIHRoYXQgdGhlIGxvYWRpbmcgb2YgdGhlIGZvbnQgc3R5bGVzaGVldCBvY2N1cnMgYXQgcnVuIHRpbWUuXG4gICAgLy9saXN0IG9mIGtub3duIG1hdGVyaWFsIGljb25zIGFuZCBzdHlsZXNoZWV0IGxpbmtcbiAgICBjb25zdCBrbm93bl9pY29ucyA9IHtcbiAgICAgICAgJ01hdGVyaWFsIEljb25zJyA6IFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9pY29uP2ZhbWlseT1NYXRlcmlhbCtJY29uc1wiXG4gICAgfTtcbiAgICBjb25zdCBrbm93bl9jc3NfY2xhc3NlcyA9IHtcbiAgICAgICAgJ21hdGVyaWFsLWljb25zJyA6IFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9pY29uP2ZhbWlseT1NYXRlcmlhbCtJY29uc1wiXG4gICAgfTtcblxuICAgIC8vIG1hdGVyaWFsIGljb24gZm9udCBjYW4gYmUgZGVmaW5lZCBlaXRoZXIgYnkgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucycgb3IgYnkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiXG4gICAgbGV0IHN0eWxlcyA9IGdldERlZmluZWRTdHlsZXMoZWxlbSk7XG4gICAgbGV0IGZvbnRGYW1pbHkgPSBzdHlsZXNbJ2ZvbnQtZmFtaWx5J107XG4gICAgXG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgLy8gZm9udC1mYW1pbHkgc3BlY2lmaWVzIGEgcHJpb3JpdGl6ZWQgbGlzdCBvZiBvbmUgb3IgbW9yZSBmb250IGZhbWlseSBuYW1lcyBcbiAgICBpZiAoZm9udEZhbWlseSAmJiBmb250RmFtaWx5LnNwbGl0KFwiLFwiKVswXS5yZXBsYWNlKC9bJ1wiXSsvZywgJycpLnRyaW0oKSBpbiBrbm93bl9pY29ucylcbiAgICAgICAgZm91bmQgPSB0cnVlO1xuXG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgIGxldCBsaXN0ID0gIGVsZW0uY2xhc3NMaXN0O1xuICAgICAgIGZvciAobGV0IGNzc19jbGFzcyBpbiBrbm93bl9jc3NfY2xhc3Nlcykge1xuICAgICAgICAgICBpZiAobGlzdC5jb250YWlucyhjc3NfY2xhc3MpKSB7XG4gICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgfSBcbiAgICAgICB9XG4gICAgfSAgICBcbiAgICBpZiAoIWZvdW5kKSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgbGV0IHBhc3NlZCA9IGZhbHNlO1xuICAgIC8vIGNoZWNrIGlmIHRoZSBzdHlsZXNoZWV0IGZvciB0aGUgJ01hdGVyaWFsIEljb25zJyBleGlzdHMgc3RhdGljYWxseVxuICAgIGxldCBzaGVldHMgPSBlbGVtLm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHM7XG4gICAgZm9yIChsZXQgcyA9IDA7IHMgPCBzaGVldHMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgaWYgKHNoZWV0cyAmJiBzaGVldHMubGVuZ3RoID4gMCAmJiBPYmplY3QudmFsdWVzKGtub3duX2ljb25zKS5pbmRleE9mKHNoZWV0c1tzXS5ocmVmKSA+IC0xKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gXG4gICAgfSAgICAgICBcbiAgICByZXR1cm4gcGFzc2VkO1xuIH1cblxuIGV4cG9ydCBmdW5jdGlvbiBnZXRXZWlnaHROdW1iZXIoc3R5bGVWYWwpIHtcbiAgICBsZXQgbWFwID0ge1xuICAgICAgICBcImxpZ2h0XCI6IDEwMCxcbiAgICAgICAgXCJib2xkXCI6IDcwMFxuICAgIH07XG4gICAgbGV0IHJldFZhbCA9IHBhcnNlSW50KHN0eWxlVmFsKTtcbiAgICBpZiAocmV0VmFsKSByZXR1cm4gcmV0VmFsO1xuICAgIGlmIChzdHlsZVZhbCBpbiBtYXApXG4gICAgICAgIHJldHVybiBtYXBbc3R5bGVWYWxdO1xuICAgIHJldHVybiA0MDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb250SW5QaXhlbHMoc3R5bGVWYWwsIGVsZW0pIHtcbiAgICBsZXQgbWFwID0ge1xuICAgICAgICBcInh4LXNtYWxsXCI6IDE2LFxuICAgICAgICBcIngtc21hbGxcIjogMTAsXG4gICAgICAgIFwic21hbGxcIjogMTMsXG4gICAgICAgIFwibWVkaXVtXCI6IDE2LFxuICAgICAgICBcImxhcmdlXCI6IDE4LFxuICAgICAgICBcIngtbGFyZ2VcIjogMjQsXG4gICAgICAgIFwieHgtbGFyZ2VcIjogMzJcbiAgICB9O1xuICAgIGxldCB2YWx1ZSA9IHBhcnNlRmxvYXQoc3R5bGVWYWwpO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG1hcFtzdHlsZVZhbF07XG4gICAgfVxuICAgIGxldCB1bml0cyA9IHN0eWxlVmFsLnN1YnN0cmluZygoXCJcIiArIHZhbHVlKS5sZW5ndGgpO1xuICAgIC8qKlxuICAgICAgICBpZiAodW5pdHMgPT09IFwiXCIgfHwgdW5pdHMgPT09IFwicHhcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikgcmV0dXJuIHZhbHVlICogMTY7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCIlXCIpIHJldHVybiB2YWx1ZSAvIDEwMCAqIDE2O1xuICAgICAgICBpZiAodW5pdHMgPT09IFwicHRcIikgcmV0dXJuIHZhbHVlICogNCAvIDM7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICAqL1xuICAgIHJldHVybiBjb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXRzLCB2YWx1ZSwgZWxlbSApO1xuICAgXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENTU1N0eWxlKGVsZW1lbnQpIHtcbiAgICBsZXQgc3R5bGVUZXh0ID0gXCJcIjtcbiAgICBpZiAoZWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgIGlmIChlbGVtZW50LklCTV9DU1NfVEhCKSByZXR1cm4gZWxlbWVudC5JQk1fQ1NTX1RIQjtcbiAgICBsZXQgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC5pbm5lclRleHQ7XG4gICAgICAgIGlmIChzdHlsZVRleHQgPT09IHVuZGVmaW5lZCB8fCBzdHlsZVRleHQudHJpbSgpID09PSBcIlwiKVxuICAgICAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwic3R5bGVcIikpIHtcbiAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICB9IGVsc2UgcmV0dXJuIFtdO1xuICAgIGlmIChzdHlsZVRleHQgPT09IG51bGwgfHwgc3R5bGVUZXh0LnRyaW0oKS5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICAvL3JlbW92ZSBjb21tZW50IGJsb2Nrc1xuICAgIGxldCByZSA9IC8oXFwvXFwqKyg/Oig/Oig/OlteXFwqXSkrKXwoPzpbXFwqXSsoPyFcXC8pKSlbKl0rXFwvKXxcXC9cXC8uKi9nO1xuICAgIGxldCBzdWJzdCA9ICcgJztcbiAgICBzdHlsZVRleHQgPSBzdHlsZVRleHQucmVwbGFjZShyZSwgc3Vic3QpO1xuICAgIC8vIEZpbmQgYWxsIFwia2V5IDogdmFsO1wiIHBhaXJzIHdpdGggdmFyaW91cyB3aGl0ZXNwYWNlIGluYmV0d2VlblxuICAgIGxldCByS2V5VmFscyA9IC9cXHMqKFteOlxcc10rKVxccyo6XFxzKihbXjskfV0rKVxccyooO3wkKS9nO1xuICAgIC8vIEZpbmQgYWxsIFwic2VsZWN0b3IgeyBjc3NrZXl2YWxzIH0gd2l0aCB2YXJpb3VzIHdoaXRlc3BhY2UgaW5iZXR3ZWVuXG4gICAgbGV0IHJTZWxlY3RvcnMgPSAvXFxzKihbXntdKil7KFtefV0qKX0vZztcbiAgICBpZiAoc3R5bGVUZXh0LmluZGV4T2YoXCJ7XCIpID09PSAtMSkge1xuXG4gICAgICAgIGxldCBrZXlWYWxzID0ge307XG4gICAgICAgIGxldCBtO1xuICAgICAgICB3aGlsZSAoKG0gPSByS2V5VmFscy5leGVjKHN0eWxlVGV4dCkpICE9IG51bGwpIHtcbiAgICAgICAgICAgIGtleVZhbHNbbVsxXV0gPSBtWzJdLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgPSBbe1xuICAgICAgICAgICAgc2VsZWN0b3I6IG51bGwsXG4gICAgICAgICAgICB2YWx1ZXM6IGtleVZhbHNcbiAgICAgICAgfV07XG4gICAgICAgIGVsZW1lbnQuSUJNX0NTU19USEIgPSByZXRWYWw7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICBsZXQgbTtcbiAgICAgICAgbGV0IG0yO1xuICAgICAgICB3aGlsZSAoKG0gPSByU2VsZWN0b3JzLmV4ZWMoc3R5bGVUZXh0KSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGtleVZhbHMgPSB7fVxuICAgICAgICAgICAgbGV0IHNlbEtleSA9IG1bMV07XG4gICAgICAgICAgICBsZXQgc2VsVmFsID0gbVsyXTtcblxuICAgICAgICAgICAgd2hpbGUgKChtMiA9IHJLZXlWYWxzLmV4ZWMoc2VsVmFsKSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGtleVZhbHNbbTJbMV1dID0gbTJbMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXRWYWwucHVzaCh7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbEtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGtleVZhbHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQuSUJNX0NTU19USEIgPSByZXRWYWw7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVEb2N1bWVudCBleHRlbmRzIERvY3VtZW50IHtcbiAgICBhY2VDYWNoZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDYWNoZUVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgICBhY2VDYWNoZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxufVxuXG4vKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBnaXZlbiBnbG9iYWwgdmFyaWFibGVcbiAgICAgKiB3aXRoIGl0cyBpbml0aWFsIHZhbHVlIGFzIGdpdmVuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGUoY2FjaGVTcG90OiBFbGVtZW50IHwgRG9jdW1lbnQgfCBEb2N1bWVudEZyYWdtZW50LCBrZXlOYW1lLCBpbml0VmFsdWUpIHtcbiAgICBsZXQgY2FjaGVPYmogPSAoY2FjaGVTcG90Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLyB8fCBjYWNoZVNwb3Qubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLykgPyBjYWNoZVNwb3QgYXMgQ2FjaGVEb2N1bWVudCA6IGNhY2hlU3BvdCBhcyBDYWNoZUVsZW1lbnQ7XG4gICAgaWYgKGNhY2hlT2JqLmFjZUNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgIH1cbiAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGVba2V5TmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9IGluaXRWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWNoZShjYWNoZVNwb3Q6IERvY3VtZW50IHwgRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQgfCBTaGFkb3dSb290LCBnbG9iYWxOYW1lLCB2YWx1ZSkgOiBhbnkge1xuICAgIGxldCBjYWNoZU9iaiA9IChjYWNoZVNwb3Qubm9kZVR5cGUgPT09IDkgLyogTm9kZS5ET0NVTUVOVF9OT0RFICovIHx8IGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gMTEgLyogTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICovKSA/IGNhY2hlU3BvdCBhcyBDYWNoZURvY3VtZW50IDogY2FjaGVTcG90IGFzIENhY2hlRWxlbWVudDtcbiAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYWNoZU9iai5hY2VDYWNoZSA9IHt9XG4gICAgfVxuICAgIGNhY2hlT2JqLmFjZUNhY2hlW2dsb2JhbE5hbWVdID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNhY2hlcyhjYWNoZVJvb3QgOiBOb2RlKSA6IHZvaWQge1xuICAgIGRlbGV0ZSAoY2FjaGVSb290Lm93bmVyRG9jdW1lbnQgYXMgQ2FjaGVEb2N1bWVudCkuYWNlQ2FjaGU7XG4gICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihjYWNoZVJvb3QpO1xuICAgIGRvIHtcbiAgICAgICAgZGVsZXRlIChudy5ub2RlIGFzIENhY2hlRWxlbWVudCkuYWNlQ2FjaGU7XG4gICAgICAgIG53Lm5vZGUub3duZXJEb2N1bWVudCAmJiBkZWxldGUgKG53Lm5vZGUub3duZXJEb2N1bWVudCBhcyBDYWNoZURvY3VtZW50KS5hY2VDYWNoZTtcbiAgICB9IHdoaWxlIChudy5uZXh0Tm9kZSgpKTtcbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHtSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcblxuLyogXG4gKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIGEgdmFsaWQgQVJJQSByb2xlXG4gKiByZXR1cm46IG51bGwgaWYgbm8gZXhwbGljaXQgcm9sZSBpcyBkZWZpbmVkLCBcbiAqICAgICAgICAgdHJ1ZSBpZiB0aGUgcm9sZShzKSBhcmUgZGVmaW5lZCBpbiBBUklBXG4gKiAgICAgICAgIGZhbHNlIGlmIGFueSByb2xlIGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiovXG5leHBvcnQgZnVuY3Rpb24gYXJlUm9sZXNEZWZpbmVkKHJvbGVzOiBzdHJpbmdbXSkge1xuICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PTApIHJldHVybiBudWxsO1xuICAgIFxuICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICBmb3IgKGNvbnN0IHJvbGUgb2Ygcm9sZXMpIFxuICAgICAgICBpZiAoIShyb2xlLnRvTG93ZXJDYXNlKCkgaW4gZGVzaWduUGF0dGVybnMpKSBcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKiBcbiAqIGNoZWNrIGlmIGFueSBleHBsaWNpdCByb2xlIHNwZWNpZmllZCBmb3IgdGhlIGVsZW1lbnQgaXMgYSB2YWxpZCBBUklBIHJvbGVcbiAqIHJldHVybjogbnVsbCBpZiBubyBleHBsaWNpdCByb2xlIGlzIGRlZmluZWQsIFxuICogICAgICAgICB0cnVlIGlmIHRoZSByb2xlKHMpIGFyZSBkZWZpbmVkIGluIEFSSUFcbiAqICAgICAgICAgZmFsc2UgaWYgYW55IHJvbGUgaXMgbm90IGRlZmluZWQgaW4gQVJJQVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnZhbGlkUm9sZXMocnVsZUNvbnRleHQ6IEVsZW1lbnQpIHtcbiAgICBsZXQgZG9tUm9sZXM6IHN0cmluZ1tdID0gUlBUVXRpbC5nZXRVc2VyRGVmaW5lZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICBcbiAgICBpZiAoIWRvbVJvbGVzIHx8IGRvbVJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBjaGVjayB0aGUgJ2dlbmVyaWMnIHJvbGUgZmlyc3RcbiAgICBpZiAoZG9tUm9sZXMgJiYgZG9tUm9sZXMuaW5jbHVkZXMoJ2dlbmVyaWMnKSlcbiAgICAgICAgcmV0dXJuIFtcImdlbmVyaWNcIl07XG4gICAgXG4gICAgLy8gRmFpbGluZyByb2xlc1xuICAgIGxldCBmYWlsUm9sZVRva2VucyA9IFtdO1xuICAgIC8vIFBhc3Npbmcgcm9sZXNcbiAgICBsZXQgcGFzc1JvbGVUb2tlbnMgPSBbXTtcblxuICAgIGxldCB0YWdQcm9wZXJ0eSA9IFJQVFV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgbGV0IGFsbG93ZWRSb2xlcyA9IFJQVFV0aWwuZ2V0QWxsb3dlZEFyaWFSb2xlcyhydWxlQ29udGV4dCwgdGFnUHJvcGVydHkpO1xuICAgIGlmICghYWxsb3dlZFJvbGVzICYmIGFsbG93ZWRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBkb21Sb2xlcztcbiAgICBcbiAgICBsZXQgaW52YWxpZFJvbGVzID0gW107XG5cbiAgICBpZiAoYWxsb3dlZFJvbGVzICYmIGFsbG93ZWRSb2xlcy5pbmNsdWRlcygnYW55JykpXG4gICAgICAgIHJldHVybiBbXTtcbiAgICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbVJvbGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoIWFsbG93ZWRSb2xlcy5pbmNsdWRlcyhkb21Sb2xlc1tpXSkgJiYgIWludmFsaWRSb2xlcy5pbmNsdWRlcyhkb21Sb2xlc1tpXSkpXG4gICAgICAgICAgICBpbnZhbGlkUm9sZXMucHVzaChkb21Sb2xlc1tpXSk7XG5cbiAgICByZXR1cm4gaW52YWxpZFJvbGVzOyAgICAgICAgXG59XG5cbi8qIFxuICogY2hlY2sgaWYgYW55IGV4cGxpY2l0IHJvbGUgc3BlY2lmaWVkIGZvciB0aGUgZWxlbWVudCBpcyBub3QgZGVmaW5lZCBpbiBBUklBXG4gKiByZXR1cm46IGxpc3Qgb2Ygc3BlY2lmaWVkIHJvbGVzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEoZWxlbWVudDogRWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCByb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgIGxldCB1bmRlZmluZWRSb2xlcyA9IFtdO1xuICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCEocm9sZXNbaV0gaW4gZGVzaWduUGF0dGVybnMpKSB7XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkUm9sZXMucHVzaChyb2xlc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9ICAgIFxuICAgIHJldHVybiB1bmRlZmluZWRSb2xlczsgICAgICAgIFxufVxuXG4vKiBcbiAqIHRoaXMgbWV0aG9kIGZpcnN0IGNoZWNrcyBleHBsaWNpdCByb2xlcywgaWYgbm8gZXhwbGljaXQgcm9sZSwgaXQgd2lsbCBjaGVjayB0aGUgaW1wbGljaXQgcm9sZVxuICogcmV0dXJuOiBudWxsIGlmIGFueSBleHBsaWNpdCByb2xlIGlzIGludmFsaWQsIFxuICogICAgICAgICBhIGxpc3Qgb2YgaW52YWxpZCBhdHRyaWJ1dGVzXG4gKiAgICAgICAgIGVtcHR5IGxpc3QgaWYgYWxsIGF0dHJpYnV0ZXMgYXJlIHZhbGlkLCBvciBubyBhcmlhIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmllZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0OiBFbGVtZW50KTogc3RyaW5nW10ge1xuICAgIGxldCByb2xlcyA9IFJQVFV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgXG4gICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgLy8gZm9yIG11dGlwbGUgcm9sZXMsIHNraXAgaWYgYW55IHJvbGUgaXMgaW52YWxpZFxuICAgIGxldCBkZWZpbmVkID0gYXJlUm9sZXNEZWZpbmVkKHJvbGVzKTtcbiAgICBpZiAoZGVmaW5lZCAhPT1udWxsICYmICFkZWZpbmVkKSBcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgbGV0IGF0dHJzID0gW107XG4gICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT0gMClcbiAgICAgICAgcm9sZXMgPSAgUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgIFxuICAgIGxldCBhcmlhX2F0dHJzOiBzdHJpbmdbXSA9IFJQVFV0aWwuZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7ICBcbiAgICBcbiAgICBsZXQgdGFnUHJvcGVydHkgPSBSUFRVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgIC8vIEF0dHJpYnV0ZXMgYWxsb3dlZCBvbiB0aGlzIG5vZGVcbiAgICBsZXQgYWxsb3dlZEF0dHJpYnV0ZXMgPSBSUFRVdGlsLmdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcm9sZXMsIHRhZ1Byb3BlcnR5KTtcbiAgICBcbiAgICBpZiAoYXJpYV9hdHRycykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyaWFfYXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGFyaWFfYXR0cnNbaV0udHJpbSgpLnRvTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgaWYgKCFhbGxvd2VkQXR0cmlidXRlcy5pbmNsdWRlcyhhdHRyTmFtZSkgJiYgIWF0dHJzLmluY2x1ZGVzKGF0dHJOYW1lKSlcbiAgICAgICAgICAgICAgICBhdHRycy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cnM7XG59XG5cbi8qIFxuICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICogcmV0dXJuOiBhIGxpc3Qgb2YgQXJpYSBhbmQgSHRtbCBhdHRyaWJ1dGUgcGFpcnMgdGhhdCBhcmUgY29uZmxpY3RcbiovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmxpY3RBcmlhQW5kSHRtbEF0dHJpYnV0ZXMoZWxlbTogRWxlbWVudCkge1xuICAgIFxuICAgIGxldCBhcmlhQXR0cnMgPSBSUFRVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXJzKGVsZW0pO1xuICAgIGxldCBodG1sQXR0cnMgPSBSUFRVdGlsLmdldFVzZXJEZWZpbmVkSHRtbEF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXJzKGVsZW0pO1xuICAgIFxuICAgIGxldCByZXQgPSBbXTtcbiAgICBpZiAoYXJpYUF0dHJzICYmIGFyaWFBdHRycy5sZW5ndGggPiAwICYmIGh0bWxBdHRycyAmJiBodG1sQXR0cnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyaWFBdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZXhhbWluZWRIdG1sQXRyTmFtZXMgPSBSUFRVdGlsLmdldENvbmZsaWN0T3JPdmVybGFwcGluZ0h0bWxBdHRyaWJ1dGUoYXJpYUF0dHJzW2ldLCBodG1sQXR0cnMsICdjb25mbGljdCcpO1xuICAgICAgICAgICAgaWYgKGV4YW1pbmVkSHRtbEF0ck5hbWVzID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1bJ3Jlc3VsdCddID09PSAnRmFpbGVkJykgLy9mYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeydhcmlhQXR0cic6IGFyaWFBdHRyc1tpXVsnbmFtZSddLCAnaHRtbEF0dHInOiBpdGVtWydhdHRyJ119KTtcbiAgICAgICAgICAgIH0pOyAgICBcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG4vKiBcbiAqIGdldCBjb25mbGljdCBBcmlhIGFuZCBIdG1sIGF0dHJpYnV0ZXNcbiAqIHJldHVybjogYSBsaXN0IG9mIEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlIHBhaXJzIHRoYXQgYXJlIGNvbmZsaWN0XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSB7XG4gICAgaWYgKCFjb250ZXh0SGllcmFyY2hpZXMpIHJldHVybiBudWxsO1xuICAgIFxuICAgIHJldHVybiBjb250ZXh0SGllcmFyY2hpZXNbXCJhcmlhXCJdLmZpbHRlcihoaWVyID0+IFtcInRhYmxlXCIsIFwiZ3JpZFwiLCBcInRyZWVncmlkXCJdLmluY2x1ZGVzKGhpZXIucm9sZSkpO1xufVxuXG4vKiBcbiAqIGdldCBkZXByZWNhdGVkIEFyaWEgcm9sZXNcbiAqIHJldHVybjogYSBsaXN0IG9mIGRlcHJlY2F0ZWQgQXJpYSByb2xlc1xuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXByZWNhdGVkQXJpYVJvbGVzKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3Qgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICBsZXQgcmV0ID0gW107XG4gICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZ2xvYmFsRGVwcmVjYXRlZFJvbGVzID0gQVJJQURlZmluaXRpb25zLmdsb2JhbERlcHJlY2F0ZWRSb2xlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGdsb2JhbERlcHJlY2F0ZWRSb2xlcy5pbmNsdWRlcyhyb2xlc1tpXSkpXG4gICAgICAgICAgICAgICAgcmV0LnB1c2gocm9sZXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5cbi8qIFxuICogZ2V0IGRlcHJlY2F0ZWQgQXJpYSByb2xlLWF0dHJpYnV0ZXNcbiAqIHJldHVybjogYSBsaXN0IG9mIGRlcHJlY2F0ZWQgQXJpYSByb2xlLWF0dHJpYnV0ZXMgcGFyaXNcbiAqICAgICAgICAgZm9yIGdsb2JhbCB0aGUgcm9sZSBpcyBtYXJrZWQgYXMgJ2FueSdcbiovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVwcmVjYXRlZEFyaWFBdHRyaWJ1dGVzKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgbGV0IGRvbUF0dHJpYnV0ZXMgPSBlbGVtZW50LmF0dHJpYnV0ZXM7XG4gICAgbGV0IGFyaWFBdHRycyA9IFtdO1xuICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lOyBcbiAgICAgICAgICAgIGlmIChhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLScpIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRycy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYXJpYUF0dHJzLmxlbmd0aCA9PT0wKSByZXR1cm4gW107XG5cbiAgICBsZXQgcmV0ID0gW107XG4gICAgY29uc3QgZ2xvYmFsRGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBBUklBRGVmaW5pdGlvbnMuZ2xvYmFsRGVwcmVjYXRlZFByb3BlcnRpZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGdsb2JhbERlcHJlY2F0ZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKGFyaWFBdHRyc1tpXSkpXG4gICAgICAgICAgICByZXQucHVzaCh7XCJyb2xlXCI6XCJhbnlcIiwgXCJhdHRyaWJ1dGVcIjphcmlhQXR0cnNbaV19KTtcbiAgICB9XG4gICAgY29uc3Qgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByb2xlV2l0aERlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2ldXTtcbiAgICAgICAgICAgIGlmIChyb2xlV2l0aERlcHJlY2F0ZWRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpTmFtZXMgPSByb2xlV2l0aERlcHJlY2F0ZWRBdHRyaWJ1dGVzWydkZXByZWNhdGVkUHJvcHMnXTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpTmFtZXMgJiYgZGVwcmVjYXRlZEF0dHJpTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFyaWFBdHRycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHJlY2F0ZWRBdHRyaU5hbWVzLmluY2x1ZGVzKGFyaWFBdHRyc1tqXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeyBcInJvbGVcIjpyb2xlc1tpXSwgIFwiYXR0cmlidXRlXCI6IGFyaWFBdHRyc1tqXX0gKTtcbiAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDsgXG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vdjIvY29tbW9uL0NvbnRleHRcIlxuLy8gaW1wb3J0IHsgU2ltdWxhdG9yIH0gZnJvbSBcIi4vdjIvc2ltdWxhdG9yXCJcbmltcG9ydCB7IENoZWNrZXIgfSBmcm9tIFwiLi92NC9jaGVja2VyL0NoZWNrZXJcIlxuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSBcIi4vdjIvY29uZmlnL0NvbmZpZ1wiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5TdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggPSBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggfHwgZnVuY3Rpb24gKHN0cikge1xuICAgIHJldHVybiB0aGlzLmluZGV4T2Yoc3RyKSA9PT0gMDtcbn1cblN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgPSBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzIHx8IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleE9mKHN0cikgIT09IC0xO1xufVxuQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzID0gQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzIHx8IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleE9mKHN0cikgIT09IC0xO1xufVxuLypcbmZ1bmN0aW9uIHNpbURlbW8odGltZW91dD86IG51bWJlcikge1xuICAgIGlmICghdGltZW91dCkgdGltZW91dCA9IDA7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgbGV0IHNpbSA9IG5ldyBTaW11bGF0b3IoKTtcbiAgICAgICAgbGV0IHMgPSBzaW0ucmVuZGVySXRlbShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICBjb25zb2xlLmdyb3VwKFwiLS0tIEl0ZW0gVmlldyAtLS1cIik7XG4gICAgICAgIGNvbnNvbGUubG9nKHMpO1xuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXAoXCItLS0gTGluayBWaWV3IC0tLVwiKTtcbiAgICAgICAgcyA9IHNpbS5yZW5kZXJMaW5rKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnNvbGUubG9nKHMpO1xuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgfSwgdGltZW91dCk7XG59XG4qL1xuZnVuY3Rpb24gY2hlY2tEZW1vKHRpbWVvdXQ/OiBudW1iZXIpIHtcbiAgICBpZiAoIXRpbWVvdXQpIHRpbWVvdXQgPSAwO1xuICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIoKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBjaGVja2VyLmNoZWNrKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fRGVzaWduXCJdKVxuICAgICAgICAudGhlbihmdW5jdGlvbihyZXBvcnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcG9ydCk7XG4gICAgICAgICAgICBjb25zdCB2YWxzID0ge1xuICAgICAgICAgICAgICAgIFwiRkFJTFwiOiAwLFxuICAgICAgICAgICAgICAgIFwiUE9URU5USUFMXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJNQU5VQUxcIjogMixcbiAgICAgICAgICAgICAgICBcIlBBU1NcIjogM1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxyZXBvcnQucmVzdWx0cy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydC5yZXN1bHRzW2lkeF0udmFsdWVbMV0gPT09IFwiUEFTU1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydC5yZXN1bHRzLnNwbGljZShpZHgtLSwxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXBvcnQucmVzdWx0cy5zb3J0KChhLGIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYS5jYXRlZ29yeSAhPSBiLmNhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmNhdGVnb3J5LmxvY2FsZUNvbXBhcmUoYi5jYXRlZ29yeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhLnBhdGhbXCJhcmlhXCJdID09PSBiLnBhdGhbXCJhcmlhXCJdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxzW2EudmFsdWVbMV1dLXZhbHNbYi52YWx1ZVsxXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhLnBhdGhbXCJhcmlhXCJdLmxvY2FsZUNvbXBhcmUoYi5wYXRoW1wiYXJpYVwiXSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgbGV0IGxhc3RQYXRoID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBjYXRlZ29yeSA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXBvcnQucmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeSAhPT0gcmVzdWx0LmNhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBhdGggPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gcmVzdWx0LmNhdGVnb3J5O1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKHJlc3VsdC5jYXRlZ29yeSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5wYXRoW1wiYXJpYVwiXSAhPSBsYXN0UGF0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFBhdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsYXN0UGF0aCA9IHJlc3VsdC5wYXRoW1wiYXJpYVwiXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQYXRoID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKFwicGFnZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXAobGFzdFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC52YWx1ZSwgcmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9KTtcbiAgICB9LCB0aW1lb3V0KTtcbn1cblxuZXhwb3J0IHsgQ2hlY2tlciwgQ29udGV4dCwgQVJJQU1hcHBlciwgY2hlY2tEZW1vLCBDb25maWcvKiwgc2ltRGVtbyovLCBET01XYWxrZXIgfTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/rule-server/src/static/archives/2023.09.19/js/ace-node-debug.js b/rule-server/src/static/archives/2023.09.19/js/ace-node-debug.js
new file mode 100644
index 000000000..285387463
--- /dev/null
+++ b/rule-server/src/static/archives/2023.09.19/js/ace-node-debug.js
@@ -0,0 +1,28708 @@
+/*!
+ * 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__ = ({
+
+/***/ 9077:
+/***/ ((__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.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = 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 = {}));
+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 eRuleCategory;
+(function (eRuleCategory) {
+ eRuleCategory["ACCESSIBILITY"] = "Accessibility";
+ eRuleCategory["DESIGN"] = "Design";
+ eRuleCategory["OTHER"] = "Other";
+})(eRuleCategory = exports.eRuleCategory || (exports.eRuleCategory = {}));
+var eRulesetType;
+(function (eRulesetType) {
+ eRulesetType["DEFAULT"] = "default";
+ eRulesetType["EXTENSION"] = "extension";
+})(eRulesetType = exports.eRulesetType || (exports.eRulesetType = {}));
+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;
+
+
+/***/ }),
+
+/***/ 8235:
+/***/ ((__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: true,
+ 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: true,
+ 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: true,
+ 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: true,
+ 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']
+ },
+ "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: true,
+ 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: true,
+ 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: true,
+ 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
+ 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-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", "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: ["generic"],
+ 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: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["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-alt-text": {
+ implicitRole: ["img"],
+ //roleCondition: " when alt attribute has text (is not empty)",
+ validRoles: ["button", "checkbox", "doc-cover", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "progressbar", "radio", "scrollbar", "separator", "slider", "switch", "tab", "treeitem"],
+ globalAriaAttributesValid: true
+ },
+ "img-with-empty-alt": {
+ implicitRole: ["presentation"],
+ //roleCondition: " when alt attribute is empty",
+ validRoles: null,
+ globalAriaAttributesValid: false,
+ otherAllowedAriaAttributes: ["aria-hidden=true"]
+ },
+ "img-without-alt": {
+ implicitRole: ["img"],
+ //roleCondition: " when alt attribute, aria-label, or aria-labelledby are not present",
+ validRoles: null,
+ 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: ["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-grid-treegrid-row-scope": {
+ implicitRole: ["rowheader", "cell"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-table-grid-treegrid-column-scope": {
+ implicitRole: ["columnheader", "cell"],
+ 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: null
+ },
+ overlapping: {
+ ariaAttributeValue: "true",
+ htmlAttributeNames: ["hidden"],
+ htmlAttributeValues: 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 values are conflict
+ ariaAttributeValue: "none",
+ htmlAttributeNames: ["autocomplete"],
+ htmlAttributeValues: ["on"]
+ }
+ }
+ };
+ 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;
+
+
+/***/ }),
+
+/***/ 4944:
+/***/ (function(__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__(8235);
+var CommonMapper_1 = __webpack_require__(1794);
+var DOMUtil_1 = __webpack_require__(295);
+var legacy_1 = __webpack_require__(8422);
+var fragment_1 = __webpack_require__(482);
+var ARIAWalker_1 = __webpack_require__(8015);
+var CacheUtil_1 = __webpack_require__(7788);
+var DOMWalker_1 = __webpack_require__(7440);
+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 elem_1 = node;
+ for (var idx = 0; idx < elem_1.attributes.length; ++idx) {
+ var attrInfo = elem_1.attributes[idx];
+ var name_1 = attrInfo.name.toLowerCase();
+ if (name_1.startsWith("aria-")) {
+ retVal[name_1.substring(5)] = attrInfo.nodeValue;
+ }
+ }
+ var applyAttrRole = function (nodeName) {
+ if (!(nodeName in ARIAMapper.elemAttrValueCalculators))
+ return;
+ for (var attr in ARIAMapper.elemAttrValueCalculators[nodeName]) {
+ if (!(attr in retVal)) {
+ var value = ARIAMapper.elemAttrValueCalculators[nodeName][attr];
+ if (typeof value != "undefined" && value !== null) {
+ if (typeof value !== typeof "") {
+ value = value(elem_1);
+ }
+ retVal[attr] = value;
+ }
+ }
+ }
+ };
+ applyAttrRole("global");
+ applyAttrRole(node.nodeName.toLowerCase());
+ }
+ else if (node.nodeType === 3 /* Node.TEXT_NODE */) {
+ for (var attr in ARIAMapper.textAttrValueCalculators) {
+ var val = ARIAMapper.textAttrValueCalculators[attr](node);
+ if (typeof val != "undefined" && val !== null) {
+ retVal[attr] = val;
+ }
+ }
+ }
+ return retVal;
+ };
+ ARIAMapper.getAriaOwnedBy = function (elem) {
+ var doc = fragment_1.FragmentUtil.getOwnerFragment(elem);
+ if (!(0, CacheUtil_1.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);
+ for (var iId = 0; iId < ownIds.length; ++iId) {
+ var owned = doc.getElementById(ownIds[iId]);
+ //ignore if the aria-owns point to the element itself
+ if (owned && !DOMUtil_1.DOMUtil.sameNode(owner, owned)) {
+ (0, CacheUtil_1.setCache)(owned, "aria-owned", owner);
+ }
+ }
+ }
+ (0, CacheUtil_1.setCache)(doc, "ARIAMapper::precalcOwned", true);
+ }
+ return (0, CacheUtil_1.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) || "none",
+ rolePath: parentInfo.rolePath + "/" + (this.getRole(node) || "none"),
+ roleCount: {},
+ childrenCanHaveRole: parentInfo.childrenCanHaveRole
+ });
+ return nodeHierarchy;
+ }
+ else {
+ var elem = node;
+ var nodeHierarchy = (0, CacheUtil_1.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_1 = ARIAMapper.getAriaOwnedBy(elem);
+ if (!parent_1) {
+ parent_1 = DOMWalker_1.DOMWalker.parentElement(elem);
+ }
+ while (parent_1 && parent_1.nodeType !== 1) {
+ parent_1 = DOMWalker_1.DOMWalker.parentElement(elem);
+ }
+ var parentHierarchy = parent_1 ? this.getNodeHierarchy(parent_1) : [];
+ var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : {
+ role: "",
+ rolePath: "",
+ roleCount: {},
+ childrenCanHaveRole: true
+ };
+ while (parentInfo.role === "none" || parentInfo.role === "/none") {
+ parent_1 = ARIAMapper.getAriaOwnedBy(parent_1) || DOMWalker_1.DOMWalker.parentElement(parent_1);
+ parentHierarchy = parent_1 ? this.getNodeHierarchy(parent_1) : [];
+ 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) || "none",
+ rolePath: "",
+ roleCount: {},
+ childrenCanHaveRole: true
+ };
+ // Adjust role if we're within a presentational container
+ var presentationalContainer = !parentInfo.childrenCanHaveRole;
+ if (presentationalContainer) {
+ nodeInfo.role = "none";
+ }
+ else {
+ nodeInfo.childrenCanHaveRole = parentInfo.childrenCanHaveRole
+ && this.childrenCanHaveRole(elem, nodeInfo.role);
+ }
+ // Set the paths
+ if (nodeInfo.role !== "none") {
+ 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);
+ (0, CacheUtil_1.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[0] === "/") {
+ this.hierarchyResults[idx].role = this.hierarchyResults[idx].role.substring(1);
+ }
+ }
+ 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 !== "none") {
+ 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_2 = DOMWalker_1.DOMWalker.parentElement(node);
+ this.hierarchyResults = parent_2 ? (0, CacheUtil_1.getCache)(parent_2, "ARIAMapper::getNodeInfo", []) : [];
+ }
+ return retVal;
+ };
+ ARIAMapper.computeName = function (cur) {
+ ++ARIAMapper.nameComputationId;
+ return ARIAMapper.computeNameHelp(ARIAMapper.nameComputationId, cur, false, false);
+ };
+ ARIAMapper.computeNameHelp = function (walkId, cur, labelledbyTraverse, walkTraverse) {
+ // 2g. None of the other content applies to text nodes, so just do this first
+ if (cur.nodeType === 3 /* Node.TEXT_NODE */)
+ return cur.nodeValue;
+ if (cur.nodeType === 11)
+ return "";
+ if (cur.nodeType !== 1 /* Node.ELEMENT_NODE */) {
+ if (walkTraverse || labelledbyTraverse)
+ return "";
+ throw new Error("Can only compute name on Element and Text " + cur.nodeType);
+ }
+ var elem = cur;
+ // We've been here before - prevent recursion
+ if ((0, CacheUtil_1.getCache)(elem, "data-namewalk", null) === "" + walkId)
+ return "";
+ (0, CacheUtil_1.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 && !DOMWalker_1.DOMWalker.isNodeVisible(cur)) {
+ return "";
+ }
+ // 2b. collect valid id references
+ if (!labelledbyTraverse && elem.hasAttribute("aria-labelledby")) {
+ var labelledby = elem.getAttribute("aria-labelledby").split(" ");
+ var validElems = [];
+ for (var _i = 0, labelledby_1 = labelledby; _i < labelledby_1.length; _i++) {
+ var ref = labelledby_1[_i];
+ var refElem = fragment_1.FragmentUtil.getById(cur, ref);
+ if (refElem && !DOMUtil_1.DOMUtil.sameNode(elem, refElem)) {
+ validElems.push(refElem);
+ }
+ }
+ if (validElems.length > 0) {
+ var accumulated = "";
+ for (var _a = 0, validElems_1 = validElems; _a < validElems_1.length; _a++) {
+ var elem_2 = validElems_1[_a];
+ accumulated += " " + this.computeNameHelp(walkId, elem_2, 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
+ var role = ARIAMapper.nodeToRole(cur);
+ var 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_1.DOMUtil.cleanWhitespace(elem.getAttribute("alt")).trim();
+ }
+ if (cur.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").length > 0) {
+ var label = elem.ownerDocument.querySelector("label[for='" + elem.getAttribute("id") + "']");
+ if (label) {
+ if (label.hasAttribute("aria-label") || (label.hasAttribute("aria-labelledby") && !legacy_1.RPTUtil.isIdReferToSelf(cur, label.getAttribute("aria-labelledby")))) {
+ return this.computeNameHelp(walkId, label, false, false);
+ }
+ else {
+ return label.textContent;
+ }
+ }
+ }
+ if (cur.nodeName.toLowerCase() === "fieldset") {
+ if (cur.querySelector("legend")) {
+ var legend = 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") {
+ var 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")) {
+ var selected = fragment_1.FragmentUtil.getById(elem, "aria-activedescendant");
+ if (selected && !DOMUtil_1.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_1.ARIADefinitions.nameFromContent(role) || labelledbyTraverse) {
+ // 2fi. Set the accumulated text to the empty string.
+ var 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.
+ var 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.assignedNodes() || elem.assignedNodes().length === 0) {
+ var innerText = legacy_1.RPTUtil.getInnerText(elem);
+ if (innerText && innerText !== null && innerText.trim().length > 0)
+ accumulated += " " + innerText;
+ }
+ else {
+ // check text from all assigned nodes
+ for (var _b = 0, _c = elem.assignedNodes(); _b < _c.length; _b++) {
+ var slotChild = _c[_b];
+ var nextChildContent = ARIAMapper.computeNameHelp(walkId, slotChild, labelledbyTraverse, true);
+ accumulated += " " + nextChildContent;
+ }
+ }
+ }
+ else {
+ var walkChild = elem.firstChild;
+ while (walkChild) {
+ var nextChildContent = ARIAMapper.computeNameHelp(walkId, walkChild, labelledbyTraverse, true);
+ accumulated += " " + nextChildContent;
+ walkChild = walkChild.nextSibling;
+ }
+ }
+ var 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") {
+ var 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;
+ }
+ 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 = roles_1[_i];
+ if (role === "presentation" || role === "none") {
+ // If element is focusable, then presentation roles are to be ignored
+ if (!legacy_1.RPTUtil.isFocusable(elem)) {
+ return null;
+ }
+ }
+ else if (role in ARIADefinitions_1.ARIADefinitions.designPatterns) {
+ return role;
+ }
+ }
+ }
+ //return this.elemToImplicitRole(elem);
+ var roles = legacy_1.RPTUtil.getImplicitRole(elem);
+ return !roles || roles.length === 0 ? null : roles[0];
+ };
+ ////////////////////////////////////////////////////////////////////////////
+ // Helper functions
+ ////
+ // https://www.w3.org/TR/html-aam-1.0/#mapping-html-to-accessibility-apis
+ ARIAMapper.elemAttrValueCalculators = {
+ "global": {
+ "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) {
+ if (elem.getAttribute("type") === "checkbox" || elem.getAttribute("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; throw new Error("NOT IMPLEMENTED"); }
+ // - type="radio" and not in menu value reflecting the elements position
+ // within the radio button group."
+ ,
+ "posinset": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); }
+ // 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; throw new Error("NOT IMPLEMENTED"); }
+ },
+ "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 = parent.querySelectorAll("li");
+ var otherlis = 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 = 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;
+
+
+/***/ }),
+
+/***/ 8015:
+/***/ ((__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__(482);
+var DOMWalker_1 = __webpack_require__(7440);
+var ARIAMapper_1 = __webpack_require__(4944);
+/**
+ * Walks in an ARIA order
+ *
+ * See also ../dom/DOMWalker
+ */
+var ARIAWalker = /** @class */ (function () {
+ function ARIAWalker(element, bEnd, root) {
+ this.root = root || element;
+ this.node = element;
+ 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"
+ && DOMWalker_1.DOMWalker.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 */
+ && DOMWalker_1.DOMWalker.isNodeVisible(elementNode)
+ && elementNode.shadowRoot
+ && elementNode.shadowRoot.firstChild) {
+ var ownerElement = this.node;
+ this.node = elementNode.shadowRoot;
+ this.node.ownerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1
+ && elementNode.nodeName.toLowerCase() === "slot"
+ && slotElement.assignedNodes().length > 0) {
+ //TODO: need to conside its own content, a slot may have its own content or assigned content
+ var slotOwner = this.node;
+ this.node = slotElement.assignedNodes()[0];
+ this.node.slotOwner = slotOwner;
+ this.node.slotIndex = 0;
+ }
+ else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) /* Node.ELEMENT_NODE */ && this.node.firstChild) {
+ this.node = this.node.firstChild;
+ }
+ 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.slotOwner;
+ delete this.node.slotIndex;
+ if (nextSlotIndex < slotOwner.assignedNodes().length) {
+ this.node = slotOwner.assignedNodes()[nextSlotIndex];
+ this.node.slotOwner = slotOwner;
+ this.node.slotIndex = 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 (this.node.nextSibling) {
+ this.node = this.node.nextSibling;
+ 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 () {
+ 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"
+ && DOMWalker_1.DOMWalker.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 */
+ && DOMWalker_1.DOMWalker.isNodeVisible(elementNode)
+ && elementNode.shadowRoot
+ && elementNode.shadowRoot.lastChild) {
+ var ownerElement = this.node;
+ this.node = elementNode.shadowRoot;
+ this.node.ownerElement = ownerElement;
+ }
+ else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) && this.node.lastChild) {
+ this.node = this.node.lastChild;
+ }
+ else {
+ this.bEndTag = false;
+ }
+ }
+ else {
+ if (this.atRoot()) {
+ return false;
+ }
+ else if (this.node.previousSibling) {
+ this.node = this.node.previousSibling;
+ 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 === 1 && this.node.getAttribute("aChecker") === "ACE"));
+ return true;
+ };
+ return ARIAWalker;
+}());
+exports.ARIAWalker = ARIAWalker;
+
+
+/***/ }),
+
+/***/ 9193:
+/***/ ((__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;
+
+
+/***/ }),
+
+/***/ 482:
+/***/ ((__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;
+
+
+/***/ }),
+
+/***/ 2527:
+/***/ ((__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;
+
+
+/***/ }),
+
+/***/ 8422:
+/***/ (function(__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.NodeWalker = exports.RPTUtil = void 0;
+var CacheUtil_1 = __webpack_require__(7788);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var ARIAMapper_1 = __webpack_require__(4944);
+var DOMWalker_1 = __webpack_require__(7440);
+var VisUtil_1 = __webpack_require__(8174);
+var fragment_1 = __webpack_require__(482);
+var CSSUtil_1 = __webpack_require__(1775);
+var DOMUtil_1 = __webpack_require__(295);
+var RPTUtil = /** @class */ (function () {
+ function RPTUtil() {
+ }
+ RPTUtil.isDefinedAriaAttributeAtIndex = function (ele, index) {
+ var attrName = ele.attributes[index].name;
+ return RPTUtil.isDefinedAriaAttribute(ele, attrName);
+ };
+ /**
+ * this method returns user-defined aria attribute name from dom
+ * @param ele element
+ * @returns user defined aria attributes
+ */
+ RPTUtil.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
+ */
+ RPTUtil.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
+ */
+ RPTUtil.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
+ */
+ RPTUtil.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"
+ */
+ RPTUtil.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 RPTUtil.ariaAttributeImplicitMappings) {
+ if (tag in RPTUtil.ariaAttributeImplicitMappings[attributeName]) {
+ retVal = RPTUtil.ariaAttributeImplicitMappings[attributeName][tag];
+ if (typeof (retVal) === "function") {
+ retVal = retVal(ele);
+ }
+ }
+ else if ("*" in RPTUtil.ariaAttributeImplicitMappings[attributeName]) {
+ retVal = RPTUtil.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 RPTUtil.ariaAttributeRoleDefaults && attributeName in RPTUtil.ariaAttributeRoleDefaults[role]) {
+ retVal = RPTUtil.ariaAttributeRoleDefaults[role][attributeName];
+ if (typeof (retVal) === "function") {
+ retVal = retVal(ele);
+ }
+ }
+ }
+ // Still not defined? Check global defaults
+ if (!retVal && attributeName in RPTUtil.ariaAttributeGlobalDefaults) {
+ retVal = RPTUtil.ariaAttributeGlobalDefaults[attributeName];
+ }
+ return retVal;
+ };
+ RPTUtil.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
+ */
+ RPTUtil.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("tabindex")) {
+ return parseInt(element.getAttribute("tabindex")) >= 0;
+ }
+ // Explicit cases handled - now the implicit
+ var nodeName = element.nodeName.toLowerCase();
+ if (nodeName in RPTUtil.tabTagMap) {
+ var retVal = RPTUtil.tabTagMap[nodeName];
+ if (typeof (retVal) === "function") {
+ retVal = retVal(element);
+ }
+ return retVal;
+ }
+ else {
+ return false;
+ }
+ };
+ RPTUtil.tabIndexLEZero = function (elem) {
+ if (RPTUtil.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
+ */
+ RPTUtil.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 NodeWalker(element);
+ while (nw.nextNode() && nw.node != element) {
+ if (nw.node.nodeType == 1 && !nw.bEndTag && RPTUtil.isTabbable(nw.node)) {
+ ++count;
+ }
+ }
+ }
+ return count;
+ };
+ //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.
+ RPTUtil.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;
+ };
+ RPTUtil.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;
+ };
+ RPTUtil.normalizeSpacing = function (s) {
+ return s.trim().replace(/\s+/g, ' ');
+ };
+ ;
+ RPTUtil.nonExistantIDs = function (node, targetids) {
+ var returnnotfoundids = '';
+ if (RPTUtil.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 (RPTUtil.normalizeSpacing(returnnotfoundids).length >= 2)
+ returnnotfoundids = returnnotfoundids.substring(0, returnnotfoundids.length - 2);
+ else
+ returnnotfoundids = '';
+ return returnnotfoundids;
+ };
+ RPTUtil.getDocElementsByTag = function (elem, tagName) {
+ var doc = fragment_1.FragmentUtil.getOwnerFragment(elem);
+ tagName = tagName.toLowerCase();
+ var cache = (0, CacheUtil_1.getCache)(doc, "RPT_DOCELEMSBYTAG", {});
+ if (!(tagName in cache)) {
+ cache[tagName] = doc.querySelectorAll(tagName);
+ (0, CacheUtil_1.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: RPTUtil.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 RPTUtil
+ */
+ RPTUtil.getChildByTag = function (parentElem, tagName) {
+ return RPTUtil.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 RPTUtil
+ */
+ RPTUtil.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 && !RPTUtil.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: RPTUtil.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 RPTUtil
+ */
+ RPTUtil.getElementsByRole = function (doc, roles) {
+ return RPTUtil.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 RPTUtil
+ */
+ RPTUtil.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 = (0, CacheUtil_1.getCache)(doc, "RPTUtil_GETELEMENTSBY_ROLE_IMPLICIT", null);
+ }
+ else {
+ roleToElems = (0, CacheUtil_1.getCache)(doc, "RPTUtil_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 NodeWalker(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 = RPTUtil.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 && RPTUtil.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) {
+ (0, CacheUtil_1.setCache)(doc, "RPTUtil_GETELEMENTSBY_ROLE_IMPLICIT", roleToElems);
+ }
+ else {
+ (0, CacheUtil_1.setCache)(doc, "RPTUtil_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;
+ };
+ /**
+ * 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 RPTUtil
+ */
+ RPTUtil.getUserDefinedRoles = function (ele) {
+ return RPTUtil.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 RPTUtil
+ */
+ RPTUtil.getRoles = function (ele, considerImplicitRoles) {
+ var roles = [];
+ if (ele && ele.hasAttribute && ele.hasAttribute("role")) {
+ var attrRoles = RPTUtil.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 = RPTUtil.getImplicitRole(ele);
+ if (implicitRole !== null && implicitRole.length > 0) {
+ //add implicit roles to the attributes roles.
+ RPTUtil.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 RPTUtil
+ */
+ RPTUtil.getImplicitRole = function (ele) {
+ if (!ele || ele.nodeType !== 1)
+ return [];
+ var implicitRoles = (0, CacheUtil_1.getCache)(ele, "RPTUtil_ImplicitRole", null);
+ if (!implicitRoles) {
+ var tagProperty = RPTUtil.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 = RPTUtil.getUserDefinedAriaAttributes(ele);
+ if (domAriaAttributes_1.length === 0) {
+ (0, CacheUtil_1.setCache)(ele, "RPTUtil_ImplicitRole", []);
+ return [];
+ }
+ var roleAttributes = [];
+ var pattern = ARIADefinitions_1.ARIADefinitions.designPatterns['generic'];
+ if (pattern.reqProps && pattern.reqProps.length > 0)
+ RPTUtil.concatUniqueArrayItemList(pattern.reqProps, roleAttributes);
+ if (tagProperty.globalAriaAttributesValid)
+ RPTUtil.concatUniqueArrayItemList(ARIADefinitions_1.ARIADefinitions.globalProperties, roleAttributes);
+ if (pattern.deprecatedProps && pattern.deprecatedProps.length > 0)
+ RPTUtil.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 = RPTUtil.reduceArrayItemList(['generic'], tagProperty.implicitRole);
+ (0, CacheUtil_1.setCache)(ele, "RPTUtil_ImplicitRole", implicit);
+ return implicit;
+ }
+ }
+ (0, CacheUtil_1.setCache)(ele, "RPTUtil_ImplicitRole", tagProperty.implicitRole);
+ return tagProperty.implicitRole;
+ }
+ (0, CacheUtil_1.setCache)(ele, "RPTUtil_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 RPTUtil
+ */
+ RPTUtil.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 && RPTUtil.isFocusable(ele)) {
+ requiredAttributes = RPTUtil.concatUniqueArrayItemList(["aria-valuenow"], requiredAttributes || []);
+ }
+ return requiredAttributes;
+ }
+ else {
+ return null;
+ }
+ };
+ /**
+ * Test if the ele node is focusable
+ */
+ RPTUtil.isFocusable = function (ele) {
+ if (ele === "undefined" || ele === null) {
+ return false;
+ }
+ return RPTUtil.isTabbable(ele);
+ };
+ /**
+ * 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 RPTUtil
+ *
+ * Consider to use hasRoleInSemantics() instead.
+ */
+ RPTUtil.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 = RPTUtil.getImplicitRole(ele);
+ if (implicitRole !== null && implicitRole.length > 0) {
+ RPTUtil.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 RPTUtil
+ */
+ RPTUtil.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 = RPTUtil.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 RPTUtil
+ */
+ RPTUtil.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 = RPTUtil.getImplicitRole(ele);
+ if (impRoles !== null && impRoles.length > 0)
+ retVal = true;
+ }
+ return retVal;
+ };
+ RPTUtil.isDataTable = function (tableNode) {
+ return !(RPTUtil.hasRole(tableNode, "none") || RPTUtil.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
+ */
+ RPTUtil.isComplexDataTable = function (table) {
+ if ("RPTUtil_isComplexDataTable" in table) {
+ return !!table.RPTUtil_isComplexDataTable;
+ }
+ var isComplexTable = false;
+ if (table && RPTUtil.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")) &&
+ RPTUtil.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") && RPTUtil.normalizeSpacing(tdNodes[k].getAttribute("headers")).split(" ").length > 2)) &&
+ RPTUtil.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 && !RPTUtil.tableHeaderExists(table);
+ }
+ }
+ table.RPTUtil_isComplexDataTable = isComplexTable;
+ return isComplexTable;
+ };
+ // Return true if a table cell is hidden or contain no data:
+ RPTUtil.isTableCellEmpty = function (cell) {
+ if (!cell || !VisUtil_1.VisUtil.isNodeVisible(cell) || cell.innerHTML.replace(/ /g, ' ').trim().length === 0)
+ return true;
+ return false;
+ };
+ // Return true if a table row is hidden or contain no data: or
+ RPTUtil.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 = RPTUtil.isTableCellEmpty(cell);
+ }
+ return passed;
+ };
+ // Return true if a table's header is in the first row or column
+ RPTUtil.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 , , and 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 = RPTUtil.isTableRowEmpty(firstRow);
+ }
+ //table contain no data:
+ 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 = RPTUtil.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 (RPTUtil.isTableCellEmpty(cell))
+ continue;
+ if (cell.nodeName.toLowerCase() === 'td') {
+ if (!cell.getAttribute('headers') || cell.getAttribute('headers').trim().length === 0)
+ passed = false;
+ else
+ RPTUtil.concatUniqueArrayItemList(cell.getAttribute('headers').trim().split(" "), tdHeaders);
+ }
+ else if (cell.nodeName.toLowerCase() === 'th' && cell.getAttribute('id') && cell.getAttribute('id').trim().length > 0)
+ RPTUtil.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;
+ };
+ RPTUtil.isNodeInGrid = function (node) {
+ return RPTUtil.getAncestorWithRole(node, "grid") != null;
+ };
+ RPTUtil.isLayoutTable = function (tableNode) {
+ return RPTUtil.hasRole(tableNode, "presentation") || RPTUtil.hasRole(tableNode, "none");
+ };
+ RPTUtil.getFileExt = function (url) {
+ var m = url.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/);
+ if (m != null && m.length >= 2) {
+ return "." + m[1];
+ }
+ return "";
+ };
+ RPTUtil.getFileAnchor = function (url) {
+ var m = url.match(/#(([^;?\.]|^$)+)([;?]|$)/);
+ if (m != null && m.length >= 2) {
+ return m[1];
+ }
+ return "";
+ };
+ RPTUtil.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 = RPTUtil.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 = RPTUtil.getChildByTagHidden(node, "param", false, true);
+ for (var i = 0; !retVal && params != null && i < params.length; ++i) {
+ retVal = params[i].hasAttribute("value") &&
+ extTest(RPTUtil.getFileExt(params[i].getAttribute("value")));
+ }
+ }
+ return retVal;
+ };
+ RPTUtil.isAudioObjEmbedLink = function (node) {
+ return RPTUtil.checkObjEmbed(node, RPTUtil.isAudioExt, function (mime) {
+ return mime.startsWith("audio");
+ });
+ };
+ RPTUtil.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 RPTUtil.valInArray(ext.toLowerCase(), audio_extensions);
+ };
+ RPTUtil.isVideoObjEmbedLink = function (node) {
+ return RPTUtil.checkObjEmbed(node, RPTUtil.isVideoExt, function (mime) {
+ return mime.startsWith("video") ||
+ mime.startsWith("application/x-shockwave-flash");
+ });
+ };
+ RPTUtil.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 RPTUtil.valInArray(ext.toLowerCase(), video_extensions);
+ };
+ RPTUtil.isImageObjEmbedLink = function (node) {
+ return RPTUtil.checkObjEmbed(node, RPTUtil.isImgExt, function (mime) {
+ return mime.startsWith("image");
+ });
+ };
+ RPTUtil.isImgExt = function (ext) {
+ var image_extensions = [".bmp", ".gif", ".jpg", ".jpeg", ".pcx", ".png"];
+ return RPTUtil.valInArray(ext.toLowerCase(), image_extensions);
+ };
+ RPTUtil.isHtmlExt = function (ext) {
+ var html_extensions = [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm",
+ ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml"
+ ];
+ return RPTUtil.valInArray(ext.toLowerCase(), html_extensions);
+ };
+ RPTUtil.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 RPTUtil.valInArray(node.nodeName.toLowerCase(), presentationalElements);
+ };
+ RPTUtil.hasTriggered = function (doc, id) {
+ return (0, CacheUtil_1.getCache)(doc, id, false);
+ };
+ RPTUtil.triggerOnce = function (doc, id, passed) {
+ if (passed)
+ return true;
+ var triggered = (0, CacheUtil_1.getCache)(doc, id, false);
+ (0, CacheUtil_1.setCache)(doc, id, true);
+ return triggered;
+ };
+ /* determine if the given value exists in the given array */
+ RPTUtil.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
+ */
+ RPTUtil.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
+ RPTUtil.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;
+ };
+ /**
+ * 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 RPTUtil
+ */
+ RPTUtil.getAncestorWithRole = function (element, roleName, considerImplicitRoles) {
+ var walkNode = DOMWalker_1.DOMWalker.parentNode(element);
+ while (walkNode !== null) {
+ if (considerImplicitRoles) {
+ if (RPTUtil.hasRoleInSemantics(walkNode, roleName)) {
+ break;
+ }
+ }
+ else {
+ if (RPTUtil.hasRole(walkNode, roleName, false)) {
+ break;
+ }
+ }
+ walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode);
+ }
+ return walkNode;
+ };
+ /**
+ * return the ancestor with the given style properties.
+ *
+ * @parm {element} element - The element to start the node walk on to find parent node
+ * @parm {[string]} 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.
+ * @parm {bool} excludedValues - style values that should be ignored.
+ * @return {node} walkNode - A parent node of the element, which has the style properties
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getAncestorWithStyles = function (elem, styleProps, excludedValues) {
+ if (excludedValues === void 0) { excludedValues = []; }
+ var walkNode = elem;
+ while (walkNode !== null) {
+ var node = (0, CacheUtil_1.getCache)(walkNode, "RPTUtil_AncestorWithStyles", null);
+ if (node !== null)
+ return node;
+ var styles = (0, CSSUtil_1.getDefinedStyles)(walkNode);
+ for (var style in styleProps) {
+ var value = styles[style];
+ if (value) {
+ value = value.split(" ")[0]; //get rid of !important
+ if (!excludedValues.includes(value)) {
+ if (styleProps[style].includes('*')) {
+ (0, CacheUtil_1.setCache)(walkNode, "RPTUtil_AncestorWithStyles", walkNode);
+ return walkNode;
+ }
+ else if (styleProps[style].includes(value)) {
+ (0, CacheUtil_1.setCache)(walkNode, "RPTUtil_AncestorWithStyles", walkNode);
+ return walkNode;
+ }
+ }
+ }
+ }
+ walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode);
+ }
+ (0, CacheUtil_1.setCache)(elem, "RPTUtil_AncestorWithStyles", undefined);
+ return null;
+ };
+ /**
+ * 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: RPTUtil.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 RPTUtil
+ */
+ RPTUtil.getSiblingWithRole = function (element, role) {
+ return RPTUtil.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 RPTUtil
+ */
+ RPTUtil.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 && RPTUtil.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 = RPTUtil.hasRoleInSemantics(walkNode, role);
+ }
+ else {
+ hasRole = RPTUtil.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 && RPTUtil.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 = RPTUtil.hasRole(walkNode, role, considerImplicitRole);
+ // Move on to the next node
+ walkNode = walkNode.previousSibling;
+ }
+ }
+ }
+ return walkNode;
+ };
+ RPTUtil.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
+ RPTUtil.isDisabledByFirstChildFormElement = function (element) {
+ var formElements = ["input", "textarea", "select", "keygen", "progress", "meter", "output"];
+ if (element.firstChild != null) {
+ var nw = new NodeWalker(element);
+ while (nw.nextNode()) {
+ if (formElements.includes(nw.node.nodeName.toLowerCase())) {
+ if (RPTUtil.isNodeDisabled(nw.node))
+ return true;
+ return false;
+ }
+ }
+ }
+ return false;
+ };
+ RPTUtil.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 NodeWalker(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) && RPTUtil.isNodeDisabled(nw.node)) {
+ return true;
+ }
+ }
+ }
+ };
+ /**
+ * 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: RPTUtil.getDescendantWithRoleHidden
+ *
+ * @parm {element} element - parent element for which we will be checking descendants for
+ * @parm {string} roleName - The role to look for on the descendants elements
+ *
+ * @return {node} - The descendant element that matches the role specified (only one)
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getDescendantWithRole = function (element, roleName) {
+ return RPTUtil.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 descendants 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 RPTUtil
+ */
+ RPTUtil.getDescendantWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) {
+ // Variable Decleration
+ var descendant = null;
+ var nw = new NodeWalker(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 && RPTUtil.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 ? RPTUtil.hasRoleInSemantics(nw.node, roleName) : RPTUtil.hasRole(nw.node, roleName, false)) {
+ descendant = nw.node;
+ break;
+ }
+ }
+ return descendant;
+ };
+ /**
+ * 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 descendants 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 RPTUtil
+ */
+ RPTUtil.getAllDescendantsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) {
+ // Variable Decleration
+ var descendants = [];
+ var nw = new NodeWalker(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 && RPTUtil.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 (RPTUtil.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 RPTUtil
+ */
+ RPTUtil.getDirectATChildren = function (element) {
+ var requiredChildRoles = RPTUtil.getRequiredChildRoles(element, true);
+ var direct = [];
+ RPTUtil.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 RPTUtil
+ */
+ RPTUtil.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 = RPTUtil.getRoles(children[i], false);
+ if (roles === null || roles.length === 0) {
+ roles = RPTUtil.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,
+ RPTUtil.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
+ */
+ RPTUtil.getRequiredChildRoles = function (element, includeImplicit) {
+ var roles = RPTUtil.getRoles(element, false);
+ // if explicit role doesn't exist, get the implicit one
+ if ((!roles || roles.length === 0) && includeImplicit) {
+ roles = RPTUtil.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 = RPTUtil.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: RPTUtil.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 RPTUtil
+ */
+ RPTUtil.getAriaOwnsWithRole = function (element, roleName) {
+ return RPTUtil.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 RPTUtil
+ */
+ RPTUtil.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 (RPTUtil.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 && RPTUtil.shouldNodeBeSkippedHidden(referencedElement)) {
+ referencedElemHasRole = null;
+ }
+ else {
+ referencedElemHasRole = RPTUtil.hasRole(referencedElement, roleName, considerImplicitRoles);
+ }
+ }
+ return referencedElemHasRole ? referencedElement : null;
+ };
+ /** get element containing label for the given element
+ * @deprecated Deprecated because the function name is misleading. Use getLabelForElement(element) instead
+ */
+ RPTUtil.getInputLabel = function (element) {
+ return RPTUtil.getLabelForElement(element);
+ };
+ /**
+ * This function is responsible for getting the element containing the label for the given element.
+ *
+ * Note: This is a wrapper function to: RPTUtil.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 RPTUtil
+ */
+ RPTUtil.getLabelForElement = function (element) {
+ return RPTUtil.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 RPTUtil
+ */
+ RPTUtil.getLabelForElementHidden = function (element, ignoreHidden) {
+ // Check if the global RPTUtil_LABELS hash is available, as this will contain the label nodes based on
+ // for attribute.
+ //if (!getCache(element.ownerDocument,"RPTUtil_LABELS", null)) {
+ var root = element.getRootNode();
+ if (!(0, CacheUtil_1.getCache)((root.nodeType === 11) ? root : root, "RPTUtil_LABELS", null)) {
+ // Variable Decleration
+ var idToLabel = {};
+ // Get all the label elements in the entire doc
+ var labelNodes = RPTUtil.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, "RPTUtil_LABELS", idToLabel);
+ (0, CacheUtil_1.setCache)((root.nodeType === 11) ? root : root, "RPTUtil_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,"RPTUtil_LABELS",{})[ctrlId];
+ return (0, CacheUtil_1.getCache)((root.nodeType === 11) ? root : root, "RPTUtil_LABELS", {})[ctrlId];
+ }
+ }
+ return null;
+ };
+ /* Return specified element attribute if present else return null */
+ RPTUtil.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 the element has an ARIA label
+ RPTUtil.hasAriaLabel = function (element) {
+ // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element
+ return RPTUtil.attributeNonEmpty(element, "aria-label") || RPTUtil.attributeNonEmpty(element, "aria-labelledby");
+ };
+ // Return true if element has valid implicit label
+ RPTUtil.hasImplicitLabel = function (element) {
+ var parentNode = RPTUtil.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"
+ // 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" && RPTUtil.isFirstFormElement(parentNode, element)) {
+ var parentClone = parentNode.cloneNode(true);
+ // exclude all form elements from the label since they might also have inner content
+ parentClone = RPTUtil.removeAllFormElementsFromLabel(parentClone);
+ return RPTUtil.hasInnerContentHidden(parentClone);
+ }
+ else {
+ return false;
+ }
+ };
+ RPTUtil.isFirstFormElement = function (parentNode, element) {
+ var formElementsRequiringLabel = ["input", "textarea", "select", "keygen", "progress", "meter", "output"];
+ if (parentNode.firstChild != null) {
+ var nw = new NodeWalker(parentNode);
+ while (nw.nextNode()) {
+ if (formElementsRequiringLabel.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)
+ RPTUtil.isShadowHostElement = function (element) {
+ if (RPTUtil.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
+ RPTUtil.isShadowElement = function (element) {
+ var root = element.getRootNode();
+ if (root.toString() === "[object ShadowRoot]")
+ return true;
+ return false;
+ };
+ RPTUtil.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;
+ };
+ // Given an array of elements, return true if the elements have unique ARIA labels
+ RPTUtil.hasUniqueAriaLabelsLocally = function (elements, isGlobal) {
+ if (elements.length === 0)
+ return false;
+ var doc = elements[0].ownerDocument;
+ var hasDuplicateLabels = false;
+ var uniqueAriaLabels = null;
+ if (isGlobal) {
+ uniqueAriaLabels = (0, CacheUtil_1.getCache)(doc, "RPTUtil_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 = RPTUtil.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 = labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i]) ? RPTUtil.getInnerText(labelNode) : "";
+ var normalizedLabel = RPTUtil.normalizeSpacing(label).toLowerCase();
+ hasDuplicateLabels = normalizedLabel in uniqueAriaLabels;
+ uniqueAriaLabels[normalizedLabel] = true;
+ }
+ else {
+ // Has no label at all
+ hasDuplicateLabels = true;
+ }
+ }
+ }
+ if (isGlobal) {
+ (0, CacheUtil_1.setCache)(doc, "RPTUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels);
+ }
+ return !hasDuplicateLabels;
+ };
+ RPTUtil.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);
+ var label = labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele) ? RPTUtil.getInnerText(labelNode) : "";
+ normalizedLabel += RPTUtil.normalizeSpacing(label).toLowerCase();
+ }
+ return normalizedLabel.trim();
+ }
+ else if (ele.hasAttribute("aria-label")) {
+ return RPTUtil.normalizeSpacing(ele.getAttribute("aria-label")).toLowerCase().trim();
+ }
+ }
+ if (ele.nodeName.toLowerCase() === "input") {
+ //const label = RPTUtil.getLabelForElement(ele);
+ var label = RPTUtil.getLabelForElementHidden(ele, true);
+ if (!label)
+ return "";
+ return (RPTUtil.getAriaLabel(label) || label.innerText || "").trim();
+ }
+ return "";
+ };
+ /**
+ * @param element
+ * @param idStr
+ * @returns true if any one (if multiple Ids) id points to itself
+ */
+ RPTUtil.isIdReferToSelf = function (element, idStr) {
+ if (!idStr || idStr.trim() === '')
+ return false;
+ var ids = idStr.trim().split(" ");
+ for (var j = 0, length_2 = ids.length; j < length_2; ++j) {
+ var referredNode = fragment_1.FragmentUtil.getById(element, ids[j]);
+ if (referredNode && DOMUtil_1.DOMUtil.sameNode(referredNode, element))
+ return true;
+ }
+ return false;
+ };
+ RPTUtil.findAriaLabelDupes = function (elements) {
+ var dupeMap = {};
+ elements.forEach(function (ele) {
+ dupeMap[RPTUtil.getAriaLabel(ele)] = (dupeMap[RPTUtil.getAriaLabel(ele)] || 0) + 1;
+ });
+ return dupeMap;
+ };
+ // Given an array of elements, return true if the elements have unique ARIA labels globally
+ RPTUtil.hasUniqueAriaLabels = function (elements) {
+ return RPTUtil.hasUniqueAriaLabelsLocally(elements, true);
+ };
+ // Given an array of elements, return true if the elements have unique ARIA labels
+ RPTUtil.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 = (0, CacheUtil_1.getCache)(doc, "RPTUtil_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 = RPTUtil.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);
+ var label = labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i]) ? RPTUtil.getInnerText(labelNode) : "";
+ normalizedLabel += RPTUtil.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) {
+ (0, CacheUtil_1.setCache)(doc, "RPTUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels);
+ }
+ return duplicateLabelNameArray;
+ };
+ // Given an array of elements, return true if the elements have unique ARIA labels globally
+ RPTUtil.hasDuplicateAriaLabels = function (elements) {
+ return RPTUtil.hasDuplicateAriaLabelsLocally(elements, true);
+ };
+ // Given an array of elements, return true if the elements have unique aria-labelledby attributes
+ RPTUtil.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") && !RPTUtil.isIdReferToSelf(elements[i], elements[i].getAttribute("aria-labelledby"))) {
+ var labelRef = RPTUtil.normalizeSpacing(elements[i].getAttribute("aria-labelledby"));
+ hasDuplicateLabels = labelRef in labelRefs;
+ labelRefs[labelRef] = true;
+ }
+ else {
+ hasDuplicateLabels = true;
+ }
+ }
+ return !hasDuplicateLabels;
+ };
+ /* Determine the node depth of the given element */
+ RPTUtil.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
+ */
+ RPTUtil.compareNodeOrder = function (nodeA, nodeB) {
+ if (nodeA === nodeB)
+ return 0;
+ var aDepth = RPTUtil.nodeDepth(nodeA);
+ var bDepth = RPTUtil.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 RPTUtil
+ */
+ RPTUtil.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 */
+ RPTUtil.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;
+ };
+ RPTUtil.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
+ RPTUtil.isInnerTextOnlyEmpty = function (element) {
+ // Get the innerText of the element
+ var text = element.innerText;
+ if (text === undefined && element.textContent !== undefined) {
+ // In headless mode, innerText is sometimes 'undefined'
+ // 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 && RPTUtil.isInnerTextEmpty(slotElem);
+ }
+ }
+ // Trim the inner text and verify that it is not empty.
+ return retVal;
+ };
+ /* Return the inner text of the given element */
+ RPTUtil.getInnerText = function (element) {
+ var retVal = element.innerText;
+ if (retVal === undefined || retVal.trim() === "")
+ retVal = element.textContent;
+ return retVal;
+ };
+ /** 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
+ */
+ RPTUtil.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 RPTUtil
+ */
+ RPTUtil.isInnerTextEmpty = function (element) {
+ // Get the innerText of the element
+ var text = RPTUtil.getInnerText(element);
+ // Trim the inner text and verify that it is not empty.
+ return !(text != null && text.trim().length > 0);
+ };
+ RPTUtil.hasInnerContent = function (element) {
+ var text = RPTUtil.getInnerText(element);
+ var hasContent = (text != null && text.trim().length > 0);
+ if (element.firstChild != null) {
+ var nw = new NodeWalker(element);
+ while (!hasContent && nw.nextNode()) {
+ hasContent = (nw.node.nodeName.toLowerCase() === "img" &&
+ RPTUtil.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 RPTUtil
+ */
+ RPTUtil.hasInnerContentHidden = function (element) {
+ return RPTUtil.hasInnerContentHiddenHyperLink(element, false);
+ };
+ RPTUtil.svgHasName = function (element) {
+ return RPTUtil.attributeNonEmpty(element, "aria-label")
+ || RPTUtil.attributeNonEmpty(element, "aria-labelledby")
+ || !!element.querySelector(":scope > title");
+ };
+ RPTUtil.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 NodeWalker(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"
+ && (RPTUtil.attributeNonEmpty(node, "alt") || RPTUtil.attributeNonEmpty(node, "title"))
+ && VisUtil_1.VisUtil.isNodeVisible(node)) || (node.nodeName.toLowerCase() === "svg"
+ && RPTUtil.svgHasName(node));
+ // Now we check if this node is of type element, visible
+ if (!hasContent && node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(node)) {
+ // Check if the innerText of the element is empty or not
+ hasContent = !RPTUtil.isInnerTextOnlyEmpty(node);
+ if (!hasContent && hyperlink_flag === true) {
+ hasContent = RPTUtil.attributeNonEmpty(node, "aria-label") || RPTUtil.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) && RPTUtil.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 = !RPTUtil.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 = !RPTUtil.isInnerTextEmpty(element);
+ }
+ return hasContent;
+ };
+ RPTUtil.hasInnerContentOrAlt = function (element) {
+ var text = RPTUtil.getInnerText(element);
+ var hasContent = (text != null && text.trim().length > 0) || RPTUtil.attributeNonEmpty(element, "alt");
+ if (element.firstChild != null) {
+ var nw = new NodeWalker(element);
+ while (!hasContent && nw.nextNode() && nw.node != element) {
+ hasContent = (nw.node.nodeName.toLowerCase() === "img" &&
+ RPTUtil.attributeNonEmpty(nw.node, "alt"));
+ if (!hasContent
+ && (RPTUtil.hasRole(nw.node, "button", true) || RPTUtil.hasRole(nw.node, "textbox"))
+ && (RPTUtil.hasAriaLabel(nw.node) || RPTUtil.attributeNonEmpty(nw.node, "title") || RPTUtil.getLabelForElementHidden(nw.elem(), true))) {
+ hasContent = true;
+ }
+ }
+ }
+ return hasContent;
+ };
+ RPTUtil.concatUniqueArrayItem = function (item, arr) {
+ arr.indexOf(item) === -1 && item !== null ? arr.push(item) : false;
+ return arr;
+ };
+ RPTUtil.concatUniqueArrayItemList = function (itemList, arr) {
+ for (var i = 0; itemList !== null && i < itemList.length; i++) {
+ arr = RPTUtil.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
+ */
+ RPTUtil.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;
+ };
+ /**
+ * 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
+ */
+ RPTUtil.getElementAriaProperty = function (ruleContext) {
+ var tagProperty = (0, CacheUtil_1.getCache)(ruleContext, "RPTUtil_ElementAriaProperty", null);
+ if (!tagProperty) {
+ var tagName = null;
+ var name_1 = 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":
+ RPTUtil.attributeNonEmpty(ruleContext, "href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"];
+ break;
+ case "area":
+ RPTUtil.attributeNonEmpty(ruleContext, "href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"];
+ break;
+ case "figure": {
+ var fcs = RPTUtil.getChildByTag(ruleContext, "figcaption");
+ fcs !== null && fcs.length > 0 ? tagProperty = specialTagProperties["child-figcaption"] : tagProperty = specialTagProperties["no-child-figcaption"];
+ break;
+ }
+ case "footer":
+ case "header":
+ if (RPTUtil.getAncestorWithRole(ruleContext, "article", true) !== null || RPTUtil.getAncestorWithRole(ruleContext, "complementary", true) !== null
+ || RPTUtil.getAncestorWithRole(ruleContext, "navigation", true) !== null || RPTUtil.getAncestorWithRole(ruleContext, "region", true) !== null
+ || RPTUtil.getAncestor(ruleContext, ["article", "aside", "main", "nav", "section"]) !== null)
+ tagProperty = specialTagProperties["des-section-article-aside-main-nav"];
+ else
+ tagProperty = specialTagProperties["other"];
+ break;
+ case "img":
+ if (ruleContext.hasAttribute("alt")) {
+ ruleContext.getAttribute("alt").trim() === "" ? tagProperty = specialTagProperties["img-with-empty-alt"] : tagProperty = specialTagProperties["img-with-alt-text"];
+ }
+ else {
+ RPTUtil.hasAriaLabel(ruleContext) ? tagProperty = specialTagProperties["img-with-alt-text"] : tagProperty = specialTagProperties["img-without-alt"];
+ }
+ break;
+ case "input":
+ if (RPTUtil.attributeNonEmpty(ruleContext, "type")) {
+ var type = ruleContext.getAttribute("type").trim().toLowerCase();
+ tagProperty = specialTagProperties[type];
+ if (tagProperty === null || tagProperty === undefined) {
+ switch (type) {
+ case "checkbox":
+ RPTUtil.attributeNonEmpty(ruleContext, "aria-pressed") ? tagProperty = specialTagProperties["checkbox-with-aria-pressed"] : tagProperty = specialTagProperties["checkbox-without-aria-pressed"];
+ break;
+ case "email":
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["email-with-list"] : tagProperty = specialTagProperties["email-no-list"];
+ break;
+ case "search":
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["search-with-list"] : tagProperty = specialTagProperties["search-no-list"];
+ break;
+ case "tel":
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["tel-with-list"] : tagProperty = specialTagProperties["tel-no-list"];
+ break;
+ case "text":
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"];
+ break;
+ case "url":
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["url-with-list"] : tagProperty = specialTagProperties["url-no-list"];
+ break;
+ default:
+ // default
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["default-with-list"] : tagProperty = specialTagProperties["default-no-list"];
+ break;
+ }
+ }
+ }
+ else {
+ // default type is the same as type=text
+ RPTUtil.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 && RPTUtil.hasRoleInSemantics(ruleContext.parentElement, "list"))
+ tagProperty = specialTagProperties["child-of-list-role"];
+ else
+ tagProperty = specialTagProperties["no-child-of-list-role"];
+ break;
+ case "section":
+ name_1 = ARIAMapper_1.ARIAMapper.computeName(ruleContext);
+ if (name_1 && name_1.trim().length > 0) {
+ tagProperty = specialTagProperties["with-name"];
+ }
+ else {
+ tagProperty = specialTagProperties["without-name"];
+ }
+ break;
+ case "select":
+ specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["select"];
+ if (ruleContext.hasAttribute("multiple") ||
+ RPTUtil.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 (RPTUtil.getAncestorWithRole(ruleContext, "table", true) !== null) {
+ tagProperty = specialTagProperties["des-table"];
+ }
+ else {
+ RPTUtil.getAncestorWithRole(ruleContext, "grid", true) || RPTUtil.getAncestorWithRole(ruleContext, "treegrid", true) ? tagProperty = specialTagProperties["des-grid"] : tagProperty = specialTagProperties["des-other"];
+ }
+ break;
+ case "th":
+ if (RPTUtil.getAncestorWithRole(ruleContext, "table", true) !== null || RPTUtil.getAncestorWithRole(ruleContext, "grid", true) !== null || RPTUtil.getAncestorWithRole(ruleContext, "treegrid", true) !== null) {
+ var scope = RPTUtil.getScopeForTh(ruleContext);
+ if (scope === 'column')
+ tagProperty = specialTagProperties["des-table-grid-treegrid-column-scope"];
+ else
+ tagProperty = specialTagProperties["des-table-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
+ }
+ }
+ (0, CacheUtil_1.setCache)(ruleContext, "RPTUtil_ElementAriaProperty", tagProperty);
+ return tagProperty || null;
+ };
+ RPTUtil.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 = function (element) { return __spreadArray([], element.parentElement.children, true).filter(function (node) { return node.nodeType === 1 && node.tagName != "TH"; }); };
+ if (siblings === null || siblings.length === 0)
+ return "column";
+ else
+ return "row";
+ };
+ RPTUtil.getAllowedAriaRoles = function (ruleContext, properties) {
+ var allowedRoles = (0, CacheUtil_1.getCache)(ruleContext, "RPTUtil_AllowedAriaRoles", null);
+ if (!allowedRoles) {
+ allowedRoles = [];
+ var tagProperty = null;
+ if (properties !== null && properties !== undefined) {
+ tagProperty = properties;
+ }
+ else {
+ tagProperty = RPTUtil.getElementAriaProperty(ruleContext);
+ }
+ if (tagProperty !== null && tagProperty !== undefined) {
+ if (tagProperty.implicitRole !== null) {
+ RPTUtil.concatUniqueArrayItemList(tagProperty.implicitRole, allowedRoles);
+ }
+ if (tagProperty.validRoles !== null) {
+ RPTUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles);
+ }
+ var implicitRoles = RPTUtil.getImplicitRole(ruleContext);
+ if (implicitRoles && implicitRoles.length > 0) {
+ RPTUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles);
+ }
+ }
+ (0, CacheUtil_1.setCache)(ruleContext, "RPTUtil_AllowedAriaRoles", allowedRoles);
+ }
+ return allowedRoles;
+ };
+ RPTUtil.getAllowedAriaAttributes = function (ruleContext, roles, properties) {
+ var allowedAttributes = (0, CacheUtil_1.getCache)(ruleContext, "RPTUtil_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 = RPTUtil.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 = RPTUtil.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 = RPTUtil.concatUniqueArrayItem("aria-readonly", allowedAttributes);
+ }
+ var tagProperty = null;
+ if (properties != null && properties !== undefined)
+ tagProperty = properties;
+ else
+ tagProperty = RPTUtil.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;
+ RPTUtil.concatUniqueArrayItemList(properties_1, allowedAttributes);
+ properties_1 = RPTUtil.getRoleRequiredProperties(tagProperty.implicitRole[i], ruleContext);
+ RPTUtil.concatUniqueArrayItemList(properties_1, allowedAttributes);
+ var prohibitedProps = roleProperty.prohibitedProps;
+ if (prohibitedProps && prohibitedProps.length > 0)
+ RPTUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes);
+ // special case of separator
+ if (tagProperty.implicitRole[i] === "separator" && RPTUtil.isFocusable(ruleContext)) {
+ RPTUtil.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
+ RPTUtil.concatUniqueArrayItemList(properties_2, allowedAttributes);
+ }
+ }
+ // adding the other role to the allowed roles for the attributes
+ if (tagProperty && tagProperty.otherRolesForAttributes && tagProperty.otherRolesForAttributes.length > 0)
+ RPTUtil.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
+ RPTUtil.concatUniqueArrayItemList(properties_3, allowedAttributes);
+ properties_3 = RPTUtil.getRoleRequiredProperties(permittedRoles[i], ruleContext); // required properties
+ RPTUtil.concatUniqueArrayItemList(properties_3, allowedAttributes);
+ }
+ var prohibitedProps = roleProperties.prohibitedProps;
+ if (prohibitedProps && prohibitedProps.length > 0)
+ RPTUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes);
+ // special case for separator
+ if (permittedRoles[i] === "separator" && RPTUtil.isFocusable(ruleContext)) {
+ RPTUtil.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") && RPTUtil.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)
+ RPTUtil.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)
+ RPTUtil.concatUniqueArrayItemList(disallowed, prohibitedAttributes);
+ }
+ //exclude the prohibitedAttributes from the allowedAttributes
+ allowedAttributes = RPTUtil.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 = RPTUtil.reduceArrayItemList(tagProperty.prohibitedAriaAttributesWhenNoImplicitRole, allowedAttributes);
+ (0, CacheUtil_1.setCache)(ruleContext, "RPTUtil_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
+ */
+ RPTUtil.getConflictOrOverlappingHtmlAttribute = function (ariaAttr, htmlAttrs, type) {
+ var exist = ARIADefinitions_1.ARIADefinitions.relatedAriaHtmlAttributes[ariaAttr['name']];
+ if (exist) {
+ var examinedHtmlAtrNames = [];
+ var ariaAttrValue = '';
+ if (type === 'conflict') {
+ if (!exist.conflict)
+ return null;
+ ariaAttrValue = exist.conflict.ariaAttributeValue;
+ }
+ else if (type === 'overlapping') {
+ if (!exist.overlapping)
+ return null;
+ ariaAttrValue = exist.overlapping.ariaAttributeValue;
+ }
+ else
+ return null;
+ if (ariaAttrValue === null || ariaAttrValue === 'VALUE' || ariaAttrValue === ariaAttr['value']) {
+ var htmlAttrNames = [];
+ var htmlAttrValues = [];
+ if (type === 'conflict') {
+ htmlAttrNames = exist.conflict.htmlAttributeNames;
+ htmlAttrValues = exist.conflict.htmlAttributeValues;
+ }
+ else {
+ htmlAttrNames = exist.overlapping.htmlAttributeNames;
+ htmlAttrValues = exist.overlapping.htmlAttributeValues;
+ }
+ for (var i = 0; i < htmlAttrs.length; i++) {
+ var index = htmlAttrNames.indexOf(htmlAttrs[i]['name']);
+ if (index !== -1) {
+ if (htmlAttrValues === null
+ || (ariaAttrValue === 'VALUE' && htmlAttrValues[index] === 'VALUE' && htmlAttrs[i]['value'] !== ariaAttr['value'])
+ || htmlAttrs[i]['value'] === htmlAttrValues[index]) {
+ examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] });
+ continue;
+ }
+ else
+ examinedHtmlAtrNames.push({ result: 'Pass', 'attr': htmlAttrs[i]['name'] });
+ }
+ }
+ }
+ return examinedHtmlAtrNames;
+ }
+ else
+ return null;
+ };
+ RPTUtil.containsPresentationalChildrenOnly = function (elem) {
+ var roles = RPTUtil.getRoles(elem, false);
+ // if explicit role doesn't exist, get the implicit one
+ if (!roles || roles.length === 0)
+ roles = RPTUtil.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;
+ };
+ RPTUtil.shouldBePresentationalChild = function (element) {
+ var walkNode = DOMWalker_1.DOMWalker.parentElement(element);
+ while (walkNode) {
+ if (RPTUtil.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;
+ };
+ /** moved to CSSUtil
+ public static CSS(element) {
+ let styleText = "";
+ if (element === null) return [];
+ if (element.IBM_CSS_THB) return element.IBM_CSS_THB;
+ let nodeName = element.nodeName.toLowerCase();
+ if (nodeName === "style") {
+ styleText = RPTUtil.getInnerText(element);
+ } else if (element.hasAttribute("style")) {
+ styleText = element.getAttribute("style");
+ } else return [];
+ if (styleText === null || styleText.trim().length === 0) return [];
+ //remove comment blocks
+ let re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.* /g;
+ let subst = ' ';
+ styleText = styleText.replace(re, subst);
+ // Find all "key : val;" pairs with various whitespace inbetween
+ let rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g;
+ // Find all "selector { csskeyvals } with various whitespace inbetween
+ let rSelectors = /\s*([^{]*){([^}]*)}/g;
+ if (styleText.indexOf("{") === -1) {
+
+ let keyVals = {};
+ let m;
+ while ((m = rKeyVals.exec(styleText)) != null) {
+ keyVals[m[1]] = m[2].trim().toLowerCase();
+ }
+ let retVal = [{
+ selector: null,
+ values: keyVals
+ }];
+ element.IBM_CSS_THB = retVal;
+ return retVal;
+ } else {
+ let retVal = [];
+ let m;
+ let m2;
+ while ((m = rSelectors.exec(styleText)) != null) {
+ let keyVals = {}
+ let selKey = m[1];
+ let 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;
+ }
+ }
+ */
+ RPTUtil.getControlOfLabel = function (node) {
+ // Handle the easy case of label -> for
+ var labelAncestor = RPTUtil.getAncestor(node, "label");
+ if (labelAncestor) {
+ if (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);
+ }
+ // Iterate through controls that use aria-labelledby and see if any of them reference one of my ancestor ids
+ var inputsUsingLabelledBy = 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 && !RPTUtil.isIdReferToSelf(node, node.getAttribute("aria-labelledby"))) {
+ 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 RPTUtil
+ */
+ RPTUtil.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 = (0, CacheUtil_1.getCache)(node, "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;
+ (0, CacheUtil_1.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 = RPTUtil.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
+ (0, CacheUtil_1.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 RPTUtil
+ */
+ RPTUtil.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 RPTUtil
+ */
+ RPTUtil.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 (!RPTUtil.shouldCheckHiddenContent(node) && !VisUtil_1.VisUtil.isNodeVisible(node)) {
+ return true;
+ }
+ return false;
+ };
+ RPTUtil.isfocusableByDefault = function (node) {
+ var focusableElements = ['input', 'select', 'button', 'textarea', 'option', 'area'];
+ if (node.nodeName.toLowerCase() === "a" && RPTUtil.hasAttribute(node, 'href'))
+ return true;
+ if (node.nodeName.toLowerCase() === "area" && RPTUtil.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.
+ */
+ RPTUtil.nonTabableChildCheck = function (element) {
+ if (!element.hasAttribute("tabindex") ||
+ (parseInt(element.getAttribute("tabindex")) != -1)) {
+ return false;
+ }
+ var nw = new NodeWalker(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) &&
+ !RPTUtil.hasInnerContent(child)) {
+ return false;
+ }
+ }
+ return true;
+ };
+ RPTUtil.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;
+ };
+ // This list contains a list of elements tags which have display: none by default, since we have rules triggering
+ RPTUtil.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.
+ RPTUtil.rulesThatHaveToCheckHidden = ['RPT_Elem_UniqueId'];
+ // https://www.w3.org/TR/wai-aria-1.1/#introstates
+ RPTUtil.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
+ RPTUtil.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
+ RPTUtil.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");
+ }
+ }
+ };
+ RPTUtil.tabTagMap = {
+ "button": function (element) {
+ return !element.hasAttribute("disabled");
+ },
+ "iframe": true,
+ "input": function (element) {
+ return element.getAttribute("type") !== "hidden" && !element.hasAttribute("disabled");
+ },
+ "select": function (element) {
+ return !element.hasAttribute("disabled");
+ },
+ "textarea": 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;
+ }
+ };
+ return RPTUtil;
+}());
+exports.RPTUtil = RPTUtil;
+/** moved to CSSUtil
+export class RPTUtilStyle {
+ public static getWeightNumber(styleVal) {
+ let map = {
+ "light": 100,
+ "bold": 700
+ };
+ let retVal = parseInt(styleVal);
+ if (retVal) return retVal;
+ if (styleVal in map)
+ return map[styleVal];
+ return 400;
+ }
+
+ public static getFontInPixels = function (styleVal) {
+ let map = {
+ "xx-small": 16,
+ "x-small": 10,
+ "small": 13,
+ "medium": 16,
+ "large": 18,
+ "x-large": 24,
+ "xx-large": 32
+ };
+ let value = parseFloat(styleVal);
+ if (!value) {
+ return map[styleVal];
+ }
+ let 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 a node walker for the given element.
+ * bEnd is optional and defaults to false
+ * but if true, indicates the node is the end node*/
+var NodeWalker = /** @class */ (function () {
+ function NodeWalker(node, bEnd) {
+ this.node = node;
+ this.bEndTag = (bEnd === undefined ? false : bEnd === true);
+ }
+ NodeWalker.prototype.elem = function () {
+ return this.node.nodeType === 1 && this.node || null;
+ };
+ NodeWalker.prototype.nextNode = function () {
+ if (!this.node) {
+ this.bEndTag = false;
+ return false;
+ }
+ 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"
+ && iframeNode.contentDocument
+ && iframeNode.contentDocument.documentElement) {
+ var ownerElement = this.node;
+ this.node = iframeNode.contentDocument.documentElement;
+ this.node.nwOwnerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && elementNode.shadowRoot
+ && elementNode.shadowRoot.firstChild) {
+ var ownerElement = this.node;
+ this.node = elementNode.shadowRoot;
+ this.node.nwOwnerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1
+ && elementNode.nodeName.toLowerCase() === "slot"
+ && slotElement.assignedNodes().length > 0) {
+ var slotOwner = this.node;
+ this.node = slotElement.assignedNodes()[0];
+ this.node.nwSlotOwner = slotOwner;
+ this.node.nwSlotIndex = 0;
+ }
+ else if (this.node.firstChild) {
+ this.node = this.node.firstChild;
+ }
+ else {
+ this.bEndTag = true;
+ return this.nextNode();
+ }
+ }
+ else {
+ if (this.node.nwSlotOwner) {
+ var slotOwner = this.node.nwSlotOwner;
+ var nextSlotIndex = this.node.nwSlotIndex + 1;
+ delete this.node.nwSlotOwner;
+ delete this.node.nwSlotIndex;
+ if (nextSlotIndex < slotOwner.assignedNodes().length) {
+ this.node = slotOwner.assignedNodes()[nextSlotIndex];
+ this.node.nwSlotOwner = slotOwner;
+ this.node.nwSlotIndex = nextSlotIndex;
+ this.bEndTag = false;
+ }
+ else {
+ this.node = slotOwner;
+ this.bEndTag = true;
+ }
+ }
+ else if (this.node.nwOwnerElement) {
+ this.node = this.node.nwOwnerElement;
+ this.bEndTag = true;
+ }
+ else if (this.node.nextSibling) {
+ this.node = this.node.nextSibling;
+ this.bEndTag = false;
+ }
+ else if (this.node.parentNode) {
+ this.node = this.node.parentNode;
+ this.bEndTag = true;
+ }
+ else {
+ return false;
+ }
+ }
+ return true;
+ };
+ NodeWalker.prototype.prevNode = function () {
+ if (this.bEndTag && this.node.lastChild) {
+ this.node = this.node.lastChild;
+ this.bEndTag = true;
+ }
+ else if (this.node.previousSibling) {
+ this.node = this.node.previousSibling;
+ this.bEndTag = true;
+ }
+ else if (this.node.parentNode) {
+ this.node = this.node.parentNode;
+ this.bEndTag = false;
+ }
+ else {
+ return false;
+ }
+ if (this.bEndTag && (this.node.firstChild === null || typeof (this.node.firstChild) === 'undefined'))
+ this.bEndTag = false;
+ return true;
+ };
+ return NodeWalker;
+}());
+exports.NodeWalker = NodeWalker;
+
+
+/***/ }),
+
+/***/ 1794:
+/***/ ((__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__(7440);
+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) || "none";
+ this.hierarchyRole.push(role);
+ if (role !== "none") {
+ 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 !== "none") {
+ 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;
+
+
+/***/ }),
+
+/***/ 2306:
+/***/ ((__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
+// or )
+// 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;
+
+
+/***/ }),
+
+/***/ 9324:
+/***/ ((__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 IEngine_1 = __webpack_require__(9077);
+var DOMWalker_1 = __webpack_require__(7440);
+var Context_1 = __webpack_require__(2306);
+var Config_1 = __webpack_require__(3962);
+var DOMMapper_1 = __webpack_require__(5697);
+var DOMUtil_1 = __webpack_require__(295);
+var CacheUtil_1 = __webpack_require__(7788);
+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.
+ *
+ * @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;
+ };
+ 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)
+ });
+ }
+ return retVal;
+ };
+ return WrappedRule;
+}());
+var Engine = /** @class */ (function () {
+ function Engine() {
+ this.mappers = {};
+ this.ruleMap = {};
+ this.wrappedRuleMap = {};
+ this.nlsMap = {};
+ this.helpMap = {};
+ 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);
+ (0, CacheUtil_1.clearCaches)(root);
+ var walker = new DOMWalker_1.DOMWalker(root);
+ 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
+ do {
+ // 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
+ && (DOMWalker_1.DOMWalker.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 = [];
+ 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] === IEngine_1.eRuleConfidence.PASS) {
+ depMatch[result.ruleId] = true;
+ }
+ }
+ }
+ }
+ }
+ } while (walker.nextNode());
+ (0, CacheUtil_1.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._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 (var _c = 0, _d = depRule.rule.prereqs; _c < _d.length; _c++) {
+ var depId = _d[_c];
+ 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;
+
+
+/***/ }),
+
+/***/ 3962:
+/***/ ((__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;
+
+
+/***/ }),
+
+/***/ 9831:
+/***/ ((__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__(7440);
+var ColorUtil = /** @class */ (function () {
+ function ColorUtil() {
+ }
+ // Rewrite the color object to account for alpha
+ ColorUtil.Color = function (cssStyleColor) {
+ 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) {}
+ }
+ 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;
+
+
+/***/ }),
+
+/***/ 5697:
+/***/ (function(__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__(1794);
+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;
+ };
+ DOMMapper.prototype.getBounds = function (node) {
+ if (node.nodeType === 1 /*Node.ELEMENT_NODE*/) {
+ 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;
+ return {
+ "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)
+ };
+ }
+ }
+ return null;
+ };
+ return DOMMapper;
+}(CommonMapper_1.CommonMapper));
+exports.DOMMapper = DOMMapper;
+
+
+/***/ }),
+
+/***/ 295:
+/***/ ((__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__(7440);
+var DOMUtil = /** @class */ (function () {
+ function DOMUtil() {
+ }
+ 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;
+ };
+ 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;
+ };
+ 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;
+ }
+ };
+ DOMUtil.cleanWhitespace = function (s) {
+ var retVal = s.replace(/[ \t\r\n]/g, " ").replace(/ +/g, " ");
+ return retVal;
+ };
+ DOMUtil.cleanSpace = function (s) {
+ var retVal = s.replace(/ +/g, " ");
+ return retVal;
+ };
+ // return true if element1 and element2 (cells) are in the same table
+ 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;
+ };
+ DOMUtil.shadowRootNode = function (node) {
+ var nd = node;
+ while (nd != null && nd.nodeType !== 11 /* Node.DOCUMENT_FRAGMENT_NODE */)
+ nd = nd.parentNode;
+ return nd;
+ };
+ /**
+ * Copies objects, but retains Node attributes as references
+ * @param rhs
+ */
+ 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;
+ }
+ };
+ 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;
+
+
+/***/ }),
+
+/***/ 7440:
+/***/ ((__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.DOMWalker = void 0;
+/**
+ * Walks in a DOM order
+ *
+ * See also ../aria/ARIAWalker
+ */
+var DOMWalker = /** @class */ (function () {
+ function DOMWalker(element, bEnd, root) {
+ this.root = root || element;
+ this.node = element;
+ this.bEndTag = (bEnd == undefined ? false : bEnd == true);
+ }
+ 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.isNodeVisible = function (node) {
+ if (node === null)
+ return false;
+ try {
+ var vis = null;
+ while (node && node.nodeType !== 1 /* Node.ELEMENT_NODE */) {
+ node = DOMWalker.parentElement(node);
+ }
+ var elem = node;
+ var w = elem.ownerDocument.defaultView;
+ do {
+ var cs = w.getComputedStyle(elem);
+ if (cs.display === "none")
+ return false;
+ if (vis === null && cs.visibility) {
+ vis = cs.visibility;
+ if (vis === "hidden")
+ return false;
+ }
+ elem = DOMWalker.parentElement(elem);
+ } while (elem);
+ return true;
+ }
+ catch (err) {
+ return false;
+ }
+ };
+ DOMWalker.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;
+ }
+ };
+ DOMWalker.prototype.nextNode = function () {
+ 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"
+ && DOMWalker.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 */
+ && DOMWalker.isNodeVisible(elementNode)
+ && elementNode.shadowRoot
+ && elementNode.shadowRoot.firstChild) {
+ var ownerElement = this.node;
+ this.node = elementNode.shadowRoot;
+ this.node.ownerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1
+ && elementNode.nodeName.toLowerCase() === "slot"
+ && slotElement.assignedNodes().length > 0) {
+ var slotOwner = this.node;
+ this.node = slotElement.assignedNodes()[0];
+ this.node.slotOwner = slotOwner;
+ this.node.slotIndex = 0;
+ }
+ else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) /* Node.ELEMENT_NODE */ && this.node.firstChild) {
+ this.node = this.node.firstChild;
+ }
+ 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.slotOwner;
+ delete this.node.slotIndex;
+ if (nextSlotIndex < slotOwner.assignedNodes().length) {
+ this.node = slotOwner.assignedNodes()[nextSlotIndex];
+ this.node.slotOwner = slotOwner;
+ this.node.slotIndex = 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 (this.node.nextSibling) {
+ this.node = this.node.nextSibling;
+ this.bEndTag = false;
+ }
+ else if (this.node.parentNode) {
+ 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"));
+ 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"
+ && DOMWalker.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 */
+ && DOMWalker.isNodeVisible(elementNode)
+ && elementNode.shadowRoot
+ && elementNode.shadowRoot.lastChild) {
+ var ownerElement = this.node;
+ this.node = elementNode.shadowRoot;
+ this.node.ownerElement = ownerElement;
+ }
+ else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) && this.node.lastChild) {
+ this.node = this.node.lastChild;
+ }
+ else {
+ this.bEndTag = false;
+ }
+ }
+ else {
+ if (this.atRoot()) {
+ return false;
+ }
+ else if (this.node.previousSibling) {
+ this.node = this.node.previousSibling;
+ 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 === 1 && this.node.getAttribute("aChecker") === "ACE"));
+ return true;
+ };
+ return DOMWalker;
+}());
+exports.DOMWalker = DOMWalker;
+
+
+/***/ }),
+
+/***/ 8174:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(7788);
+var DOMUtil_1 = __webpack_require__(295);
+var DOMWalker_1 = __webpack_require__(7440);
+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).
+ *
+ * @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;
+ // 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.
+ (0, CacheUtil_1.setCache)(node, "PT_NODE_HIDDEN", (0, CacheUtil_1.getCache)(node, "PT_NODE_HIDDEN", false));
+ // 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.
+ if (VisUtil.hiddenByDefaultElements != null && VisUtil.hiddenByDefaultElements != undefined && VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1) {
+ return true;
+ }
+ // 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 true;
+ }
+ // Get the hidden element property and hidden attribute
+ var hiddenAttribute = node.getAttribute("hidden");
+ var hiddenPropertyCustom = (0, CacheUtil_1.getCache)(node, "PT_NODE_HIDDEN", undefined);
+ // 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 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' ||
+ (!(0, CacheUtil_1.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.
+ (0, CacheUtil_1.setCache)(node, "PT_NODE_HIDDEN", true);
+ return 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.
+ (0, CacheUtil_1.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) {
+ (0, CacheUtil_1.setCache)(node, "PT_NODE_HIDDEN", true);
+ }
+ // Check upwards recursively
+ return nodeVisible;
+ }
+ // Return true (node is visible)
+ return true;
+ };
+ /**
+ * return true if the node or its ancestor is natively hidden or aria-hidden = 'true'
+ * @param node
+ */
+ VisUtil.isNodeHiddenFromAT = function (node) {
+ if (!VisUtil.isNodeVisible(node) || node.getAttribute("aria-hidden") === 'true')
+ return true;
+ var ancestor = DOMUtil_1.DOMUtil.getAncestorWithAttribute(node, "aria-hidden", "true");
+ if (ancestor)
+ return true;
+ return false;
+ };
+ // 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
+ // 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', 'title', 'meta', 'base', 'noscript', 'template', 'datalist'];
+ return VisUtil;
+}());
+exports.VisUtil = VisUtil;
+
+
+/***/ }),
+
+/***/ 1970:
+/***/ (function(__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.StyleMapper = void 0;
+var CommonMapper_1 = __webpack_require__(1794);
+var StyleMapper = /** @class */ (function (_super) {
+ __extends(StyleMapper, _super);
+ function StyleMapper() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ StyleMapper.prototype.getRole = function (node) {
+ return "computed";
+ };
+ StyleMapper.prototype.getNamespace = function () {
+ return "css";
+ };
+ StyleMapper.prototype.getAttributes = function (node) {
+ var retVal = {};
+ if (node.nodeType === 1 /* Node.ELEMENT_NODE */) {
+ var elem = node;
+ var style = elem.ownerDocument.defaultView.getComputedStyle(elem);
+ for (var idx = 0; idx < style.length; ++idx) {
+ var name_1 = style[idx].toLowerCase();
+ retVal[name_1] = style[name_1];
+ }
+ }
+ return retVal;
+ };
+ return StyleMapper;
+}(CommonMapper_1.CommonMapper));
+exports.StyleMapper = StyleMapper;
+
+
+/***/ }),
+
+/***/ 4377:
+/***/ ((__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.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = 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 = {}));
+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 eRuleCategory;
+(function (eRuleCategory) {
+ eRuleCategory["ACCESSIBILITY"] = "Accessibility";
+ eRuleCategory["DESIGN"] = "Design";
+ eRuleCategory["OTHER"] = "Other";
+})(eRuleCategory = exports.eRuleCategory || (exports.eRuleCategory = {}));
+var eRulesetType;
+(function (eRulesetType) {
+ eRulesetType["DEFAULT"] = "default";
+ eRulesetType["EXTENSION"] = "extension";
+})(eRulesetType = exports.eRulesetType || (exports.eRulesetType = {}));
+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;
+
+
+/***/ }),
+
+/***/ 7884:
+/***/ ((__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.Checker = void 0;
+var IEngine_1 = __webpack_require__(9077);
+var Engine_1 = __webpack_require__(9324);
+var ARIAMapper_1 = __webpack_require__(4944);
+var StyleMapper_1 = __webpack_require__(1970);
+var rulesets_1 = __webpack_require__(1070);
+var checkRulesV4 = __webpack_require__(8081);
+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,
+ level: rsSection.level,
+ toolkitLevel: rsSection.toolkitLevel
+ });
+ }
+ }
+ }
+ }
+ }
+ }
+}
+_initialize();
+var Checker = /** @class */ (function () {
+ function Checker() {
+ this.rulesets = [];
+ this.rulesetIds = [];
+ this.rulesetRules = {};
+ this.ruleLevels = {};
+ this.ruleCategory = {};
+ var engine = this.engine = new Engine_1.Engine();
+ engine.addMapper(new ARIAMapper_1.ARIAMapper());
+ engine.addMapper(new StyleMapper_1.StyleMapper());
+ 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);
+ }
+ }
+ Checker.prototype.addRuleset = function (rs) {
+ this.rulesets.push(rs);
+ this.rulesetIds.push(rs.id);
+ var ruleIds = [];
+ for (var _i = 0, _a = rs.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];
+ ruleIds.push(rule.id);
+ this.ruleLevels[rule.id] = this.ruleLevels[rule.id] || {};
+ this.ruleLevels[rule.id][rs.id] = rule.level;
+ this.ruleCategory[rule.id] = this.ruleCategory[rule.id] || {};
+ this.ruleCategory[rule.id][rs.id] = rs.category;
+ }
+ }
+ this.rulesetRules[rs.id] = ruleIds;
+ };
+ Checker.prototype.check = function (node, rsIds) {
+ // Determine which rules to run
+ var ruleIds = [];
+ // Fix the input
+ if (!rsIds) {
+ ruleIds = this.engine.getRulesIds();
+ }
+ else {
+ if (typeof rsIds === "string") {
+ rsIds = [rsIds];
+ }
+ for (var _i = 0, rsIds_1 = rsIds; _i < rsIds_1.length; _i++) {
+ var rsId = rsIds_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(rsIds, result.ruleId);
+ result.category = myThis.getCategory(rsIds, result.ruleId);
+ delete result.path.css;
+ }
+ return report;
+ });
+ };
+ Checker.prototype.getLevel = function (rsIds, ruleId) {
+ if (!rsIds)
+ return IEngine_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_2 = rsIds; _i < rsIds_2.length; _i++) {
+ var rsId = rsIds_2[_i];
+ if (rsId in rsInfo) {
+ if (rsInfo[rsId] === IEngine_1.eRulePolicy.VIOLATION) {
+ retVal = IEngine_1.eRulePolicy.VIOLATION;
+ }
+ else if (rsInfo[rsId] === IEngine_1.eRulePolicy.RECOMMENDATION && retVal === null) {
+ retVal = IEngine_1.eRulePolicy.RECOMMENDATION;
+ }
+ else if (retVal === null) {
+ retVal = IEngine_1.eRulePolicy.INFORMATION;
+ }
+ }
+ }
+ }
+ 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 IEngine_1.eRuleCategory.OTHER;
+ }
+ if (!rsIds) {
+ rsIds = this.rulesetIds;
+ }
+ 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 IEngine_1.eRuleCategory.OTHER;
+ };
+ return Checker;
+}());
+exports.Checker = Checker;
+
+
+/***/ }),
+
+/***/ 8980:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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 legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+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_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "a_target_warning.html",
+ "Pass_0": "a_target_warning.html",
+ "Potential_1": "a_target_warning.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Users should be warned in advance if their input action will open a new window or otherwise change their context",
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Inform the user when their input action will open a new window or otherwise change their context"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ 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) && !legacy_1.RPTUtil.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" || legacy_1.RPTUtil.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 = legacy_1.RPTUtil.getInnerText(ruleContext);
+ if (ruleContext.hasAttribute("title"))
+ textStr += " " + ruleContext.getAttribute("title");
+ 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") : (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 3961:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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 ARIAMapper_1 = __webpack_require__(4944);
+var IRule_1 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var IRule_2 = __webpack_require__(4377);
+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_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "a_text_purpose.html",
+ "Pass_0": "a_text_purpose.html",
+ "Fail_1": "a_text_purpose.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Hyperlinks must have a text description of their purpose",
+ "Pass_0": "Hyperlink has a description of its purpose",
+ "Fail_1": "Hyperlink has no link text, label or image with a text alternative"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "2.4.4",
+ 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) || legacy_1.RPTUtil.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 passed = ARIAMapper_1.ARIAMapper.computeName(ruleContext).trim().length > 0
+ || legacy_1.RPTUtil.nonTabableChildCheck(ruleContext);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1445:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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 legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+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": " elements must provide an 'alt' attribute and an alternative description",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "An element does not have an 'alt' attribute that provides a short text alternative",
+ "Fail_2": "The 'alt' attribute value for an element duplicates the 'code' attribute",
+ "Fail_3": "An element provides alternative text, but does not provide inner content"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ 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 (!legacy_1.RPTUtil.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 (!legacy_1.RPTUtil.hasInnerContentHidden(ruleContext)) {
+ return (0, IRule_1.RuleFail)("Fail_3");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 876:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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 legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+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", "WCAG_2_0", "WCAG_2_1"],
+ 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 = 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 = legacy_1.RPTUtil.hasRoleInSemantics(children[i], "document") || legacy_1.RPTUtil.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");
+ }
+};
+
+
+/***/ }),
+
+/***/ 2768:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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 legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+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": " elements in an image map must have a text alternative",
+ "Pass_0": "Rule Passed",
+ "Fail_1": " element in an image map has no text alternative"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ 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 (legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "alt")) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 2533:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var CommonUtil_1 = __webpack_require__(8137);
+exports.aria_accessiblename_exists = {
+ id: "aria_accessiblename_exists",
+ context: "aria:columnheader, aria:form, aria:heading, aria:rowheader, aria:table, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak",
+ help: {
+ "en-US": {
+ "pass": "aria_accessiblename_exists.html",
+ "fail_no_accessible_name": "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",
+ "group": "Elements with certain roles should have accessible names"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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 the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ // when table element with a caption as first child
+ if (ruleContext.nodeName.toLocaleLowerCase() === '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 = (0, CommonUtil_1.getRolesUndefinedByAria)(ruleContext);
+ if (invalidRoles && invalidRoles.length > 0)
+ return null;
+ var deprecatedRoles = (0, CommonUtil_1.getDeprecatedAriaRoles)(ruleContext);
+ if (deprecatedRoles && deprecatedRoles.length > 0)
+ return null;
+ var deprecatedAttributes = (0, CommonUtil_1.getDeprecatedAriaAttributes)(ruleContext);
+ if (deprecatedAttributes && deprecatedAttributes.length > 0)
+ return null;
+ if (legacy_1.RPTUtil.getAriaLabel(ruleContext).trim().length === 0 && !legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title")) {
+ var roles = legacy_1.RPTUtil.getRoles(ruleContext, true);
+ //when multiple roles specified, only the first valid role is applied, and the others just as fallbacks
+ if (roles && roles.length > 0 && ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]] && ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]].nameFrom && ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]].nameFrom.includes("contents")) {
+ //if (!RPTUtil.getInnerText(ruleContext) || RPTUtil.getInnerText(ruleContext).trim().length === 0)
+ //exclude the hidden text?
+ if (!legacy_1.RPTUtil.hasInnerContentHidden(ruleContext))
+ return (0, IRule_1.RuleFail)("fail_no_accessible_name", [ruleContext.nodeName.toLowerCase(), roles[0]]);
+ }
+ else
+ return (0, IRule_1.RuleFail)("fail_no_accessible_name", [ruleContext.nodeName.toLowerCase(), roles[0]]);
+ }
+ return (0, IRule_1.RulePass)("pass");
+ }
+};
+
+
+/***/ }),
+
+/***/ 7178:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 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 a 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 (legacy_1.RPTUtil.isNodeDisabled(ruleContext)) {
+ return null;
+ }
+ //check if the attribute 'aria-activedescendant' is valid for the role of the element
+ // If the tabindex attribute is provided then verify that it is 0 or -1
+ passed = legacy_1.RPTUtil.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 = legacy_1.RPTUtil.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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 9745:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var fragment_1 = __webpack_require__(482);
+var VisUtil_1 = __webpack_require__(8174);
+var DOMUtil_1 = __webpack_require__(295);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 (legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "combobox")) {
+ return null;
+ }
+ var descendant_id = legacy_1.RPTUtil.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 = legacy_1.RPTUtil.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 (legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "textbox") && ruleContext.hasAttribute("aria-controls")) {
+ pofId = 3;
+ var controlled_ids = legacy_1.RPTUtil.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 = legacy_1.RPTUtil.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;
+ }
+};
+
+
+/***/ }),
+
+/***/ 8019:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_application_label_unique = {
+ id: "aria_application_label_unique",
+ context: "aria:application",
+ refactor: {
+ "Rpt_Aria_MultipleApplicationLandmarks": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_application_label_unique.html",
+ "Fail_1": "aria_application_label_unique.html",
+ "group": "aria_application_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "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", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "application", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_application_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_application_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 6505:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_application_labelled = {
+ id: "aria_application_labelled",
+ context: "aria:application",
+ refactor: {
+ "Rpt_Aria_ApplicationLandmarkLabel": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_application_labelled.html",
+ "Fail_1": "aria_application_labelled.html",
+ "group": "aria_application_labelled.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Element with \"application\" role does not have an accessible name",
+ "group": "An element with \"application\" role must have an accessible name that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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 passed = legacy_1.RPTUtil.hasAriaLabel(ruleContext) || legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title");
+ // return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8910:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_article_label_unique = {
+ id: "aria_article_label_unique",
+ context: "aria:article",
+ refactor: {
+ "Rpt_Aria_MultipleArticleRoles_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_article_label_unique.html",
+ "Fail_1": "aria_article_label_unique.html",
+ "group": "aria_article_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "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", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "article", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_article_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_article_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel === "" || !(myLabel in dupes) || dupes[myLabel] <= 1;
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 3492:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var legacy_1 = __webpack_require__(8422);
+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", "WCAG_2_0", "WCAG_2_1"],
+ 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 (legacy_1.RPTUtil.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);
+ }
+};
+
+
+/***/ }),
+
+/***/ 5316:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CommonUtil_1 = __webpack_require__(8137);
+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": "Rule Passed",
+ "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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = (0, CommonUtil_1.getInvalidAriaAttributes)(ruleContext);
+ if (invalidAttributes && invalidAttributes.length > 0)
+ return null;
+ var ret = [];
+ var ariaAttributes = legacy_1.RPTUtil.getUserDefinedAriaAttributes(ruleContext);
+ if (!ariaAttributes || ariaAttributes.length === 0)
+ return null;
+ var conflictAttributes = (0, CommonUtil_1.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']))
+ legacy_1.RPTUtil.reduceArrayItemList([conflictAttributes[i]['ariaAttr']], ariaAttributes);
+ }
+ for (var i = 0; i < ariaAttributes.length; i++)
+ ret.push((0, IRule_1.RulePass)("pass"));
+ if (ret.length > 0)
+ return ret;
+ return null;
+ }
+};
+
+
+/***/ }),
+
+/***/ 8412:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var CommonUtil_1 = __webpack_require__(8137);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.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 ret = [];
+ var deprecatedRoles = (0, CommonUtil_1.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 = (0, CommonUtil_1.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;
+ }
+};
+
+
+/***/ }),
+
+/***/ 172:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var VisUtil_1 = __webpack_require__(8174);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = legacy_1.RPTUtil.hasAttribute;
+ var testedProperties = 0;
+ var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ for (var j = 0; j < roles.length; ++j) {
+ if (designPatterns[roles[j]] && legacy_1.RPTUtil.getRoleRequiredProperties(roles[j], ruleContext) != null) {
+ var requiredRoleProps = legacy_1.RPTUtil.getRoleRequiredProperties(roles[j], ruleContext);
+ for (var i = 0, length_1 = requiredRoleProps.length; i < length_1; i++) {
+ var attribute = requiredRoleProps[i];
+ if (hasAttribute(ruleContext, attribute)) {
+ testedProperties++;
+ var nodeValue = legacy_1.RPTUtil.normalizeSpacing(ruleContext.getAttribute(requiredRoleProps[i]));
+ if (nodeValue.length == 0)
+ attrNameArr.push(requiredRoleProps[i]);
+ }
+ else if (requiredRoleProps[i] == "aria-labelledby") {
+ if ((roles[i] == "radiogroup") && (hasAttribute(ruleContext, "aria-label"))) {
+ testedProperties++;
+ var nodeValue = legacy_1.RPTUtil.normalizeSpacing(ruleContext.getAttribute("aria-label"));
+ if (nodeValue.length == 0)
+ attrNameArr.push("aria-label");
+ }
+ }
+ else if (requiredRoleProps[i] == "aria-valuenow") {
+ if ((roles[i] == "progressbar") && (hasAttribute(ruleContext, "aria-valuetext"))) {
+ testedProperties++;
+ var nodeValue = legacy_1.RPTUtil.normalizeSpacing(ruleContext.getAttribute("aria-valuetext"));
+ if (nodeValue.length == 0)
+ attrNameArr.push("aria-valuetext");
+ }
+ }
+ }
+ }
+ if (designPatterns[roles[j]]) {
+ var tagProperty = legacy_1.RPTUtil.getElementAriaProperty(ruleContext);
+ var permittedRoles = [];
+ permittedRoles.push(roles[j]);
+ var allowedAttributes = legacy_1.RPTUtil.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 = legacy_1.RPTUtil.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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 9844:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CommonUtil_1 = __webpack_require__(8137);
+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": "Rule Passed",
+ "fail_redundant": "The ARIA attribute \"{0}\" is redundant with the HTML attribute \"{1}\"",
+ "group": "An ARIA attribute should not be used when there is a corresponding HTML attribute"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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 = (0, CommonUtil_1.getInvalidAriaAttributes)(ruleContext);
+ if (invalidAttributes && invalidAttributes.length > 0)
+ return null;
+ // if conflict already reported, ignore reporting overlap
+ var conflictAttributes = (0, CommonUtil_1.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 = legacy_1.RPTUtil.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;
+ }
+};
+
+
+/***/ }),
+
+/***/ 9695:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(8235);
+var legacy_1 = __webpack_require__(8422);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.aria_attribute_required = {
+ id: "aria_attribute_required",
+ context: "dom:*[role]",
+ dependencies: ["aria_role_allowed"],
+ refactor: {
+ "Rpt_Aria_RequiredProperties": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_attribute_required.html",
+ "Pass_0": "aria_attribute_required.html",
+ "Fail_1": "aria_attribute_required.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "When using a ARIA role on an element, the required attributes for that role must be defined",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "An element with ARIA role '{0}' does not have the required ARIA attribute(s): '{1}'"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ 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;
+ var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ //let implicitRole = ARIAMapper.elemToImplicitRole(ruleContext);
+ var implicitRole = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ var hasAttribute = legacy_1.RPTUtil.hasAttribute;
+ var testedRoles = 0;
+ for (var j = 0, rolesLength = roles.length; j < rolesLength; ++j) {
+ if (implicitRole.length > 0 && implicitRole.includes(roles[j]))
+ continue;
+ if (designPatterns[roles[j]] && legacy_1.RPTUtil.getRoleRequiredProperties(roles[j], ruleContext) != null) {
+ var requiredRoleProps = legacy_1.RPTUtil.getRoleRequiredProperties(roles[j], ruleContext);
+ var roleMissingReqProp = false;
+ testedRoles++;
+ for (var i = 0, propertiesLength = requiredRoleProps.length; i < propertiesLength; i++) {
+ 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")) || (roles[i] != "radiogroup")) {
+ attrNameArr.push(requiredRoleProps[i]);
+ roleMissingReqProp = true;
+ }
+ }
+ else if (requiredRoleProps[i] == "aria-valuenow") {
+ if ((!hasAttribute(ruleContext, "aria-valuetext")) || (roles[i] != "progressbar")) {
+ attrNameArr.push(requiredRoleProps[i]);
+ roleMissingReqProp = true;
+ }
+ }
+ else if (requiredRoleProps[i] == "aria-controls" && roles[j] == "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(roles[j]);
+ }
+ }
+ }
+ var retToken = new Array();
+ var passed = attrNameArr.length == 0; // only aria attributes so NO OUT OF SCOPE
+ retToken.push(roleNameArr.join(", "));
+ retToken.push(attrNameArr.join(", "));
+ //return new ValidationResult(passed, [ruleContext], attrNameArr, '', passed == true ? [] : retToken);
+ if (testedRoles === 0) {
+ return null;
+ }
+ else if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", retToken);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1699:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 (legacy_1.RPTUtil.isDefinedAriaAttribute(ruleContext, attrName)) {
+ var dataTypes = propertyDataTypes[attrName];
+ var nodeValue = legacy_1.RPTUtil.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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4974:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_banner_label_unique = {
+ id: "aria_banner_label_unique",
+ context: "aria:banner",
+ refactor: {
+ "Rpt_Aria_MultipleBannerLandmarks_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_banner_label_unique.html",
+ "Fail_1": "aria_banner_label_unique.html",
+ "group": "aria_banner_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "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", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "banner", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_banner_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_banner_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 3054:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+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": "There is more than one element with \"banner\" role on the page",
+ "group": "There must be only one element with \"banner\" role on the page"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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 (!legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "banner")) {
+ return null;
+ }
+ var passed = legacy_1.RPTUtil.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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4649:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var VisUtil_1 = __webpack_require__(8174);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element requires presentational children only
+ if (legacy_1.RPTUtil.containsPresentationalChildrenOnly(ruleContext) || legacy_1.RPTUtil.shouldBePresentationalChild(ruleContext))
+ return;
+ // An ARIA list is not interactive
+ if (legacy_1.RPTUtil.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;
+ var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ // Determine if this is referenced by a combobox. If so, focus is controlled by the combobox
+ // ignore if the id of the element is referenced by another element with "aria-controls" or "aria-expanded" and with certain roles. If so, focus is controlled by the referencing element
+ var id = ruleContext.getAttribute("id");
+ if (id && id.trim().length > 0) {
+ /**if (ruleContext.ownerDocument.querySelector(`*[aria-controls='${id}'][role='combobox']`)) {
+ return null;
+ }
+ */
+ var elem = ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][aria-haspopup='true'], *[aria-controls='").concat(id, "'][aria-expanded='true']"));
+ var containers_1 = ['combobox', 'listbox', 'menu', 'menubar', 'radiogroup', 'tree', 'treegrid'];
+ if (elem && legacy_1.RPTUtil.isTabbable(elem) && roles && roles.length > 0 && roles.some(function (r) { return containers_1.includes(r); }))
+ return null;
+ }
+ var passed = true;
+ var doc = ruleContext.ownerDocument;
+ var hasAttribute = legacy_1.RPTUtil.hasAttribute;
+ var roleNameArr = new Array();
+ var nodeName = "";
+ var inScope = false;
+ for (var j = 0; j < roles.length; ++j) {
+ if (ARIADefinitions_1.ARIADefinitions.containers.includes(roles[j])) {
+ var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : '';
+ if (disabled != 'true' && !hasAttribute(ruleContext, 'aria-activedescendant') && !legacy_1.RPTUtil.isTabbable(ruleContext)) {
+ var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].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, legacy_1.RPTUtil.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 (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(r)) {
+ r = xpathResult.iterateNext();
+ continue;
+ }
+ passed = legacy_1.RPTUtil.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, legacy_1.RPTUtil.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 (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(r2)) {
+ r2 = xpathResult2.iterateNext();
+ continue;
+ }
+ passed = legacy_1.RPTUtil.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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4193:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+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 a ARIA role must own a required child",
+ "Pass": "An element with a 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", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "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) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element requires presentational children only
+ if (legacy_1.RPTUtil.containsPresentationalChildrenOnly(ruleContext))
+ return;
+ var roles = legacy_1.RPTUtil.getRoles(ruleContext, false);
+ // if explicit role doesn't exist, get the implicit one
+ if (!roles || roles.length === 0)
+ roles = legacy_1.RPTUtil.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 = legacy_1.RPTUtil.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 = legacy_1.RPTUtil.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 = legacy_1.RPTUtil.getRoles(directATChildren[j], false);
+ // if explicit role doesn't exist, get the implicit one
+ if (!childRoles || childRoles.length == 0)
+ childRoles = legacy_1.RPTUtil.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");
+ }
+};
+
+
+/***/ }),
+
+/***/ 3188:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_complementary_label_unique = {
+ id: "aria_complementary_label_unique",
+ context: "aria:complementary",
+ refactor: {
+ "Rpt_Aria_MultipleComplementaryLandmarks_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_complementary_label_unique.html",
+ "Fail_1": "aria_complementary_label_unique.html",
+ "group": "aria_complementary_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "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", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "complementary", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_complementary_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_complementary_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4176:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+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": "The 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", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (!legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "complementary")) {
+ return null;
+ }
+ var passed = legacy_1.RPTUtil.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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 7964:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+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": "The element with \"complementary\" role does not have an accessible name",
+ "group": "An element with \"complementary\" role must have an accessible name"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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 passed = legacy_1.RPTUtil.hasAriaLabel(ruleContext) || legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title");
+ //return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 2554:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+var DOMWalker_1 = __webpack_require__(7440);
+var VisUtil_1 = __webpack_require__(8174);
+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"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ },
+ {
+ "id": ["WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var params = (0, CacheUtil_1.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;
+ }
+ (0, CacheUtil_1.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 (!legacy_1.RPTUtil.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" && legacy_1.RPTUtil.isLayoutTable(ruleContext)) {
+ return null;
+ }
+ // Check if it is a possible orphan
+ var passed = true;
+ var isPossibleOrphanedWidget = legacy_1.RPTUtil.hasRole(ruleContext, params.mapPossibleOrphanedWidgets, true);
+ //exclude in the and (#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 = (0, CacheUtil_1.getCache)(walkElement, "Rpt_Aria_OrphanedContent", false);
+ walkElement = DOMWalker_1.DOMWalker.parentElement(walkElement);
+ }
+ walkElement = ruleContext.nextElementSibling;
+ while (!passed && walkElement != null) {
+ passed = (0, CacheUtil_1.getCache)(walkElement, "Rpt_Aria_OrphanedContent", false);
+ walkElement = walkElement.nextElementSibling;
+ }
+ walkElement = ruleContext.previousElementSibling;
+ while (!passed && walkElement != null) {
+ passed = (0, CacheUtil_1.getCache)(walkElement, "Rpt_Aria_OrphanedContent", false);
+ walkElement = walkElement.previousElementSibling;
+ }
+ if (!passed) {
+ (0, CacheUtil_1.setCache)(ruleContext, "Rpt_Aria_OrphanedContent", true);
+ // Don't trigger rule if element is a stand-alone widget
+ passed = (0, CacheUtil_1.getCache)(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", false) ||
+ legacy_1.RPTUtil.hasRole(ruleContext, params.mapNoLandmarkedRoles, true) ||
+ legacy_1.RPTUtil.getAncestorWithRole(ruleContext, params.mapNoLandmarkedRoles, true);
+ if (passed) {
+ (0, CacheUtil_1.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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1229:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_contentinfo_label_unique = {
+ id: "aria_contentinfo_label_unique",
+ context: "aria:contentinfo",
+ refactor: {
+ "Rpt_Aria_MultipleContentinfoLandmarks_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_contentinfo_label_unique.html",
+ "Fail_1": "aria_contentinfo_label_unique.html",
+ "group": "aria_contentinfo_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "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", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "contentinfo", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_contentinfo_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_contentinfo_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8523:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+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": "The element with \"contentinfo\" role is present without an element with \"main\" role",
+ "group": "An element with \"contentinfo\" role is only permitted with an element with \"main\" role"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //consider implicit role
+ if (!legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "contentinfo")) {
+ return null;
+ }
+ // Consider the Check Hidden Content setting that is set by the rules
+ var passed = legacy_1.RPTUtil.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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 3781:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+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 a page",
+ "group": "A page, document or application should only have one element with \"contentinfo\" role"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ //find out if element has siblings as has implicit contentinfo role
+ if (!legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "contentinfo")) {
+ return null;
+ }
+ var passed = !legacy_1.RPTUtil.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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8509:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+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",
+ "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",
+ "fail_child_explicit_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ // 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) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element doesn't require presentational children only
+ if (!legacy_1.RPTUtil.containsPresentationalChildrenOnly(ruleContext))
+ return;
+ var roles = legacy_1.RPTUtil.getRoles(ruleContext, false);
+ // if explicit role doesn't exist, get the implicit one
+ if (!roles || roles.length === 0)
+ roles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ //ignore if the element doesn't have any explicit or implicit role, shouldn't happen
+ if (!roles || roles.length === 0)
+ return null;
+ var tagName = ruleContext.tagName.toLowerCase();
+ // get all the children from accessibility tree,
+ // including ones with aria-owns
+ var directATChildren = legacy_1.RPTUtil.getDirectATChildren(ruleContext);
+ if (directATChildren && directATChildren.length > 0) {
+ // the element with at least one non-presentational children
+ var explicitRoles = new Array();
+ var implicitRoles = new Array();
+ for (var j = 0; j < directATChildren.length; j++) {
+ // ignore and
+ var tag = directATChildren[j].nodeName.toLowerCase();
+ if (tag === 'img' || tag === 'svg')
+ continue;
+ // get explicit role if exists
+ var childRoles = legacy_1.RPTUtil.getRoles(directATChildren[j], false);
+ if (childRoles && childRoles.length > 0) {
+ explicitRoles.push(childRoles.join(", "));
+ }
+ else {
+ // get implicit role if exists
+ childRoles = legacy_1.RPTUtil.getImplicitRole(directATChildren[j]);
+ if (childRoles && childRoles.length > 0)
+ implicitRoles.push(childRoles.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;
+ }
+ }
+ else
+ return (0, IRule_1.RulePass)("pass");
+ }
+};
+
+
+/***/ }),
+
+/***/ 3234:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_document_label_unique = {
+ id: "aria_document_label_unique",
+ context: "aria:document",
+ refactor: {
+ "Rpt_Aria_MultipleDocumentRoles": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_document_label_unique.html",
+ "Fail_1": "aria_document_label_unique.html",
+ "group": "aria_document_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with a \"document\" role do not have unique labels",
+ "group": "All elements with a \"document\" role must have unique labels"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "document", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_document_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_document_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel === "" || !(myLabel in dupes) || dupes[myLabel] <= 1;
+ // return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 5217:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 (legacy_1.RPTUtil.getAncestor(ruleContext, "svg")) {
+ return null;
+ }
+ //this rule is passed if a element has attribut role
+ //also, passed of element has any implicit roles.
+ if (legacy_1.RPTUtil.hasAnyRole(ruleContext, true)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ //pass if this element is received focus by default
+ if (legacy_1.RPTUtil.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()]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 4050:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_form_label_unique = {
+ id: "aria_form_label_unique",
+ context: "aria:form",
+ refactor: {
+ "Rpt_Aria_MultipleFormLandmarks_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_form_label_unique.html",
+ "Fail_1": "aria_form_label_unique.html",
+ "group": "aria_form_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "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", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ // Per https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html
+ // form element should only be considered if it has an aria label or title
+ if (ruleContext.getAttribute("role") === "form" ||
+ ruleContext.hasAttribute("aria-label") ||
+ ruleContext.hasAttribute("aria-labelledby") ||
+ ruleContext.hasAttribute("title")) {
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "form", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_form_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_form_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.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");
+ }
+ }
+ else {
+ return null;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4275:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+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: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ 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. ,
, etc)
+ var passed = legacy_1.RPTUtil.getAriaLabel(ruleContext).length > 0;
+ if (!passed && ruleContext.nodeName.toLowerCase() === "svg") {
+ var svgTitle = ruleContext.querySelector("title");
+ passed = svgTitle && legacy_1.RPTUtil.hasInnerContent(svgTitle);
+ }
+ if (!passed) {
+ //check title attribute
+ passed = legacy_1.RPTUtil.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")]);
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1465:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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 legacy_1 = __webpack_require__(8422);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+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", "WCAG_2_0", "WCAG_2_1"],
+ 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 (legacy_1.RPTUtil.isTabbable(ruleContext)) {
+ return (0, IRule_1.RuleFail)("Fail_1", [nodeName]);
+ }
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+};
+
+
+/***/ }),
+
+/***/ 405:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var fragment_1 = __webpack_require__(482);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var VisUtil_1 = __webpack_require__(8174);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 (legacy_1.RPTUtil.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 = legacy_1.RPTUtil.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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 9136:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_img_labelled = {
+ id: "aria_img_labelled",
+ context: "aria:img",
+ 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: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ 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;
+ }
+ /* 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. ,
, etc)
+ var passed = legacy_1.RPTUtil.getAriaLabel(ruleContext).length > 0;
+ if (!passed && ruleContext.nodeName.toLowerCase() === "svg") {
+ var svgTitle = ruleContext.querySelector("title");
+ passed = svgTitle && legacy_1.RPTUtil.hasInnerContent(svgTitle);
+ }
+ if (!passed) {
+ //check title attribute
+ passed = legacy_1.RPTUtil.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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 5117:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = true;
+ var savedPassed = passed;
+ var doc = ruleContext.ownerDocument;
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ 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;
+ var hasAttribute = legacy_1.RPTUtil.hasAttribute;
+ // 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"];
+ 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"));
+ // 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, legacy_1.RPTUtil.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, legacy_1.RPTUtil.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 (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(r2)) {
+ r2 = xpathResult2.iterateNext();
+ continue;
+ }
+ passed = legacy_1.RPTUtil.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, legacy_1.RPTUtil.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 (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(r2)) {
+ r2 = xpathResult2.iterateNext();
+ continue;
+ }
+ passed = legacy_1.RPTUtil.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()]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 9062:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var ARIAMapper_1 = __webpack_require__(4944);
+var DOMUtil_1 = __webpack_require__(295);
+var fragment_1 = __webpack_require__(482);
+var CacheUtil_1 = __webpack_require__(7788);
+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_0",
+ "Fail_0": "Fail_0"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_landmark_name_unique.html",
+ "Fail_0": "aria_landmark_name_unique.html",
+ "group": "aria_landmark_name_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Multiple \"{0}\" landmarks with the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'",
+ "Fail_0": "Multiple \"{0}\" landmarks with the same parent region are not distinguished from one another because they have the same \"{1}\" label",
+ "group": "Multiple landmarks should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent regions"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ },
+ {
+ "id": ["WCAG_2_1", "WCAG_2_0"],
+ "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;
+ // 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(function (elem) {
+ if (elem !== null) {
+ if (elem.tagName == "DIALOG" || elem.getAttribute('role') == "dialog") {
+ return null; // Skipping checking landmarks that happen to be inside dialog elements
+ }
+ }
+ });
+ // Begining formCache work
+ var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext);
+ var formCache = (0, CacheUtil_1.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 an 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++) {
+ var a = navigationNodes[i];
+ var 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]);
+ }
+ }
+ 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++) {
+ // Loop over all the landmark nodes
+ navigationNodesComputedLabels.push(ARIAMapper_1.ARIAMapper.computeName(navigationNodes[i]));
+ }
+ 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_0"); // 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_0"); // 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_0");
+ }
+ 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;
+ (0, CacheUtil_1.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_0") {
+ return (0, IRule_1.RulePass)("Pass_0", [
+ ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]),
+ ]);
+ }
+ else if (formCache.navigationNodesMatchFound[indexToCheck] === "Fail_0") {
+ return (0, IRule_1.RuleFail)("Fail_0", [
+ ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]),
+ formCache.navigationNodesComputedLabels[indexToCheck],
+ ]);
+ }
+ else {
+ return null;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 5746:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+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": "Elements with \"main\" role must have unique labels"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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 contextLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var parentDocRole = legacy_1.RPTUtil.getAncestorWithRole(ruleContext, "document", true);
+ var mains = legacy_1.RPTUtil.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 = legacy_1.RPTUtil.getAncestorWithRole(mains[i], "document", true);
+ if (thisParentDocRole === parentDocRole) {
+ if (legacy_1.RPTUtil.getAriaLabel(mains[i]) === contextLabel) {
+ result = (0, IRule_1.RuleFail)("Fail_1");
+ break;
+ }
+ }
+ }
+ return result;
+ }
+};
+
+
+/***/ }),
+
+/***/ 8685:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ //call getElementsByRoleHidden with considerImplicit flag as true
+ //so that the method returs elements
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var passed = legacy_1.RPTUtil.hasUniqueAriaLabelledby(landmarks);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 2678:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_navigation_label_unique = {
+ id: "aria_navigation_label_unique",
+ context: "aria:navigation",
+ refactor: {
+ "Rpt_Aria_MultipleNavigationLandmarks_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_navigation_label_unique.html",
+ "Fail_1": "aria_navigation_label_unique.html",
+ "group": "aria_navigation_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "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", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ // Consider the Check Hidden Content setting that is set by the rules
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "navigation", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_navigation_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_navigation_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 971:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+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": "An element with an implicit or explicit role must be contained within a valid element",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The element with role \"{0}\" is not contained in or owned by an element with one of the following roles: \"{1}\""
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "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) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element should be a presentational child of an element
+ if (legacy_1.RPTUtil.shouldBePresentationalChild(ruleContext))
+ return;
+ var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ // 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 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 (var j = 0, length_1 = roles.length; j < length_1; ++j) {
+ if (designPatterns[roles[j]] && designPatterns[roles[j]].container != null) {
+ testedContainer++;
+ passed = false;
+ containerRoles = designPatterns[roles[j]].container;
+ for (var i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) {
+ passed = parentRole === containerRoles[i];
+ if (passed)
+ break;
+ }
+ if (passed == false) {
+ roleNameArr.push(roles[j]);
+ }
+ }
+ }
+ 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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 3709:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_region_label_unique = {
+ id: "aria_region_label_unique",
+ context: "aria:region",
+ refactor: {
+ "Rpt_Aria_MultipleRegionsUniqueLabel_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_region_label_unique.html",
+ "Fail_1": "aria_region_label_unique.html",
+ "group": "aria_region_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"region\" role do not have unique labels",
+ "group": "Each element with a \"region\" role must have a unique label"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ // Per https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html
+ // form element should only be considered if it has an aria label or title
+ if (ruleContext.getAttribute("role") === "region" ||
+ ruleContext.hasAttribute("aria-label") ||
+ (ruleContext.hasAttribute("aria-labelledby") && !legacy_1.RPTUtil.isIdReferToSelf(ruleContext, ruleContext.getAttribute("aria-labelledby"))) ||
+ ruleContext.hasAttribute("title")) {
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "region", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_region_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_region_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.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");
+ }
+ }
+ else {
+ return null;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 6486:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+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 a \"region\" role does not have an accessible name",
+ "Fail_2": "The element with \"region\" role is not labeled with an 'aria-label' or 'aria-labelledby'",
+ "group": "Each element with \"region\" role must have an accessible name that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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 passed = legacy_1.RPTUtil.hasAriaLabel(ruleContext) || legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title");
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4151:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var CommonUtil_1 = __webpack_require__(8137);
+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", "WCAG_2_0", "WCAG_2_1"],
+ 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 = (0, CommonUtil_1.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(",")]);
+ }
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8545:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CommonUtil_1 = __webpack_require__(8137);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var elemName = ruleContext.tagName.toLowerCase();
+ var ariaRoles = legacy_1.RPTUtil.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 = (0, CommonUtil_1.areRolesDefined)(ariaRoles);
+ if (!role_defined)
+ return null;
+ // dependency check: if it's already failed in the parent relation, then skip this check
+ if (["td", "th", "tr"].includes(elemName)) {
+ var parentRole = (0, CommonUtil_1.isTableDescendant)(contextHierarchies);
+ if (parentRole !== null && parentRole.length > 0)
+ return null;
+ }
+ var implicitRoles = legacy_1.RPTUtil.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;
+ }
+};
+
+
+/***/ }),
+
+/***/ 8538:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_search_label_unique = {
+ id: "aria_search_label_unique",
+ context: "aria:search",
+ refactor: {
+ "Rpt_Aria_MultipleSearchLandmarks": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_search_label_unique.html",
+ "Fail_1": "aria_search_label_unique.html",
+ "group": "aria_search_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "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": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ // Consider the Check Hidden Content setting that is set by the rules
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "search", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_search_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_search_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ // return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1908:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CommonUtil_1 = __webpack_require__(8137);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = (0, CommonUtil_1.getRolesUndefinedByAria)(ruleContext);
+ if (undefinedRoles && undefinedRoles.length > 0)
+ return null;
+ var deprecatedRoles = (0, CommonUtil_1.getDeprecatedAriaRoles)(ruleContext);
+ if (deprecatedRoles && deprecatedRoles.length > 0)
+ return null;
+ var deprecatedAttributes = (0, CommonUtil_1.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 = (0, CommonUtil_1.isTableDescendant)(contextHierarchies);
+ if (parentRole !== null && parentRole.length > 0)
+ return null;
+ }
+ var domRoles = legacy_1.RPTUtil.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 = (0, CommonUtil_1.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") && legacy_1.RPTUtil.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 must 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", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "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 = legacy_1.RPTUtil.getUserDefinedAriaAttributes(ruleContext);
+ if (ariaAttributes === null || ariaAttributes.length === 0)
+ return null;
+ var roles = legacy_1.RPTUtil.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 (!(0, CommonUtil_1.areRolesDefined)(roles))
+ return null;
+ }
+ else {
+ //no explicit role defined
+ roles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ explicit = false;
+ }
+ var tagName = ruleContext.tagName.toLowerCase();
+ var failedAttributes = (0, CommonUtil_1.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"]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 6360:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+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 toolbar components do not have unique labels",
+ "group": "All toolbar components on a page must have unique labels specified"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "toolbar", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_toolbar_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_toolbar_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 5386:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIAMapper_1 = __webpack_require__(4944);
+var fragment_1 = __webpack_require__(482);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var DOMUtil_1 = __webpack_require__(295);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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") ||
+ (legacy_1.RPTUtil.getAncestorWithRole(ruleContext, "combobox") &&
+ !(legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "textbox") ||
+ legacy_1.RPTUtil.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 (legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) {
+ var comboboxes = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true);
+ for (var k = 0; k < comboboxes.length; k++) {
+ var combobox = comboboxes[k];
+ var aria_owns = legacy_1.RPTUtil.getElementAttribute(combobox, "aria-owns");
+ if (aria_owns) {
+ var owns = legacy_1.RPTUtil.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 = legacy_1.RPTUtil.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 =
+ legacy_1.RPTUtil.hasAriaLabel(ruleContext) ||
+ legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title") ||
+ legacy_1.RPTUtil.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 = legacy_1.RPTUtil.hasInnerContentOrAlt(ruleContext);
+ }
+ if (!passed) {
+ // check if it has implicit label, like abc
+ passed = legacy_1.RPTUtil.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");
+ // }
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 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.asciiart_alt_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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
HtmlUnit:
+ // 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 ||
+ legacy_1.RPTUtil.getAncestor(ruleContext, "code")) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ var passed = true;
+ var txtValue = legacy_1.RPTUtil.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");
+ }
+};
+
+
+/***/ }),
+
+/***/ 4392:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+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", "WCAG_2_0", "WCAG_2_1"],
+ 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 = legacy_1.RPTUtil.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");
+ }
+};
+
+
+/***/ }),
+
+/***/ 932:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.blink_elem_deprecated = {
+ id: "blink_elem_deprecated",
+ context: "dom:blink",
+ refactor: {
+ "WCAG20_Blink_AlwaysTrigger": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "blink_elem_deprecated.html",
+ "Pass_0": "blink_elem_deprecated.html",
+ "Fail_1": "blink_elem_deprecated.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Content that blinks persistently must not be used",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Content found that blinks persistently"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ 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");
+ }
+};
+
+
+/***/ }),
+
+/***/ 6255:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+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 should not be used only for quotations, not indentation",
+ "group": "Use only for quotations, not indentation"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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 = legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "cite");
+ if (!passed) {
+ var citeElems = legacy_1.RPTUtil.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");
+ }
+};
+
+
+/***/ }),
+
+/***/ 5743:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var VisUtil_1 = __webpack_require__(8174);
+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 element",
+ "group": "The element may not be accessible"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.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)(1);
+ if (!passed)
+ return (0, IRule_1.RuleManual)("Manual_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 2671:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+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 element",
+ "group": "A element must have a text alternative for any meaningful audio content"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.2.1", "1.2.2", "1.2.4"],
+ "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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 3974:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var fragment_1 = __webpack_require__(482);
+var CacheUtil_1 = __webpack_require__(7788);
+var VisUtil_1 = __webpack_require__(8174);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ 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 legacy_1.NodeWalker(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 = legacy_1.RPTUtil.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;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 9881:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+var VisUtil_1 = __webpack_require__(8174);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ 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 legacy_1.NodeWalker(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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1226:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+var VisUtil_1 = __webpack_require__(8174);
+function patternDetect(elem) {
+ // check 'explicit' role combobox and that it is not .
+ 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", "WCAG_2_1", "WCAG_2_0"],
+ "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) || legacy_1.RPTUtil.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 = (legacy_1.RPTUtil.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 = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ cache[key] = {
+ "inputElement": editable ? ruleContext : null,
+ "pattern": pattern,
+ "expanded": expanded
+ };
+ (0, CacheUtil_1.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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 7369:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+var VisUtil_1 = __webpack_require__(8174);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ 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 = legacy_1.RPTUtil.getRoles(popupElement, true)[0];
+ var retVal = [];
+ if (!legacy_1.RPTUtil.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 = !legacy_1.RPTUtil.isTabbable(popupElement) && !legacy_1.RPTUtil.getAriaAttribute(popupElement, "aria-activedescendant");
+ ;
+ // if any child of popupElement has "aria-autocomplete"
+ if (passed && popupElement.children && popupElement.children.length > 0) {
+ var nw = new legacy_1.NodeWalker(popupElement);
+ while (passed && nw.nextNode()) {
+ if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) {
+ passed = !legacy_1.RPTUtil.isTabbable(nw.node) &&
+ !legacy_1.RPTUtil.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;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 2633:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ 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 = legacy_1.RPTUtil.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");
+ }
+};
+
+
+/***/ }),
+
+/***/ 2429:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var fragment_1 = __webpack_require__(482);
+var CacheUtil_1 = __webpack_require__(7788);
+var VisUtil_1 = __webpack_require__(8174);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ 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") {
+ return (0, IRule_1.RulePass)(expanded ? "Pass_1.0_expanded" : "Pass_1.0_collapsed");
+ }
+ else {
+ return (0, IRule_1.RulePass)(expanded ? "Pass_1.2_expanded" : "Pass_1.2_collapsed");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 7874:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+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;
+ }
+};
+
+
+/***/ }),
+
+/***/ 3334:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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 legacy_1 = __webpack_require__(8422);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+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 (!legacy_1.RPTUtil.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")
+ }]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 4298:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4435:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.download_keyboard_controllable = {
+ id: "download_keyboard_controllable",
+ context: "dom:a[href],dom:area[href]",
+ refactor: {
+ "HAAC_Media_DocumentTrigger2": {
+ "Pass_0": "Pass_0",
+ "Manual_1": "Manual_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "download_keyboard_controllable.html",
+ "Manual_1": "download_keyboard_controllable.html",
+ "group": "download_keyboard_controllable.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = legacy_1.RPTUtil.getFileExt(href);
+ var passed = ![".docx", ".doc", ".pdf", ".odt"].includes(ext);
+ if (passed)
+ return null;
+ if (!passed)
+ return (0, IRule_1.RuleManual)("Manual_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 6313:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var DOMWalker_1 = __webpack_require__(7440);
+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 HTML element with an assigned 'accesskey' attribute does not have an associated label",
+ "group": "An HTML element with an assigned 'accesskey' attribute must have an associated label"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ var passed = false;
+ if (legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title")) {
+ passed = true;
+ }
+ else if (legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "aria-label")) {
+ passed = true;
+ }
+ else if (legacy_1.RPTUtil.getLabelForElementHidden(ruleContext, true)) { // ignore hidden
+ passed = true;
+ }
+ else if (legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "aria-labelledby")) {
+ // assume the validity of the id (of aria-labelledby) is checked by a different rule
+ passed = true;
+ }
+ else if (ruleContext.nodeName.toLowerCase() === "input"
+ && DOMWalker_1.DOMWalker.parentNode(ruleContext).nodeName.toLowerCase() === "label") {
+ // assume the validity of the label, e.g. empty label, is checked by a different rule
+ passed = true;
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 9109:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var CacheUtil_1 = __webpack_require__(7788);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var map = (0, CacheUtil_1.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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 9918:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ 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");
+ }
+};
+
+
+/***/ }),
+
+/***/ 8105:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var fragment_1 = __webpack_require__(482);
+exports.element_id_unique = {
+ id: "element_id_unique",
+ context: "dom:*[id]",
+ refactor: {
+ "RPT_Elem_UniqueId": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "element_id_unique.html",
+ "Pass_0": "element_id_unique.html",
+ "Fail_1": "element_id_unique.html",
+ "Fail_2": "element_id_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Element 'id' attribute values must be unique within a document",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The <{0}> element has the id \"{1}\" that is empty",
+ "Fail_2": "The <{0}> element has the id \"{1}\" that is already in use"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [{
+ "3ea0c8": {
+ "Pass_0": "pass",
+ "Fail_1": "pass",
+ "Fail_2": "fail"
+ }
+ }],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // JCH - NO OUT OF SCOPE hidden in context
+ 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.RuleFail)("Fail_1", [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.RuleFail)("Fail_2", [ruleContext.nodeName.toLowerCase(), id]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8687:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var lang_1 = __webpack_require__(2527);
+var VisUtil_1 = __webpack_require__(8174);
+var DOMWalker_1 = __webpack_require__(7440);
+var ARIAMapper_1 = __webpack_require__(4944);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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", "WCAG_2_1", "WCAG_2_0"],
+ "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);
+ 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 {
+ hasContent = hasContent
+ || element.nodeName.toLowerCase() === "img" && ARIAMapper_1.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;
+ }
+};
+
+
+/***/ }),
+
+/***/ 2150:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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(", ")]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 4557:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var CSSUtil_1 = __webpack_require__(1775);
+var VisUtil_1 = __webpack_require__(8174);
+var CacheUtil_1 = __webpack_require__(7788);
+var fragment_1 = __webpack_require__(482);
+var legacy_1 = __webpack_require__(8422);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 (legacy_1.RPTUtil.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 = (0, CacheUtil_1.getCache)(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", null);
+ if (!orientationTransforms) {
+ orientationTransforms = (0, CSSUtil_1.getMediaOrientationTransform)(doc);
+ (0, CacheUtil_1.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 && (0, CSSUtil_1.selectorMatchesElem)(ruleContext, tag))
+ media_transforms.push(orientationTransforms[key][tag].transform);
+ });
+ });
+ // 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];
+ 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 = (0, CSSUtil_1.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 = (0, CSSUtil_1.getDefinedStyles)(ruleContext);
+ /**
+ * compensate the media orientation with the page orientation
+ */
+ if (definedStyle['transform']) {
+ var page_degree = (0, CSSUtil_1.getRotationDegree)(definedStyle['transform']);
+ degree -= page_degree;
+ }
+ // allow 1 degree floating range for the right angle
+ if ((degree > 89 && degree < 91) || (degree > -91 && degree < -89))
+ 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;
+ }
+};
+
+
+/***/ }),
+
+/***/ 4721:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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 legacy_1 = __webpack_require__(8422);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var VisUtil_1 = __webpack_require__(8174);
+var CSSUtil_1 = __webpack_require__(1775);
+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"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ num: ["2.1.1"],
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: ["ossw9k"],
+ 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) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip elements
+ if (legacy_1.RPTUtil.getAncestor(ruleContext, ["iframe", "svg", "script", "meta"]))
+ return null;
+ //skip if no visible content
+ if (!legacy_1.RPTUtil.hasInnerContent(ruleContext))
+ return null;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ var styles = (0, CSSUtil_1.getComputedStyle)(ruleContext);
+ // not scrollable, inapplicable
+ if ((styles.overflowX === 'visible' || styles.overflowX === 'hidden')
+ && (styles.overflowY === 'visible' || styles.overflowY === 'hidden'))
+ return null;
+ // ignore if the overall scrollable element (clientWidth + scrollbarWidth and clientHeight + scrollbarHeight) is too small to be visible on screen
+ if (Math.max(ruleContext.offsetWidth, ruleContext.offsetHeight) < 30 || Math.min(ruleContext.offsetWidth, ruleContext.offsetHeight) < 15)
+ return null;
+ // ignore if both x and y scroll distances < element's horizontal/vertical padding
+ var padding_x = (0, CSSUtil_1.getPixelsFromStyle)(styles.paddingLeft, ruleContext) + (0, CSSUtil_1.getPixelsFromStyle)(styles.paddingRight, ruleContext);
+ var padding_y = (0, CSSUtil_1.getPixelsFromStyle)(styles.paddingTop, ruleContext) + (0, CSSUtil_1.getPixelsFromStyle)(styles.paddingBottom, ruleContext);
+ if (ruleContext.scrollWidth - ruleContext.clientWidth < 1 + padding_x
+ && ruleContext.scrollHeight - ruleContext.clientHeight < 1 + padding_y)
+ return null;
+ // pass iframe element has a tabindex attribute value that is not negative
+ if (ruleContext.hasAttribute("tabindex") && parseInt(ruleContext.getAttribute("tabindex")) >= 0)
+ return (0, IRule_1.RulePass)("pass_tabbable");
+ // check if element content is tabbable
+ var count = legacy_1.RPTUtil.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", [nodeName]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 2814:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var CSSUtil_1 = __webpack_require__(1775);
+var DOMWalker_1 = __webpack_require__(7440);
+var VisUtil_1 = __webpack_require__(8174);
+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",
+ "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",
+ "group": "A tabbable element must have a valid widget role"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ },
+ {
+ "id": ["WCAG_2_1", "WCAG_2_0"],
+ "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 (legacy_1.RPTUtil.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 legacy_1.RPTUtil.tabTagMap) {
+ var value = legacy_1.RPTUtil.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 elements with CSS overflow: scroll or auto
+ var styles = (0, CSSUtil_1.getDefinedStyles)(ruleContext);
+ if (styles['overflow-x'] === 'scroll' || styles['overflow-y'] === 'scroll'
+ || styles['overflow-x'] === 'auto' || styles['overflow-y'] === 'auto')
+ return null;
+ var roles = legacy_1.RPTUtil.getRoles(ruleContext, false);
+ // 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 (roles && roles.includes("application"))
+ 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"];
+ if (!roles || roles.length === 0) {
+ roles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ }
+ var parent = DOMWalker_1.DOMWalker.parentNode(ruleContext);
+ var parent_roles = legacy_1.RPTUtil.getRoles(parent, true);
+ // ignore if one of the parent roles is in roles_no_interactive_child
+ for (var i = 0; i < parent_roles.length; i++) {
+ if (roles_no_interactive_child.includes(parent_roles[i]))
+ 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
+ for (var i = 0; i < roles.length; i++) {
+ // Row is weird. It's structure, but can also be widget
+ if (roles[i] === "row" || ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]].roleType === 'widget') {
+ return (0, IRule_1.RulePass)("pass");
+ }
+ // Focusable separators are widgets
+ if (roles[i] === "separator") {
+ return (0, IRule_1.RulePass)("pass");
+ }
+ }
+ return (0, IRule_1.RuleFail)("fail_invalid_role", [roles.length === 0 ? 'none' : roles.join(', ')]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 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.element_tabbable_visible = void 0;
+var legacy_1 = __webpack_require__(8422);
+var CSSUtil_1 = __webpack_require__(1775);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+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 is visible on the screen when it has keyboard focus"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ 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 (!legacy_1.RPTUtil.isTabbable(ruleContext))
+ return null;
+ var nodeName = ruleContext.nodeName.toLocaleLowerCase();
+ var bounds = context["dom"].bounds;
+ //in case the bounds not available
+ if (!bounds)
+ return null;
+ // defined styles only give the styles that changed
+ var defined_styles = (0, CSSUtil_1.getDefinedStyles)(ruleContext);
+ var onfocus_styles = (0, CSSUtil_1.getDefinedStyles)(ruleContext, ":focus");
+ if (bounds['height'] === 0 || bounds['width'] === 0
+ || (defined_styles['position'] === 'absolute' && defined_styles['clip'] && defined_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)'
+ && !onfocus_styles['clip']))
+ return (0, IRule_1.RulePotential)("potential_visible", []);
+ if (bounds['top'] >= 0 && bounds['left'] >= 0)
+ return (0, IRule_1.RulePass)("pass");
+ var default_styles = (0, CSSUtil_1.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", []);
+ }
+};
+
+
+/***/ }),
+
+/***/ 4497:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+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 element has alternative content",
+ "group": "Provide alternative content for elements"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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 = legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "alt");
+ return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 152:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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_noembed_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.embed_noembed_exists = {
+ id: "embed_noembed_exists",
+ context: "dom:embed",
+ refactor: {
+ "WCAG20_Embed_HasNoEmbed": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "embed_noembed_exists.html",
+ "Potential_1": "embed_noembed_exists.html",
+ "group": "embed_noembed_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that the element is immediately followed by a non-embedded element",
+ "group": " elements should be immediately followed by a non-embedded element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ var passed = ruleContext.getElementsByTagName("noembed").length > 0;
+ if (!passed) {
+ var walkNode = ruleContext.nextSibling;
+ while (!passed && walkNode !== null) {
+ if (walkNode.nodeName.toLowerCase() == "noembed")
+ passed = true;
+ else if (walkNode.nodeName.toLowerCase() == "#text" && walkNode.nodeValue.trim().length > 0)
+ break;
+ else if (walkNode.nodeType == 1)
+ break;
+ walkNode = walkNode.nextSibling;
+ }
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 935:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var legacy_1 = __webpack_require__(8422);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = legacy_1.RPTUtil.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");
+ }
+};
+
+
+/***/ }),
+
+/***/ 9719:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var fragment_1 = __webpack_require__(482);
+var VisUtil_1 = __webpack_require__(8174);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = legacy_1.RPTUtil.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");
+ }
+};
+
+
+/***/ }),
+
+/***/ 5625:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var ARIAMapper_1 = __webpack_require__(4944);
+var fragment_1 = __webpack_require__(482);
+var CacheUtil_1 = __webpack_require__(7788);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext);
+ var formCache = (0, CacheUtil_1.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++) {
+ // Loop over all the landmark nodes
+ groupsWithInputsComputedLabels.push(ARIAMapper_1.ARIAMapper.computeName(groupsWithInputs[i]));
+ }
+ formCache.groupsWithInputs = groupsWithInputs;
+ formCache.groupsWithInputsComputedLabels =
+ groupsWithInputsComputedLabels;
+ (0, CacheUtil_1.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]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 9115:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+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": " element does not have a ",
+ "Fail_2": " element has more than one ",
+ "Fail_3": " element is empty",
+ "group": " elements should have a single, non-empty as a label"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ // In the case a legend is hidden, we should still trigger a violations for this
+ var legends = legacy_1.RPTUtil.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 (legacy_1.RPTUtil.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");
+ }
+};
+
+
+/***/ }),
+
+/***/ 6072:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var VisUtil_1 = __webpack_require__(8174);
+var legacy_1 = __webpack_require__(8422);
+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 element does not have an associated label",
+ "group": "A element must have an associated label"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "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;
+ }
+ var passed = legacy_1.RPTUtil.hasAriaLabel(ruleContext) || legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title");
+ //return new ValidationResult(passed, [ruleContext], '', '', []);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", []);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 6923:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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");
+ }
+};
+
+
+/***/ }),
+
+/***/ 9015:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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" || legacy_1.RPTUtil.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 = legacy_1.RPTUtil.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");
+ }
+};
+
+
+/***/ }),
+
+/***/ 3611:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var fragment_1 = __webpack_require__(482);
+var CacheUtil_1 = __webpack_require__(7788);
+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", "WCAG_2_1", "WCAG_2_0"],
+ "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 = (0, CacheUtil_1.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");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4846:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 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__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+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