@testplane/webdriverio
Version:
Next-gen browser and mobile automation test framework for Node.js
104 lines (103 loc) • 16.3 kB
JavaScript
// src/scripts/isElementClickable.ts
function isElementClickable(elem) {
if (!elem.getBoundingClientRect || !elem.scrollIntoView || !elem.contains || !elem.getClientRects || !document.elementFromPoint) {
return false;
}
const isOldEdge = !!window.StyleMedia;
const scrollIntoViewFullSupport = !(window.safari || isOldEdge);
function getOverlappingElement(elem2, context) {
context = context || document;
const elemDimension = elem2.getBoundingClientRect();
const x = elemDimension.left + elem2.clientWidth / 2;
const y = elemDimension.top + elem2.clientHeight / 2;
return context.elementFromPoint(x, y);
}
function getOverlappingRects(elem2, context) {
context = context || document;
const rects = elem2.getClientRects();
const rect = rects[0];
const x = rect.left + rect.width / 2;
const y = rect.top + rect.height / 2;
return [context.elementFromPoint(x, y)];
}
function getOverlappingElements(elem2, context) {
return [getOverlappingElement(elem2, context)].concat(getOverlappingRects(elem2, context));
}
function nodeContains(elem2, otherNode) {
if (isOldEdge) {
let tmpElement = otherNode;
while (tmpElement) {
if (tmpElement === elem2) {
return true;
}
tmpElement = tmpElement.parentNode;
if (tmpElement && tmpElement.nodeType === 11 && tmpElement.host) {
tmpElement = tmpElement.host;
}
}
return false;
}
return elem2.contains(otherNode);
}
function isOverlappingElementMatch(elementsFromPoint, elem2) {
if (elementsFromPoint.some(function(elementFromPoint) {
return elementFromPoint === elem2 || nodeContains(elem2, elementFromPoint);
})) {
return true;
}
let elemsWithShadowRoot = [].concat(elementsFromPoint);
elemsWithShadowRoot = elemsWithShadowRoot.filter(function(x) {
return x && x.shadowRoot && x.shadowRoot.elementFromPoint;
});
let shadowElementsFromPoint = [];
for (let i = 0; i < elemsWithShadowRoot.length; ++i) {
const shadowElement = elemsWithShadowRoot[i];
shadowElementsFromPoint = shadowElementsFromPoint.concat(
getOverlappingElements(elem2, shadowElement.shadowRoot)
);
}
shadowElementsFromPoint = [].concat(shadowElementsFromPoint);
shadowElementsFromPoint = shadowElementsFromPoint.filter(function(x) {
return !elementsFromPoint.includes(x);
});
if (shadowElementsFromPoint.length === 0) {
return false;
}
return isOverlappingElementMatch(shadowElementsFromPoint, elem2);
}
function isElementInViewport(elem2) {
if (!elem2.getBoundingClientRect) {
return false;
}
const rect = elem2.getBoundingClientRect();
const windowHeight = window.innerHeight || document.documentElement.clientHeight;
const windowWidth = window.innerWidth || document.documentElement.clientWidth;
const vertInView = rect.top <= windowHeight && rect.top + rect.height > 0;
const horInView = rect.left <= windowWidth && rect.left + rect.width > 0;
return vertInView && horInView;
}
function isEnabled(elem2) {
return elem2.disabled !== true;
}
function hasOverlaps(elem2) {
return !isOverlappingElementMatch(getOverlappingElements(elem2), elem2);
}
function isFullyDisplayedInViewport(elem2) {
return isElementInViewport(elem2) && !hasOverlaps(elem2);
}
let _isFullyDisplayedInViewport = isFullyDisplayedInViewport(elem);
if (!_isFullyDisplayedInViewport) {
const { x: originalX, y: originalY } = elem.getBoundingClientRect();
elem.scrollIntoView(scrollIntoViewFullSupport ? { block: "center", inline: "center" } : false);
_isFullyDisplayedInViewport = isFullyDisplayedInViewport(elem);
const { x, y } = elem.getBoundingClientRect();
if (x !== originalX || y !== originalY) {
elem.scroll(scrollX, scrollY);
}
}
return _isFullyDisplayedInViewport && isEnabled(elem);
}
export {
isElementClickable as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3NjcmlwdHMvaXNFbGVtZW50Q2xpY2thYmxlLnRzIl0sCiAgInNvdXJjZVJvb3QiOiAiL1VzZXJzL2R1ZGtldmljaC9qb2IvcHJvamVjdHMvZ2VtaW5pLXRlc3Rpbmcvd2ViZHJpdmVyaW8vcGFja2FnZXMvd2ViZHJpdmVyaW8iLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBjaGVjayBpZiBlbGVtZW50IGlzIHdpdGhpbiB0aGUgdmlld3BvcnQgb3IgaXMgb3ZlcmxhcHBlZCBieSBhbm90aGVyIGVsZW1lbnQgb3IgZGlzYWJsZWRcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbGVtICBlbGVtZW50IHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgICAgZmFsc2UgaWYgZWxlbWVudCBpcyBub3Qgb3ZlcmxhcHBlZFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0VsZW1lbnRDbGlja2FibGUgKGVsZW06IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCB8fCAhZWxlbS5zY3JvbGxJbnRvVmlldyB8fCAhZWxlbS5jb250YWlucyB8fCAhZWxlbS5nZXRDbGllbnRSZWN0cyB8fCAhZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBFZGdlIGJlZm9yZSBzd2l0Y2hpbmcgdG8gQ2hyb21pdW1cbiAgICBjb25zdCBpc09sZEVkZ2UgPSAhISh3aW5kb3cgYXMgdW5rbm93biBhcyB7IFN0eWxlTWVkaWE6IHVua25vd24gfSkuU3R5bGVNZWRpYVxuICAgIC8vIHJldHVybnMgdHJ1ZSBmb3IgQ2hyb21lIGFuZCBGaXJlZm94IGFuZCBmYWxzZSBmb3IgU2FmYXJpLCBFZGdlIGFuZCBJRVxuICAgIGNvbnN0IHNjcm9sbEludG9WaWV3RnVsbFN1cHBvcnQgPSAhKCh3aW5kb3cgYXMgeyBzYWZhcmk/OiBib29sZWFuIH0pLnNhZmFyaSB8fCBpc09sZEVkZ2UpXG5cbiAgICAvLyBnZXQgb3ZlcmxhcHBpbmcgZWxlbWVudFxuICAgIGZ1bmN0aW9uIGdldE92ZXJsYXBwaW5nRWxlbWVudCAoZWxlbTogSFRNTEVsZW1lbnQsIGNvbnRleHQ/OiBEb2N1bWVudCkge1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudFxuICAgICAgICBjb25zdCBlbGVtRGltZW5zaW9uID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICBjb25zdCB4ID0gZWxlbURpbWVuc2lvbi5sZWZ0ICsgKGVsZW0uY2xpZW50V2lkdGggLyAyKVxuICAgICAgICBjb25zdCB5ID0gZWxlbURpbWVuc2lvbi50b3AgKyAoZWxlbS5jbGllbnRIZWlnaHQgLyAyKVxuICAgICAgICByZXR1cm4gY29udGV4dC5lbGVtZW50RnJvbVBvaW50KHgsIHkpXG4gICAgfVxuXG4gICAgLy8gZ2V0IG92ZXJsYXBwaW5nIGVsZW1lbnQgcmVjdHMgKGN1cnJlbnRseSBvbmx5IHRoZSBmaXJzdClcbiAgICAvLyBhcHBsaWNhYmxlIGlmIGVsZW1lbnQncyB0ZXh0IGlzIG11bHRpbGluZS5cbiAgICBmdW5jdGlvbiBnZXRPdmVybGFwcGluZ1JlY3RzIChlbGVtOiBIVE1MRWxlbWVudCwgY29udGV4dD86IERvY3VtZW50KSB7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50XG5cbiAgICAgICAgY29uc3QgcmVjdHMgPSBlbGVtLmdldENsaWVudFJlY3RzKClcbiAgICAgICAgLy8gd2ViZHJpdmVyIGNsaWNrcyBvbiBjZW50ZXIgb2YgdGhlIGZpcnN0IGVsZW1lbnQncyByZWN0IChsaW5lIG9mIHRleHQpLCBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlXG4gICAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1swXVxuICAgICAgICBjb25zdCB4ID0gcmVjdC5sZWZ0ICsgKHJlY3Qud2lkdGggLyAyKVxuICAgICAgICBjb25zdCB5ID0gcmVjdC50b3AgKyAocmVjdC5oZWlnaHQgLyAyKVxuICAgICAgICByZXR1cm4gW2NvbnRleHQuZWxlbWVudEZyb21Qb2ludCh4LCB5KV1cbiAgICB9XG5cbiAgICAvLyBnZXQgb3ZlcmxhcHBpbmcgZWxlbWVudHNcbiAgICBmdW5jdGlvbiBnZXRPdmVybGFwcGluZ0VsZW1lbnRzIChlbGVtOiBIVE1MRWxlbWVudCwgY29udGV4dD86IERvY3VtZW50KSB7XG4gICAgICAgIHJldHVybiBbZ2V0T3ZlcmxhcHBpbmdFbGVtZW50KGVsZW0sIGNvbnRleHQpXS5jb25jYXQoZ2V0T3ZlcmxhcHBpbmdSZWN0cyhlbGVtLCBjb250ZXh0KSlcbiAgICB9XG5cbiAgICAvLyBpcyBhIG5vZGUgYSBkZXNjZW5kYW50IG9mIGEgZ2l2ZW4gbm9kZVxuICAgIGZ1bmN0aW9uIG5vZGVDb250YWlucyAoZWxlbTogSFRNTEVsZW1lbnQsIG90aGVyTm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgLy8gRWRnZSBkb2Vzbid0IHN1cHBvcnQgbmVpdGhlciBTaGFkb3cgRG9tIG5vciBjb250YWlucyBpZiBTaGFkb3dSb290IHBvbHlmaWxsIGlzIHVzZWRcbiAgICAgICAgaWYgKGlzT2xkRWRnZSkge1xuICAgICAgICAgICAgbGV0IHRtcEVsZW1lbnQgPSBvdGhlck5vZGUgYXMgSFRNTEVsZW1lbnQgfCBTaGFkb3dSb290IHwgRWxlbWVudFxuICAgICAgICAgICAgd2hpbGUgKHRtcEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAodG1wRWxlbWVudCA9PT0gZWxlbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRtcEVsZW1lbnQgPSB0bXBFbGVtZW50LnBhcmVudE5vZGUgYXMgU2hhZG93Um9vdFxuICAgICAgICAgICAgICAgIC8vIERvY3VtZW50RnJhZ21lbnQgLyBTaGFkb3dSb290IHBvbHlmaWxsIGxpa2UgU2hhZHlSb290XG4gICAgICAgICAgICAgICAgaWYgKHRtcEVsZW1lbnQgJiYgdG1wRWxlbWVudC5ub2RlVHlwZSA9PT0gMTEgJiYgdG1wRWxlbWVudC5ob3N0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRtcEVsZW1lbnQgPSB0bXBFbGVtZW50Lmhvc3RcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbGVtLmNvbnRhaW5zKG90aGVyTm9kZSlcbiAgICB9XG5cbiAgICAvLyBpcyBvbmUgb2Ygb3ZlcmxhcHBpbmcgZWxlbWVudHMgdGhlIGBlbGVtYCBvciBvbmUgb2YgaXRzIGNoaWxkXG4gICAgZnVuY3Rpb24gaXNPdmVybGFwcGluZ0VsZW1lbnRNYXRjaCAoZWxlbWVudHNGcm9tUG9pbnQ6IEhUTUxFbGVtZW50W10sIGVsZW06IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChlbGVtZW50c0Zyb21Qb2ludC5zb21lKGZ1bmN0aW9uIChlbGVtZW50RnJvbVBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudEZyb21Qb2ludCA9PT0gZWxlbSB8fCBub2RlQ29udGFpbnMoZWxlbSwgZWxlbWVudEZyb21Qb2ludClcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaGFkb3cgcm9vdFxuICAgICAgICAvLyBmaWx0ZXIgdW5pcXVlIGVsZW1lbnRzIHdpdGggc2hhZG93Um9vdFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGxldCBlbGVtc1dpdGhTaGFkb3dSb290ID0gW10uY29uY2F0KGVsZW1lbnRzRnJvbVBvaW50KVxuICAgICAgICBlbGVtc1dpdGhTaGFkb3dSb290ID0gZWxlbXNXaXRoU2hhZG93Um9vdC5maWx0ZXIoZnVuY3Rpb24gKHg6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4geCAmJiB4LnNoYWRvd1Jvb3QgJiYgKHguc2hhZG93Um9vdCBhcyBTaGFkb3dSb290KS5lbGVtZW50RnJvbVBvaW50XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gZ2V0T3ZlcmxhcHBpbmdFbGVtZW50cyBvZiBldmVyeSBlbGVtZW50IHdpdGggc2hhZG93Um9vdFxuICAgICAgICBsZXQgc2hhZG93RWxlbWVudHNGcm9tUG9pbnQ6IEhUTUxFbGVtZW50W10gPSBbXVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1zV2l0aFNoYWRvd1Jvb3QubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoYWRvd0VsZW1lbnQgPSBlbGVtc1dpdGhTaGFkb3dSb290W2ldXG4gICAgICAgICAgICBzaGFkb3dFbGVtZW50c0Zyb21Qb2ludCA9IHNoYWRvd0VsZW1lbnRzRnJvbVBvaW50LmNvbmNhdChcbiAgICAgICAgICAgICAgICBnZXRPdmVybGFwcGluZ0VsZW1lbnRzKGVsZW0sIChzaGFkb3dFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5zaGFkb3dSb290IGFzIHVua25vd24gYXMgRG9jdW1lbnQpIGFzIEhUTUxFbGVtZW50W11cbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgZHVwbGljYXRlcyBhbmQgcGFyZW50c1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHNoYWRvd0VsZW1lbnRzRnJvbVBvaW50ID0gW10uY29uY2F0KHNoYWRvd0VsZW1lbnRzRnJvbVBvaW50KVxuICAgICAgICBzaGFkb3dFbGVtZW50c0Zyb21Qb2ludCA9IHNoYWRvd0VsZW1lbnRzRnJvbVBvaW50LmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgcmV0dXJuICFlbGVtZW50c0Zyb21Qb2ludC5pbmNsdWRlcyh4KVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChzaGFkb3dFbGVtZW50c0Zyb21Qb2ludC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlzT3ZlcmxhcHBpbmdFbGVtZW50TWF0Y2goc2hhZG93RWxlbWVudHNGcm9tUG9pbnQsIGVsZW0pXG4gICAgfVxuXG4gICAgLy8gY29waWVkIGZyb20gYGlzRWxlbWVudEluVmlld3BvcnQuanNgXG4gICAgZnVuY3Rpb24gaXNFbGVtZW50SW5WaWV3cG9ydCAoZWxlbTogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWN0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuXG4gICAgICAgIGNvbnN0IHdpbmRvd0hlaWdodCA9ICh3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodClcbiAgICAgICAgY29uc3Qgd2luZG93V2lkdGggPSAod2luZG93LmlubmVyV2lkdGggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKVxuXG4gICAgICAgIGNvbnN0IHZlcnRJblZpZXcgPSAocmVjdC50b3AgPD0gd2luZG93SGVpZ2h0KSAmJiAoKHJlY3QudG9wICsgcmVjdC5oZWlnaHQpID4gMClcbiAgICAgICAgY29uc3QgaG9ySW5WaWV3ID0gKHJlY3QubGVmdCA8PSB3aW5kb3dXaWR0aCkgJiYgKChyZWN0LmxlZnQgKyByZWN0LndpZHRoKSA+IDApXG5cbiAgICAgICAgcmV0dXJuICh2ZXJ0SW5WaWV3ICYmIGhvckluVmlldylcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0VuYWJsZWQoZWxlbTogSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtLmRpc2FibGVkICE9PSB0cnVlXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFzT3ZlcmxhcHMoZWxlbTogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuICFpc092ZXJsYXBwaW5nRWxlbWVudE1hdGNoKGdldE92ZXJsYXBwaW5nRWxlbWVudHMoZWxlbSkgYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudFtdLCBlbGVtKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRnVsbHlEaXNwbGF5ZWRJblZpZXdwb3J0KGVsZW06IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBpc0VsZW1lbnRJblZpZXdwb3J0KGVsZW0pICYmICFoYXNPdmVybGFwcyhlbGVtKVxuICAgIH1cblxuICAgIC8vIHNjcm9sbCB0aGUgZWxlbWVudCB0byB0aGUgY2VudGVyIG9mIHRoZSB2aWV3cG9ydCB3aGVuXG4gICAgLy8gaXQgaXMgbm90IGZ1bGx5IGRpc3BsYXllZCBpbiB0aGUgdmlld3BvcnQgb3IgaXMgb3ZlcmxhcHBlZCBieSBhbm90aGVyIGVsZW1lbnRcbiAgICAvLyB0byBjaGVjayBpZiBpdCBzdGlsbCBvdmVybGFwcGVkL25vdCBpbiB0aGUgdmlld3BvcnRcbiAgICAvLyBhZnRlcndhcmRzIHdlIHNjcm9sbCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBwb3NpdGlvblxuICAgIGxldCBfaXNGdWxseURpc3BsYXllZEluVmlld3BvcnQgPSBpc0Z1bGx5RGlzcGxheWVkSW5WaWV3cG9ydChlbGVtKVxuICAgIGlmICghX2lzRnVsbHlEaXNwbGF5ZWRJblZpZXdwb3J0KSB7XG4gICAgICAgIGNvbnN0IHsgeDogb3JpZ2luYWxYLCB5OiBvcmlnaW5hbFkgfSA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcblxuICAgICAgICBlbGVtLnNjcm9sbEludG9WaWV3KHNjcm9sbEludG9WaWV3RnVsbFN1cHBvcnQgPyB7IGJsb2NrOiAnY2VudGVyJywgaW5saW5lOiAnY2VudGVyJyB9IDogZmFsc2UpXG5cbiAgICAgICAgX2lzRnVsbHlEaXNwbGF5ZWRJblZpZXdwb3J0ID0gaXNGdWxseURpc3BsYXllZEluVmlld3BvcnQoZWxlbSlcblxuICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgaWYgKHggIT09IG9yaWdpbmFsWCB8fCB5ICE9PSBvcmlnaW5hbFkpIHtcbiAgICAgICAgICAgIGVsZW0uc2Nyb2xsKHNjcm9sbFgsIHNjcm9sbFkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gX2lzRnVsbHlEaXNwbGF5ZWRJblZpZXdwb3J0ICYmIGlzRW5hYmxlZChlbGVtIGFzIEhUTUxGb3JtRWxlbWVudClcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFLZSxTQUFSLG1CQUFxQyxNQUFtQjtBQUMzRCxNQUFJLENBQUMsS0FBSyx5QkFBeUIsQ0FBQyxLQUFLLGtCQUFrQixDQUFDLEtBQUssWUFBWSxDQUFDLEtBQUssa0JBQWtCLENBQUMsU0FBUyxrQkFBa0I7QUFDN0gsV0FBTztBQUFBLEVBQ1g7QUFHQSxRQUFNLFlBQVksQ0FBQyxDQUFFLE9BQThDO0FBRW5FLFFBQU0sNEJBQTRCLEVBQUcsT0FBZ0MsVUFBVTtBQUcvRSxXQUFTLHNCQUF1QkEsT0FBbUIsU0FBb0I7QUFDbkUsY0FBVSxXQUFXO0FBQ3JCLFVBQU0sZ0JBQWdCQSxNQUFLLHNCQUFzQjtBQUNqRCxVQUFNLElBQUksY0FBYyxPQUFRQSxNQUFLLGNBQWM7QUFDbkQsVUFBTSxJQUFJLGNBQWMsTUFBT0EsTUFBSyxlQUFlO0FBQ25ELFdBQU8sUUFBUSxpQkFBaUIsR0FBRyxDQUFDO0FBQUEsRUFDeEM7QUFJQSxXQUFTLG9CQUFxQkEsT0FBbUIsU0FBb0I7QUFDakUsY0FBVSxXQUFXO0FBRXJCLFVBQU0sUUFBUUEsTUFBSyxlQUFlO0FBRWxDLFVBQU0sT0FBTyxNQUFNLENBQUM7QUFDcEIsVUFBTSxJQUFJLEtBQUssT0FBUSxLQUFLLFFBQVE7QUFDcEMsVUFBTSxJQUFJLEtBQUssTUFBTyxLQUFLLFNBQVM7QUFDcEMsV0FBTyxDQUFDLFFBQVEsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBQUEsRUFDMUM7QUFHQSxXQUFTLHVCQUF3QkEsT0FBbUIsU0FBb0I7QUFDcEUsV0FBTyxDQUFDLHNCQUFzQkEsT0FBTSxPQUFPLENBQUMsRUFBRSxPQUFPLG9CQUFvQkEsT0FBTSxPQUFPLENBQUM7QUFBQSxFQUMzRjtBQUdBLFdBQVMsYUFBY0EsT0FBbUIsV0FBd0I7QUFFOUQsUUFBSSxXQUFXO0FBQ1gsVUFBSSxhQUFhO0FBQ2pCLGFBQU8sWUFBWTtBQUNmLFlBQUksZUFBZUEsT0FBTTtBQUNyQixpQkFBTztBQUFBLFFBQ1g7QUFFQSxxQkFBYSxXQUFXO0FBRXhCLFlBQUksY0FBYyxXQUFXLGFBQWEsTUFBTSxXQUFXLE1BQU07QUFDN0QsdUJBQWEsV0FBVztBQUFBLFFBQzVCO0FBQUEsTUFDSjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBRUEsV0FBT0EsTUFBSyxTQUFTLFNBQVM7QUFBQSxFQUNsQztBQUdBLFdBQVMsMEJBQTJCLG1CQUFrQ0EsT0FBNEI7QUFDOUYsUUFBSSxrQkFBa0IsS0FBSyxTQUFVLGtCQUFrQjtBQUNuRCxhQUFPLHFCQUFxQkEsU0FBUSxhQUFhQSxPQUFNLGdCQUFnQjtBQUFBLElBQzNFLENBQUMsR0FBRztBQUNBLGFBQU87QUFBQSxJQUNYO0FBS0EsUUFBSSxzQkFBc0IsQ0FBQyxFQUFFLE9BQU8saUJBQWlCO0FBQ3JELDBCQUFzQixvQkFBb0IsT0FBTyxTQUFVLEdBQWdCO0FBQ3ZFLGFBQU8sS0FBSyxFQUFFLGNBQWUsRUFBRSxXQUEwQjtBQUFBLElBQzdELENBQUM7QUFHRCxRQUFJLDBCQUF5QyxDQUFDO0FBQzlDLGFBQVMsSUFBSSxHQUFHLElBQUksb0JBQW9CLFFBQVEsRUFBRSxHQUFHO0FBQ2pELFlBQU0sZ0JBQWdCLG9CQUFvQixDQUFDO0FBQzNDLGdDQUEwQix3QkFBd0I7QUFBQSxRQUM5Qyx1QkFBdUJBLE9BQU8sY0FBOEIsVUFBaUM7QUFBQSxNQUNqRztBQUFBLElBQ0o7QUFHQSw4QkFBMEIsQ0FBQyxFQUFFLE9BQU8sdUJBQXVCO0FBQzNELDhCQUEwQix3QkFBd0IsT0FBTyxTQUFVLEdBQUc7QUFDbEUsYUFBTyxDQUFDLGtCQUFrQixTQUFTLENBQUM7QUFBQSxJQUN4QyxDQUFDO0FBRUQsUUFBSSx3QkFBd0IsV0FBVyxHQUFHO0FBQ3RDLGFBQU87QUFBQSxJQUNYO0FBRUEsV0FBTywwQkFBMEIseUJBQXlCQSxLQUFJO0FBQUEsRUFDbEU7QUFHQSxXQUFTLG9CQUFxQkEsT0FBbUI7QUFDN0MsUUFBSSxDQUFDQSxNQUFLLHVCQUF1QjtBQUM3QixhQUFPO0FBQUEsSUFDWDtBQUVBLFVBQU0sT0FBT0EsTUFBSyxzQkFBc0I7QUFFeEMsVUFBTSxlQUFnQixPQUFPLGVBQWUsU0FBUyxnQkFBZ0I7QUFDckUsVUFBTSxjQUFlLE9BQU8sY0FBYyxTQUFTLGdCQUFnQjtBQUVuRSxVQUFNLGFBQWMsS0FBSyxPQUFPLGdCQUFtQixLQUFLLE1BQU0sS0FBSyxTQUFVO0FBQzdFLFVBQU0sWUFBYSxLQUFLLFFBQVEsZUFBa0IsS0FBSyxPQUFPLEtBQUssUUFBUztBQUU1RSxXQUFRLGNBQWM7QUFBQSxFQUMxQjtBQUVBLFdBQVMsVUFBVUEsT0FBdUI7QUFDdEMsV0FBT0EsTUFBSyxhQUFhO0FBQUEsRUFDN0I7QUFFQSxXQUFTLFlBQVlBLE9BQW1CO0FBQ3BDLFdBQU8sQ0FBQywwQkFBMEIsdUJBQXVCQSxLQUFJLEdBQStCQSxLQUFJO0FBQUEsRUFDcEc7QUFFQSxXQUFTLDJCQUEyQkEsT0FBbUI7QUFDbkQsV0FBTyxvQkFBb0JBLEtBQUksS0FBSyxDQUFDLFlBQVlBLEtBQUk7QUFBQSxFQUN6RDtBQU1BLE1BQUksOEJBQThCLDJCQUEyQixJQUFJO0FBQ2pFLE1BQUksQ0FBQyw2QkFBNkI7QUFDOUIsVUFBTSxFQUFFLEdBQUcsV0FBVyxHQUFHLFVBQVUsSUFBSSxLQUFLLHNCQUFzQjtBQUVsRSxTQUFLLGVBQWUsNEJBQTRCLEVBQUUsT0FBTyxVQUFVLFFBQVEsU0FBUyxJQUFJLEtBQUs7QUFFN0Ysa0NBQThCLDJCQUEyQixJQUFJO0FBRTdELFVBQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxLQUFLLHNCQUFzQjtBQUM1QyxRQUFJLE1BQU0sYUFBYSxNQUFNLFdBQVc7QUFDcEMsV0FBSyxPQUFPLFNBQVMsT0FBTztBQUFBLElBQ2hDO0FBQUEsRUFDSjtBQUVBLFNBQU8sK0JBQStCLFVBQVUsSUFBdUI7QUFDM0U7IiwKICAibmFtZXMiOiBbImVsZW0iXQp9Cg==