UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

439 lines 66 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getParentExceptShadowRoot = exports.getTopSameDomainWindow = exports.findParent = exports.getParents = exports.closest = exports.getTagName = exports.getMapContainer = exports.getScrollbarSize = exports.isElementReadOnly = exports.isHammerheadAttr = exports.isElementFocusable = exports.isShadowRoot = exports.isShadowUIElement = exports.isDomElement = exports.isContentEditableElement = exports.isTextEditableElementAndEditingAllowed = exports.isTextEditableElement = exports.isTextEditableInput = exports.isDocument = exports.isHtmlElement = exports.isBodyElement = exports.isMapElement = exports.isSVGElement = exports.isOptionElement = exports.isCheckboxElement = exports.isColorInputElement = exports.isRadioButtonElement = exports.isSelectElement = exports.isLabelElement = exports.isFormElement = exports.isImgElement = exports.isAnchorElement = exports.isTextAreaElement = exports.isFileInput = exports.isButtonElement = exports.isInputElement = exports.isIframeElement = exports.isRenderedNode = exports.isTextNode = exports.isElementNode = exports.getSelectVisibleChildren = exports.getChildVisibleIndex = exports.getSelectParent = exports.isCrossDomainWindows = exports.getIframeByElement = exports.isElementInIframe = exports.isElementInDocument = exports.find = exports.findDocument = exports.getActiveElement = void 0; exports.isDocumentElement = exports.getDocumentElement = exports.getImgMapName = exports.getNodeText = exports.isNodeEqual = exports.contains = exports.isShadowElement = exports.setElementValue = exports.getElementValue = exports.setTextAreaValue = exports.setInputValue = exports.getTextAreaValue = exports.getInputValue = exports.getChildNodesLength = exports.getChildrenLength = exports.getCommonAncestor = exports.isEditableFormElement = exports.findIframeByWindow = exports.isTopWindow = exports.isIFrameWindowInDOM = exports.remove = exports.getFocusableParent = exports.getElementDescription = exports.isTheSameNode = exports.getElementIndexInParent = exports.isOptionGroupElement = exports.isElementContainsNode = exports.isEditableElement = exports.blocksImplicitSubmission = exports.getTextareaPositionByLineAndOffset = exports.getTextareaLineNumberByPosition = exports.getTextareaIndentInLine = exports.containsElement = exports.getTabIndexAttributeIntValue = exports.getFocusableElements = void 0; const hammerhead_1 = __importDefault(require("../deps/hammerhead")); const arrayUtils = __importStar(require("./array")); const browserUtils = hammerhead_1.default.utils.browser; const nativeMethods = hammerhead_1.default.nativeMethods; // NOTE: We have to retrieve styleUtils.get from hammerhead // to avoid circular dependencies between domUtils and styleUtils const getElementStyleProperty = hammerhead_1.default.utils.style.get; exports.getActiveElement = hammerhead_1.default.utils.dom.getActiveElement; exports.findDocument = hammerhead_1.default.utils.dom.findDocument; exports.find = hammerhead_1.default.utils.dom.find; exports.isElementInDocument = hammerhead_1.default.utils.dom.isElementInDocument; exports.isElementInIframe = hammerhead_1.default.utils.dom.isElementInIframe; exports.getIframeByElement = hammerhead_1.default.utils.dom.getIframeByElement; exports.isCrossDomainWindows = hammerhead_1.default.utils.dom.isCrossDomainWindows; exports.getSelectParent = hammerhead_1.default.utils.dom.getSelectParent; exports.getChildVisibleIndex = hammerhead_1.default.utils.dom.getChildVisibleIndex; exports.getSelectVisibleChildren = hammerhead_1.default.utils.dom.getSelectVisibleChildren; exports.isElementNode = hammerhead_1.default.utils.dom.isElementNode; exports.isTextNode = hammerhead_1.default.utils.dom.isTextNode; exports.isRenderedNode = hammerhead_1.default.utils.dom.isRenderedNode; exports.isIframeElement = hammerhead_1.default.utils.dom.isIframeElement; exports.isInputElement = hammerhead_1.default.utils.dom.isInputElement; exports.isButtonElement = hammerhead_1.default.utils.dom.isButtonElement; exports.isFileInput = hammerhead_1.default.utils.dom.isFileInput; exports.isTextAreaElement = hammerhead_1.default.utils.dom.isTextAreaElement; exports.isAnchorElement = hammerhead_1.default.utils.dom.isAnchorElement; exports.isImgElement = hammerhead_1.default.utils.dom.isImgElement; exports.isFormElement = hammerhead_1.default.utils.dom.isFormElement; exports.isLabelElement = hammerhead_1.default.utils.dom.isLabelElement; exports.isSelectElement = hammerhead_1.default.utils.dom.isSelectElement; exports.isRadioButtonElement = hammerhead_1.default.utils.dom.isRadioButtonElement; exports.isColorInputElement = hammerhead_1.default.utils.dom.isColorInputElement; exports.isCheckboxElement = hammerhead_1.default.utils.dom.isCheckboxElement; exports.isOptionElement = hammerhead_1.default.utils.dom.isOptionElement; exports.isSVGElement = hammerhead_1.default.utils.dom.isSVGElement; exports.isMapElement = hammerhead_1.default.utils.dom.isMapElement; exports.isBodyElement = hammerhead_1.default.utils.dom.isBodyElement; exports.isHtmlElement = hammerhead_1.default.utils.dom.isHtmlElement; exports.isDocument = hammerhead_1.default.utils.dom.isDocument; exports.isTextEditableInput = hammerhead_1.default.utils.dom.isTextEditableInput; exports.isTextEditableElement = hammerhead_1.default.utils.dom.isTextEditableElement; exports.isTextEditableElementAndEditingAllowed = hammerhead_1.default.utils.dom.isTextEditableElementAndEditingAllowed; exports.isContentEditableElement = hammerhead_1.default.utils.dom.isContentEditableElement; exports.isDomElement = hammerhead_1.default.utils.dom.isDomElement; exports.isShadowUIElement = hammerhead_1.default.utils.dom.isShadowUIElement; exports.isShadowRoot = hammerhead_1.default.utils.dom.isShadowRoot; exports.isElementFocusable = hammerhead_1.default.utils.dom.isElementFocusable; exports.isHammerheadAttr = hammerhead_1.default.utils.dom.isHammerheadAttr; exports.isElementReadOnly = hammerhead_1.default.utils.dom.isElementReadOnly; exports.getScrollbarSize = hammerhead_1.default.utils.dom.getScrollbarSize; exports.getMapContainer = hammerhead_1.default.utils.dom.getMapContainer; exports.getTagName = hammerhead_1.default.utils.dom.getTagName; exports.closest = hammerhead_1.default.utils.dom.closest; exports.getParents = hammerhead_1.default.utils.dom.getParents; exports.findParent = hammerhead_1.default.utils.dom.findParent; exports.getTopSameDomainWindow = hammerhead_1.default.utils.dom.getTopSameDomainWindow; exports.getParentExceptShadowRoot = hammerhead_1.default.utils.dom.getParentExceptShadowRoot; function canFocus(element, parent, tabIndex) { let activeElement = null; if (parent.nodeType === Node.DOCUMENT_NODE) activeElement = nativeMethods.documentActiveElementGetter.call(parent); if (element === activeElement) return true; if (element.disabled) return false; if (getElementStyleProperty(element, 'display') === 'none' || getElementStyleProperty(element, 'visibility') === 'hidden') return false; if (browserUtils.isAndroid && (0, exports.isOptionElement)(element)) return false; if (tabIndex !== null && tabIndex < 0) return false; return true; } function wrapElement(el) { return { el: el, skip: el.shadowRoot && el.tabIndex < 0, children: {}, }; } function buildFocusableTree(parent, sort) { const node = wrapElement(parent); parent = parent.shadowRoot || parent; if ((0, exports.isIframeElement)(parent)) parent = nativeMethods.contentDocumentGetter.call(parent); if (parent && (parent.nodeType === Node.DOCUMENT_FRAGMENT_NODE || parent.nodeType === Node.DOCUMENT_NODE)) { const elements = filterFocusableElements(parent); for (const el of elements) { const key = !sort || el.tabIndex <= 0 ? -1 : el.tabIndex; node.children[key] = node.children[key] || []; node.children[key].push(buildFocusableTree(el, sort)); } } return node; } function filterFocusableElements(parent) { // NOTE: We don't take into account the case of embedded contentEditable // elements and specify the contentEditable attribute for focusable elements const allElements = parent.querySelectorAll('*'); const invisibleElements = getInvisibleElements(allElements); const inputElementsRegExp = /^(input|button|select|textarea)$/; const focusableElements = []; let element = null; let tagName = null; let tabIndex = null; for (let i = 0; i < allElements.length; i++) { element = allElements[i]; tagName = (0, exports.getTagName)(element); tabIndex = getTabIndexAttributeIntValue(element); if (!canFocus(element, parent, tabIndex)) continue; const contentEditableAttr = element.getAttribute('contenteditable'); const needPush = inputElementsRegExp.test(tagName) || element.shadowRoot || (0, exports.isIframeElement)(element) || (0, exports.isAnchorElement)(element) && element.hasAttribute('href') || contentEditableAttr === '' || contentEditableAttr === 'true' || tabIndex !== null; if (needPush) focusableElements.push(element); } //NOTE: remove children of invisible elements return arrayUtils.filter(focusableElements, el => !containsElement(invisibleElements, el)); } function flattenFocusableTree(node) { const result = []; if (!node.skip && node.el.nodeType !== Node.DOCUMENT_NODE && !(0, exports.isIframeElement)(node.el)) result.push(node.el); for (const prop in node.children) { for (const childNode of node.children[prop]) result.push(...flattenFocusableTree(childNode)); } return result; } function getFocusableElements(doc, sort = false) { const root = buildFocusableTree(doc, sort); return flattenFocusableTree(root); } exports.getFocusableElements = getFocusableElements; function getInvisibleElements(elements) { const invisibleElements = []; for (let i = 0; i < elements.length; i++) { if (getElementStyleProperty(elements[i], 'display') === 'none') invisibleElements.push(elements[i]); } return invisibleElements; } function getTabIndexAttributeIntValue(el) { let tabIndex = nativeMethods.getAttribute.call(el, 'tabindex'); if (tabIndex !== null) { tabIndex = parseInt(tabIndex, 10); tabIndex = isNaN(tabIndex) ? null : tabIndex; } return tabIndex; } exports.getTabIndexAttributeIntValue = getTabIndexAttributeIntValue; function containsElement(elements, element) { if (elements.contains) return elements.contains(element); return arrayUtils.some(elements, parent => parent.contains(element)); } exports.containsElement = containsElement; function getTextareaIndentInLine(textarea, position) { const textareaValue = getTextAreaValue(textarea); if (!textareaValue) return 0; const topPart = textareaValue.substring(0, position); const linePosition = topPart.lastIndexOf('\n') === -1 ? 0 : topPart.lastIndexOf('\n') + 1; return position - linePosition; } exports.getTextareaIndentInLine = getTextareaIndentInLine; function getTextareaLineNumberByPosition(textarea, position) { const textareaValue = getTextAreaValue(textarea); const lines = textareaValue.split('\n'); let topPartLength = 0; let line = 0; for (let i = 0; topPartLength <= position; i++) { if (position <= topPartLength + lines[i].length) { line = i; break; } topPartLength += lines[i].length + 1; } return line; } exports.getTextareaLineNumberByPosition = getTextareaLineNumberByPosition; function getTextareaPositionByLineAndOffset(textarea, line, offset) { const textareaValue = getTextAreaValue(textarea); const lines = textareaValue.split('\n'); let lineIndex = 0; for (let i = 0; i < line; i++) lineIndex += lines[i].length + 1; return lineIndex + offset; } exports.getTextareaPositionByLineAndOffset = getTextareaPositionByLineAndOffset; // NOTE: the form is also submitted on enter key press if there is only one input of certain // types (referred to as types that block implicit submission in the HTML5 standard) on the // form and this input is focused (http://www.w3.org/TR/html5/forms.html#implicit-submission) function blocksImplicitSubmission(el) { let inputTypeRegExp = null; if (browserUtils.isSafari) inputTypeRegExp = /^(text|password|color|date|time|datetime|datetime-local|email|month|number|search|tel|url|week|image)$/i; else if (browserUtils.isFirefox) inputTypeRegExp = /^(text|password|date|time|datetime|datetime-local|email|month|number|search|tel|url|week|image)$/i; else inputTypeRegExp = /^(text|password|datetime|email|number|search|tel|url|image)$/i; return inputTypeRegExp.test(el.type); } exports.blocksImplicitSubmission = blocksImplicitSubmission; function isEditableElement(el, checkEditingAllowed) { return checkEditingAllowed ? (0, exports.isTextEditableElementAndEditingAllowed)(el) || (0, exports.isContentEditableElement)(el) : (0, exports.isTextEditableElement)(el) || (0, exports.isContentEditableElement)(el); } exports.isEditableElement = isEditableElement; function isElementContainsNode(parentElement, childNode) { if (isTheSameNode(childNode, parentElement)) return true; const childNodes = nativeMethods.nodeChildNodesGetter.call(parentElement); const length = getChildNodesLength(childNodes); for (let i = 0; i < length; i++) { const el = childNodes[i]; if (!(0, exports.isShadowUIElement)(el) && isElementContainsNode(el, childNode)) return true; } return false; } exports.isElementContainsNode = isElementContainsNode; function isOptionGroupElement(element) { return hammerhead_1.default.utils.dom.instanceToString(element) === '[object HTMLOptGroupElement]'; } exports.isOptionGroupElement = isOptionGroupElement; function getElementIndexInParent(parent, child) { const children = parent.querySelectorAll((0, exports.getTagName)(child)); return arrayUtils.indexOf(children, child); } exports.getElementIndexInParent = getElementIndexInParent; function isTheSameNode(node1, node2) { //NOTE: Mozilla has not isSameNode method if (node1 && node2 && node1.isSameNode) return node1.isSameNode(node2); return node1 === node2; } exports.isTheSameNode = isTheSameNode; function getElementDescription(el) { const attributes = { id: 'id', name: 'name', 'class': 'className', }; const res = []; res.push('<'); res.push((0, exports.getTagName)(el)); for (const attr in attributes) { if (attributes.hasOwnProperty(attr)) { //eslint-disable-line no-prototype-builtins const val = el[attributes[attr]]; if (val) res.push(' ' + attr + '="' + val + '"'); } } res.push('>'); return res.join(''); } exports.getElementDescription = getElementDescription; function getFocusableParent(el) { const parents = (0, exports.getParents)(el); for (let i = 0; i < parents.length; i++) { if ((0, exports.isElementFocusable)(parents[i])) return parents[i]; } return null; } exports.getFocusableParent = getFocusableParent; function remove(el) { if (el && el.parentElement) el.parentElement.removeChild(el); } exports.remove = remove; function isIFrameWindowInDOM(win) { let frameElement = null; try { //NOTE: This may raise a cross-domain policy error in some browsers. frameElement = win.frameElement; } catch (e) { return !!win.top; } // NOTE: in Firefox and WebKit, frameElement is null for cross-domain iframes even if they are in the DOM. // But these browsers don't execute scripts in removed iframes, so we suppose that the iframe is in the DOM. if ((browserUtils.isFirefox || browserUtils.isWebKit) && win.top !== win && !frameElement) return true; return !!(frameElement && nativeMethods.contentDocumentGetter.call(frameElement)); } exports.isIFrameWindowInDOM = isIFrameWindowInDOM; function isTopWindow(win) { return win.top === win; } exports.isTopWindow = isTopWindow; function findIframeByWindow(iframeWindow) { const iframes = []; (0, exports.find)(document, '*', elem => { if (elem.tagName === 'IFRAME') iframes.push(elem); if (elem.shadowRoot) (0, exports.find)(elem.shadowRoot, 'iframe', iframe => iframes.push(iframe)); }); for (let i = 0; i < iframes.length; i++) { if (nativeMethods.contentWindowGetter.call(iframes[i]) === iframeWindow) return iframes[i]; } return null; } exports.findIframeByWindow = findIframeByWindow; function isEditableFormElement(element) { return (0, exports.isTextEditableElement)(element) || (0, exports.isSelectElement)(element); } exports.isEditableFormElement = isEditableFormElement; function getCommonAncestor(element1, element2) { if (isTheSameNode(element1, element2)) return element1; const el1Parents = [element1].concat((0, exports.getParents)(element1)); let commonAncestor = element2; while (commonAncestor) { if (arrayUtils.indexOf(el1Parents, commonAncestor) > -1) return commonAncestor; commonAncestor = nativeMethods.nodeParentNodeGetter.call(commonAncestor); } return commonAncestor; } exports.getCommonAncestor = getCommonAncestor; function getChildrenLength(children) { return nativeMethods.htmlCollectionLengthGetter.call(children); } exports.getChildrenLength = getChildrenLength; function getChildNodesLength(childNodes) { return nativeMethods.nodeListLengthGetter.call(childNodes); } exports.getChildNodesLength = getChildNodesLength; function getInputValue(input) { return nativeMethods.inputValueGetter.call(input); } exports.getInputValue = getInputValue; function getTextAreaValue(textArea) { return nativeMethods.textAreaValueGetter.call(textArea); } exports.getTextAreaValue = getTextAreaValue; function setInputValue(input, value) { return nativeMethods.inputValueSetter.call(input, value); } exports.setInputValue = setInputValue; function setTextAreaValue(textArea, value) { return nativeMethods.textAreaValueSetter.call(textArea, value); } exports.setTextAreaValue = setTextAreaValue; function getElementValue(element) { if ((0, exports.isInputElement)(element)) return getInputValue(element); else if ((0, exports.isTextAreaElement)(element)) return getTextAreaValue(element); /*eslint-disable no-restricted-properties*/ return element.value; /*eslint-enable no-restricted-properties*/ } exports.getElementValue = getElementValue; function setElementValue(element, value) { if ((0, exports.isInputElement)(element)) return setInputValue(element, value); else if ((0, exports.isTextAreaElement)(element)) return setTextAreaValue(element, value); /*eslint-disable no-restricted-properties*/ element.value = value; /*eslint-enable no-restricted-properties*/ return value; } exports.setElementValue = setElementValue; function isShadowElement(element) { return element && element.getRootNode && (0, exports.findDocument)(element) !== element.getRootNode(); } exports.isShadowElement = isShadowElement; function contains(element, target) { if (!element || !target) return false; if (element.contains) return element.contains(target); return !!(0, exports.findParent)(target, true, node => node === element); } exports.contains = contains; function isNodeEqual(el1, el2) { return el1 === el2; } exports.isNodeEqual = isNodeEqual; function getNodeText(el) { return nativeMethods.nodeTextContentGetter.call(el); } exports.getNodeText = getNodeText; function getImgMapName(img) { return img.useMap.substring(1); } exports.getImgMapName = getImgMapName; function getDocumentElement(win) { return win.document.documentElement; } exports.getDocumentElement = getDocumentElement; function isDocumentElement(el) { return el === document.documentElement; } exports.isDocumentElement = isDocumentElement; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9jb3JlL3V0aWxzL2RvbS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvRUFBNEM7QUFDNUMsb0RBQXNDO0FBRXRDLE1BQU0sWUFBWSxHQUFJLG9CQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztBQUMvQyxNQUFNLGFBQWEsR0FBRyxvQkFBVSxDQUFDLGFBQWEsQ0FBQztBQUUvQywyREFBMkQ7QUFDM0QsaUVBQWlFO0FBQ2pFLE1BQU0sdUJBQXVCLEdBQUcsb0JBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztBQUU5QyxRQUFBLGdCQUFnQixHQUF5QixvQkFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7QUFDL0UsUUFBQSxZQUFZLEdBQTZCLG9CQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUM7QUFDM0UsUUFBQSxJQUFJLEdBQXFDLG9CQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDbkUsUUFBQSxtQkFBbUIsR0FBc0Isb0JBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDO0FBQ2xGLFFBQUEsaUJBQWlCLEdBQXdCLG9CQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztBQUNoRixRQUFBLGtCQUFrQixHQUF1QixvQkFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7QUFDakYsUUFBQSxvQkFBb0IsR0FBcUIsb0JBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDO0FBQ25GLFFBQUEsZUFBZSxHQUEwQixvQkFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO0FBQzlFLFFBQUEsb0JB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QUFFO0lBQ2pDLE9BQU8sRUFBRSxLQUFLLFFBQVEsQ0FBQyxlQUFlLENBQUM7QUFDM0MsQ0FBQztBQUZELDhDQUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGhhbW1lcmhlYWQgZnJvbSAnLi4vZGVwcy9oYW1tZXJoZWFkJztcbmltcG9ydCAqIGFzIGFycmF5VXRpbHMgZnJvbSAnLi9hcnJheSc7XG5cbmNvbnN0IGJyb3dzZXJVdGlscyAgPSBoYW1tZXJoZWFkLnV0aWxzLmJyb3dzZXI7XG5jb25zdCBuYXRpdmVNZXRob2RzID0gaGFtbWVyaGVhZC5uYXRpdmVNZXRob2RzO1xuXG4vLyBOT1RFOiBXZSBoYXZlIHRvIHJldHJpZXZlIHN0eWxlVXRpbHMuZ2V0IGZyb20gaGFtbWVyaGVhZFxuLy8gdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGJldHdlZW4gZG9tVXRpbHMgYW5kIHN0eWxlVXRpbHNcbmNvbnN0IGdldEVsZW1lbnRTdHlsZVByb3BlcnR5ID0gaGFtbWVyaGVhZC51dGlscy5zdHlsZS5nZXQ7XG5cbmV4cG9ydCBjb25zdCBnZXRBY3RpdmVFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmdldEFjdGl2ZUVsZW1lbnQ7XG5leHBvcnQgY29uc3QgZmluZERvY3VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5maW5kRG9jdW1lbnQ7XG5leHBvcnQgY29uc3QgZmluZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5maW5kO1xuZXhwb3J0IGNvbnN0IGlzRWxlbWVudEluRG9jdW1lbnQgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNFbGVtZW50SW5Eb2N1bWVudDtcbmV4cG9ydCBjb25zdCBpc0VsZW1lbnRJbklmcmFtZSAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzRWxlbWVudEluSWZyYW1lO1xuZXhwb3J0IGNvbnN0IGdldElmcmFtZUJ5RWxlbWVudCAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uZ2V0SWZyYW1lQnlFbGVtZW50O1xuZXhwb3J0IGNvbnN0IGlzQ3Jvc3NEb21haW5XaW5kb3dzICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNDcm9zc0RvbWFpbldpbmRvd3M7XG5leHBvcnQgY29uc3QgZ2V0U2VsZWN0UGFyZW50ICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5nZXRTZWxlY3RQYXJlbnQ7XG5leHBvcnQgY29uc3QgZ2V0Q2hpbGRWaXNpYmxlSW5kZXggICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5nZXRDaGlsZFZpc2libGVJbmRleDtcbmV4cG9ydCBjb25zdCBnZXRTZWxlY3RWaXNpYmxlQ2hpbGRyZW4gICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmdldFNlbGVjdFZpc2libGVDaGlsZHJlbjtcbmV4cG9ydCBjb25zdCBpc0VsZW1lbnROb2RlICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzRWxlbWVudE5vZGU7XG5leHBvcnQgY29uc3QgaXNUZXh0Tm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc1RleHROb2RlO1xuZXhwb3J0IGNvbnN0IGlzUmVuZGVyZWROb2RlICAgICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNSZW5kZXJlZE5vZGU7XG5leHBvcnQgY29uc3QgaXNJZnJhbWVFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc0lmcmFtZUVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNJbnB1dEVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc0lucHV0RWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc0J1dHRvbkVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzQnV0dG9uRWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc0ZpbGVJbnB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzRmlsZUlucHV0O1xuZXhwb3J0IGNvbnN0IGlzVGV4dEFyZWFFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNUZXh0QXJlYUVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNBbmNob3JFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc0FuY2hvckVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNJbWdFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc0ltZ0VsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNGb3JtRWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc0Zvcm1FbGVtZW50O1xuZXhwb3J0IGNvbnN0IGlzTGFiZWxFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNMYWJlbEVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNTZWxlY3RFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc1NlbGVjdEVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNSYWRpb0J1dHRvbkVsZW1lbnQgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc1JhZGlvQnV0dG9uRWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc0NvbG9ySW5wdXRFbGVtZW50ICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzQ29sb3JJbnB1dEVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNDaGVja2JveEVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc0NoZWNrYm94RWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc09wdGlvbkVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzT3B0aW9uRWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc1NWR0VsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzU1ZHRWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc01hcEVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzTWFwRWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc0JvZHlFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzQm9keUVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNIdG1sRWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc0h0bWxFbGVtZW50O1xuZXhwb3J0IGNvbnN0IGlzRG9jdW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNEb2N1bWVudDtcbmV4cG9ydCBjb25zdCBpc1RleHRFZGl0YWJsZUlucHV0ICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzVGV4dEVkaXRhYmxlSW5wdXQ7XG5leHBvcnQgY29uc3QgaXNUZXh0RWRpdGFibGVFbGVtZW50ICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc1RleHRFZGl0YWJsZUVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNUZXh0RWRpdGFibGVFbGVtZW50QW5kRWRpdGluZ0FsbG93ZWQgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc1RleHRFZGl0YWJsZUVsZW1lbnRBbmRFZGl0aW5nQWxsb3dlZDtcbmV4cG9ydCBjb25zdCBpc0NvbnRlbnRFZGl0YWJsZUVsZW1lbnQgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzQ29udGVudEVkaXRhYmxlRWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc0RvbUVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzRG9tRWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc1NoYWRvd1VJRWxlbWVudCAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzU2hhZG93VUlFbGVtZW50O1xuZXhwb3J0IGNvbnN0IGlzU2hhZG93Um9vdCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNTaGFkb3dSb290O1xuZXhwb3J0IGNvbnN0IGlzRWxlbWVudEZvY3VzYWJsZSAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNFbGVtZW50Rm9jdXNhYmxlO1xuZXhwb3J0IGNvbnN0IGlzSGFtbWVyaGVhZEF0dHIgICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNIYW1tZXJoZWFkQXR0cjtcbmV4cG9ydCBjb25zdCBpc0VsZW1lbnRSZWFkT25seSAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzRWxlbWVudFJlYWRPbmx5O1xuZXhwb3J0IGNvbnN0IGdldFNjcm9sbGJhclNpemUgICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uZ2V0U2Nyb2xsYmFyU2l6ZTtcbmV4cG9ydCBjb25zdCBnZXRNYXBDb250YWluZXIgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmdldE1hcENvbnRhaW5lcjtcbmV4cG9ydCBjb25zdCBnZXRUYWdOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmdldFRhZ05hbWU7XG5leHBvcnQgY29uc3QgY2xvc2VzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5jbG9zZXN0O1xuZXhwb3J0IGNvbnN0IGdldFBhcmVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uZ2V0UGFyZW50cztcbmV4cG9ydCBjb25zdCBmaW5kUGFyZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmZpbmRQYXJlbnQ7XG5leHBvcnQgY29uc3QgZ2V0VG9wU2FtZURvbWFpbldpbmRvdyAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5nZXRUb3BTYW1lRG9tYWluV2luZG93O1xuZXhwb3J0IGNvbnN0IGdldFBhcmVudEV4Y2VwdFNoYWRvd1Jvb3QgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uZ2V0UGFyZW50RXhjZXB0U2hhZG93Um9vdDtcblxuZnVuY3Rpb24gY2FuRm9jdXMgKGVsZW1lbnQsIHBhcmVudCwgdGFiSW5kZXgpIHtcbiAgICBsZXQgYWN0aXZlRWxlbWVudCA9IG51bGw7XG5cbiAgICBpZiAocGFyZW50Lm5vZGVUeXBlID09PSBOb2RlLkRPQ1VNRU5UX05PREUpXG4gICAgICAgIGFjdGl2ZUVsZW1lbnQgPSBuYXRpdmVNZXRob2RzLmRvY3VtZW50QWN0aXZlRWxlbWVudEdldHRlci5jYWxsKHBhcmVudCk7XG5cbiAgICBpZiAoZWxlbWVudCA9PT0gYWN0aXZlRWxlbWVudClcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBpZiAoZWxlbWVudC5kaXNhYmxlZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGdldEVsZW1lbnRTdHlsZVByb3BlcnR5KGVsZW1lbnQsICdkaXNwbGF5JykgPT09ICdub25lJyB8fCBnZXRFbGVtZW50U3R5bGVQcm9wZXJ0eShlbGVtZW50LCAndmlzaWJpbGl0eScpID09PSAnaGlkZGVuJylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGJyb3dzZXJVdGlscy5pc0FuZHJvaWQgJiYgaXNPcHRpb25FbGVtZW50KGVsZW1lbnQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGFiSW5kZXggIT09IG51bGwgJiYgdGFiSW5kZXggPCAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd3JhcEVsZW1lbnQgKGVsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZWw6ICAgICAgIGVsLFxuICAgICAgICBza2lwOiAgICAgZWwuc2hhZG93Um9vdCAmJiBlbC50YWJJbmRleCA8IDAsXG4gICAgICAgIGNoaWxkcmVuOiB7fS