UNPKG

@clr/angular

Version:

Angular components for Clarity

179 lines 20.8 kB
/* * Copyright (c) 2016-2023 VMware, Inc. All Rights Reserved. * This software is released under MIT license. * The full license information can be found in LICENSE in the root directory of this project. */ import { ClrAlignment } from './enums/alignment.enum'; import { ClrViewportViolation } from './enums/viewport-violation.enum'; export const flipSides = position => { return { ...position, side: -1 * position.side, }; }; // This could be used in more advanced positioning algorithms. // flipAxisFlipSideAndNudgeContent(flipAxis, flipSide, nudge, nudgeForward?): ClrTransform {...} // I would like to keep it for now. export const flipAxis = position => { return { ...position, axis: position.axis === 0 ? 1 : 0, }; }; export const nudgeContent = (position, forward) => { const nextAlignment = position.content + (forward ? 0.5 : -0.5); if (nextAlignment < 0 || nextAlignment > 1) { return position; } else { return { ...position, content: nextAlignment, }; } }; export function flipSidesAndNudgeContent(flip, nudge, nudgeBack) { return (position) => nudge(flip(position), nudgeBack); } export function align(position, anchor, content) { let xDiff = anchor.left; let yDiff = anchor.top; // When ClrAxis is VERTICAL BEFORE = left, AFTER = right // When ClrAxis is HORIZONTAL BEFORE is top, AFTER is bottom switch (position.axis + position.side) { case -1: { // ClrAxis.VERTICAL + ClrSide.BEFORE xDiff += alignHorizontal(position, anchor, content); yDiff -= content.height; // pull content up to the top of the anchor break; } case 1: { // ClrAxis.VERTICAL + ClrSide.AFTER xDiff += alignHorizontal(position, anchor, content); yDiff += anchor.height; // push the content down to below the anchor break; } case 0: { // ClrAxis.HORIZONTAL + ClrSide.BEFORE xDiff -= content.width; // pull the content left of the anchor yDiff += alignVertical(position, anchor, content); break; } case 2: { // ClrAxis.HORIZONTAL + ClrSide.AFTER xDiff += anchor.width; // push the content right of of the anchor yDiff += alignVertical(position, anchor, content); break; } default: { break; } } return { xOffset: xDiff, yOffset: yDiff }; } function alignHorizontal(position, anchor, content) { let horizontalOffset = 0; // horizontal offset for the anchor position switch (position.anchor /*calculate for the anchor alignment*/) { case ClrAlignment.START: { // nothing to calculate here break; } case ClrAlignment.CENTER: { horizontalOffset += anchor.width / 2; // push content over 1/2 anchor width break; } case ClrAlignment.END: { horizontalOffset += anchor.width; // push content over width of the anchor break; } default: { break; } } // horizontal offsets for anchor alignment switch (position.content // calculate for the content alignment ) { case ClrAlignment.START: { // Nothing to calculate here break; } case ClrAlignment.CENTER: { horizontalOffset -= content.width / 2; // pull content left by a value of 1/2 content width break; } case ClrAlignment.END: { // subtract the width of currentContent from horizontalOffset to pull it back horizontalOffset -= content.width; break; } default: { break; } } return horizontalOffset; } function alignVertical(position, anchor, content) { // y axis offsets for anchor alignment let verticalOffset = 0; // Calculate y offset for anchor position switch (position.anchor) { case ClrAlignment.START: { // nothing to calculate here break; } case ClrAlignment.CENTER: { verticalOffset += anchor.height / 2; // push content down to the middle of the anchor rect break; } case ClrAlignment.END: { verticalOffset += anchor.height; // push content down to the bottom of the anchor break; } default: { break; } } // Calculate y offsets for content alignment switch (position.content) { case ClrAlignment.START: { // aligned to the top of the content rect break; } case ClrAlignment.CENTER: { verticalOffset -= content.height / 2; // pull content back up to the middle of the content rect break; } case ClrAlignment.END: { verticalOffset -= content.height; // pull content back up to the bottom of the content rect break; } default: { break; } } return verticalOffset; } export function testVisibility(offset, content) { const violations = []; const mockCoords = { bottom: offset.yOffset + content.height, left: offset.xOffset, right: offset.xOffset + content.width, top: offset.yOffset, }; if (!(mockCoords.top >= 0)) { violations.push(ClrViewportViolation.TOP); } if (!(mockCoords.left >= 0)) { violations.push(ClrViewportViolation.LEFT); } if (!(mockCoords.bottom <= (window.innerHeight || document.documentElement.clientHeight))) { violations.push(ClrViewportViolation.BOTTOM); } if (!(mockCoords.right <= (window.innerWidth || document.documentElement.clientWidth))) { violations.push(ClrViewportViolation.RIGHT); } return violations; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zaXRpb24tb3BlcmF0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvdXRpbHMvcG9wb3Zlci9wb3NpdGlvbi1vcGVyYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQVF2RSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCLFFBQVEsQ0FBQyxFQUFFO0lBQ2hELE9BQU87UUFDTCxHQUFHLFFBQVE7UUFDWCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUk7S0FDekIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLDhEQUE4RDtBQUM5RCxnR0FBZ0c7QUFDaEcsbUNBQW1DO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBaUIsUUFBUSxDQUFDLEVBQUU7SUFDL0MsT0FBTztRQUNMLEdBQUcsUUFBUTtRQUNYLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2xDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQzlELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoRSxJQUFJLGFBQWEsR0FBRyxDQUFDLElBQUksYUFBYSxHQUFHLENBQUMsRUFBRTtRQUMxQyxPQUFPLFFBQVEsQ0FBQztLQUNqQjtTQUFNO1FBQ0wsT0FBTztZQUNMLEdBQUcs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LFVBQVUsSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUU7UUFDdEYsVUFBVSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM3QztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMjMgVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENsckFsaWdubWVudCB9IGZyb20gJy4vZW51bXMvYWxpZ25tZW50LmVudW0nO1xuaW1wb3J0IHsgQ2xyVmlld3BvcnRWaW9sYXRpb24gfSBmcm9tICcuL2VudW1zL3ZpZXdwb3J0LXZpb2xhdGlvbi5lbnVtJztcbmltcG9ydCB7IENsclBvcG92ZXJDb250ZW50T2Zmc2V0IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvcG92ZXItY29udGVudC1vZmZzZXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IENsclBvcG92ZXJQb3NpdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9wb3BvdmVyLXBvc2l0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDbHJWaXNpYmlsaXR5Q29vcmRzIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3Zpc2liaWxpdHktY29vcmRzLmludGVyZmFjZSc7XG5cbi8vIFB1dCB0aGUgZm9yd2FyZCBhcmcgaGVyZSBidXQgaXQgaXMgb25seSBuZWVkZWQgd2hlbiBudWRnaW5nIGNvbnRlbnQgb3IgYW5jaG9ycy5cbmV4cG9ydCB0eXBlIENsclRyYW5zZm9ybSA9IChwb3NpdGlvbjogQ2xyUG9wb3ZlclBvc2l0aW9uLCBiYWNrPzogYm9vbGVhbikgPT4gQ2xyUG9wb3ZlclBvc2l0aW9uO1xuXG5leHBvcnQgY29uc3QgZmxpcFNpZGVzOiBDbHJUcmFuc2Zvcm0gPSBwb3NpdGlvbiA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4ucG9zaXRpb24sXG4gICAgc2lkZTogLTEgKiBwb3NpdGlvbi5zaWRlLFxuICB9O1xufTtcblxuLy8gVGhpcyBjb3VsZCBiZSB1c2VkIGluIG1vcmUgYWR2YW5jZWQgcG9zaXRpb25pbmcgYWxnb3JpdGhtcy5cbi8vIGZsaXBBeGlzRmxpcFNpZGVBbmROdWRnZUNvbnRlbnQoZmxpcEF4aXMsIGZsaXBTaWRlLCBudWRnZSwgbnVkZ2VGb3J3YXJkPyk6IENsclRyYW5zZm9ybSB7Li4ufVxuLy8gSSB3b3VsZCBsaWtlIHRvIGtlZXAgaXQgZm9yIG5vdy5cbmV4cG9ydCBjb25zdCBmbGlwQXhpczogQ2xyVHJhbnNmb3JtID0gcG9zaXRpb24gPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLnBvc2l0aW9uLFxuICAgIGF4aXM6IHBvc2l0aW9uLmF4aXMgPT09IDAgPyAxIDogMCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBudWRnZUNvbnRlbnQ6IENsclRyYW5zZm9ybSA9IChwb3NpdGlvbiwgZm9yd2FyZCkgPT4ge1xuICBjb25zdCBuZXh0QWxpZ25tZW50ID0gcG9zaXRpb24uY29udGVudCArIChmb3J3YXJkID8gMC41IDogLTAuNSk7XG4gIGlmIChuZXh0QWxpZ25tZW50IDwgMCB8fCBuZXh0QWxpZ25tZW50ID4gMSkge1xuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucG9zaXRpb24sXG4gICAgICBjb250ZW50OiBuZXh0QWxpZ25tZW50LFxuICAgIH07XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGlwU2lkZXNBbmROdWRnZUNvbnRlbnQoZmxpcDogQ2xyVHJhbnNmb3JtLCBudWRnZTogQ2xyVHJhbnNmb3JtLCBudWRnZUJhY2s/OiBib29sZWFuKTogQ2xyVHJhbnNmb3JtIHtcbiAgcmV0dXJuIChwb3NpdGlvbjogQ2xyUG9wb3ZlclBvc2l0aW9uKTogQ2xyUG9wb3ZlclBvc2l0aW9uID0+IG51ZGdlKGZsaXAocG9zaXRpb24pLCBudWRnZUJhY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxpZ24ocG9zaXRpb246IENsclBvcG92ZXJQb3NpdGlvbiwgYW5jaG9yOiBDbGllbnRSZWN0LCBjb250ZW50OiBDbGllbnRSZWN0KTogQ2xyUG9wb3ZlckNvbnRlbnRPZmZzZXQge1xuICBsZXQgeERpZmYgPSBhbmNob3IubGVmdDtcbiAgbGV0IHlEaWZmID0gYW5jaG9yLnRvcDtcblxuICAvLyBXaGVuIENsckF4aXMgaXMgVkVSVElDQUwgQkVGT1JFID0gbGVmdCwgQUZURVIgPSByaWdodFxuICAvLyBXaGVuIENsckF4aXMgaXMgSE9SSVpPTlRBTCBCRUZPUkUgaXMgdG9wLCBBRlRFUiBpcyBib3R0b21cbiAgc3dpdGNoIChwb3NpdGlvbi5heGlzICsgcG9zaXRpb24uc2lkZSkge1xuICAgIGNhc2UgLTE6IHtcbiAgICAgIC8vIENsckF4aXMuVkVSVElDQUwgKyBDbHJTaWRlLkJFRk9SRVxuICAgICAgeERpZmYgKz0gYWxpZ25Ib3Jpem9udGFsKHBvc2l0aW9uLCBhbmNob3IsIGNvbnRlbnQpO1xuICAgICAgeURpZmYgLT0gY29udGVudC5oZWlnaHQ7IC8vIHB1bGwgY29udGVudCB1cCB0byB0aGUgdG9wIG9mIHRoZSBhbmNob3JcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIDE6IHtcbiAgICAgIC8vIENsckF4aXMuVkVSVElDQUwgKyBDbHJTaWRlLkFGVEVSXG4gICAgICB4RGlmZiArPSBhbGlnbkhvcml6b250YWwocG9zaXRpb24sIGFuY2hvciwgY29udGVudCk7XG4gICAgICB5RGlmZiArPSBhbmNob3IuaGVpZ2h0OyAvLyBwdXNoIHRoZSBjb250ZW50IGRvd24gdG8gYmVsb3cgdGhlIGFuY2hvclxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgMDoge1xuICAgICAgLy8gQ2xyQXhpcy5IT1JJWk9OVEFMICsgQ2xyU2lkZS5CRUZPUkVcbiAgICAgIHhEaWZmIC09IGNvbnRlbnQud2lkdGg7IC8vIHB1bGwgdGhlIGNvbnRlbnQgbGVmdCBvZiB0aGUgYW5jaG9yXG4gICAgICB5RGlmZiArPSBhbGlnblZlcnRpY2FsKHBvc2l0aW9uLCBhbmNob3IsIGNvbnRlbnQpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgMjoge1xuICAgICAgLy8gQ2xyQXhpcy5IT1JJWk9OVEFMICsgQ2xyU2lkZS5BRlRFUlxuICAgICAgeERpZmYgKz0gYW5jaG9yLndpZHRoOyAvLyBwdXNoIHRoZSBjb250ZW50IHJpZ2h0IG9mIG9mIHRoZSBhbmNob3JcbiAgICAgIHlEaWZmICs9IGFsaWduVmVydGljYWwocG9zaXRpb24sIGFuY2hvciwgY29udGVudCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHhPZmZzZXQ6IHhEaWZmLCB5T2Zmc2V0OiB5RGlmZiB9O1xufVxuXG5mdW5jdGlvbiBhbGlnbkhvcml6b250YWwocG9zaXRpb246IENsclBvcG92ZXJQb3NpdGlvbiwgYW5jaG9yOiBDbGllbnRSZWN0LCBjb250ZW50OiBDbGllbnRSZWN0KTogbnVtYmVyIHtcbiAgbGV0IGhvcml6b250YWxPZmZzZXQgPSAwO1xuICAvLyBob3Jpem9udGFsIG9mZnNldCBmb3IgdGhlIGFuY2hvciBwb3NpdGlvblxuICBzd2l0Y2ggKHBvc2l0aW9uLmFuY2hvciAvKmNhbGN1bGF0ZSBmb3IgdGhlIGFuY2hvciBhbGlnbm1lbnQqLykge1xuICAgIGNhc2UgQ2xyQWxpZ25tZW50LlNUQVJUOiB7XG4gICAgICAvLyBub3RoaW5nIHRvIGNhbGN1bGF0ZSBoZXJlXG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBDbHJBbGlnbm1lbnQuQ0VOVEVSOiB7XG4gICAgICBob3Jpem9udGFsT2Zmc2V0ICs9IGFuY2hvci53aWR0aCAvIDI7IC8vIHB1c2ggY29udGVudCBvdmVyIDEvMiBhbmNob3Igd2lkdGhcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIENsckFsaWdubWVudC5FTkQ6IHtcbiAgICAgIGhvcml6b250YWxPZmZzZXQgKz0gYW5jaG9yLndpZHRoOyAvLyAgcHVzaCBjb250ZW50IG92ZXIgd2lkdGggb2YgdGhlIGFuY2hvclxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIGhvcml6b250YWwgb2Zmc2V0cyBmb3IgYW5jaG9yIGFsaWdubWVudFxuICBzd2l0Y2ggKFxuICAgIHBvc2l0aW9uLmNvbnRlbnQgLy8gY2FsY3VsYXRlIGZvciB0aGUgY29udGVudCBhbGlnbm1lbnRcbiAgKSB7XG4gICAgY2FzZSBDbHJBbGlnbm1lbnQuU1RBUlQ6IHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gY2FsY3VsYXRlIGhlcmVcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIENsckFsaWdubWVudC5DRU5URVI6IHtcbiAgICAgIGhvcml6b250YWxPZmZzZXQgLT0gY29udGVudC53aWR0aCAvIDI7IC8vIHB1bGwgY29udGVudCBsZWZ0IGJ5IGEgdmFsdWUgb2YgMS8yIGNvbnRlbnQgd2lkdGhcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIENsckFsaWdubWVudC5FTkQ6IHtcbiAgICAgIC8vIHN1YnRyYWN0IHRoZSB3aWR0aCBvZiBjdXJyZW50Q29udGVudCBmcm9tIGhvcml6b250YWxPZmZzZXQgdG8gcHVsbCBpdCBiYWNrXG4gICAgICBob3Jpem9udGFsT2Zmc2V0IC09IGNvbnRlbnQud2lkdGg7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhvcml6b250YWxPZmZzZXQ7XG59XG5cbmZ1bmN0aW9uIGFsaWduVmVydGljYWwocG9zaXRpb246IENsclBvcG92ZXJQb3NpdGlvbiwgYW5jaG9yOiBDbGllbnRSZWN0LCBjb250ZW50OiBDbGllbnRSZWN0KTogbnVtYmVyIHtcbiAgLy8geSBheGlzIG9mZnNldHMgZm9yIGFuY2hvciBhbGlnbm1lbnRcbiAgbGV0IHZlcnRpY2FsT2Zmc2V0ID0gMDtcblxuICAvLyBDYWxjdWxhdGUgeSBvZmZzZXQgZm9yIGFuY2hvciBwb3NpdGlvblxuICBzd2l0Y2ggKHBvc2l0aW9uLmFuY2hvcikge1xuICAgIGNhc2UgQ2xyQWxpZ25tZW50LlNUQVJUOiB7XG4gICAgICAvLyBub3RoaW5nIHRvIGNhbGN1bGF0ZSBoZXJlXG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBDbHJBbGlnbm1lbnQuQ0VOVEVSOiB7XG4gICAgICB2ZXJ0aWNhbE9mZnNldCArPSBhbmNob3IuaGVpZ2h0IC8gMjsgLy8gcHVzaCBjb250ZW50IGRvd24gdG8gdGhlIG1pZGRsZSBvZiB0aGUgYW5jaG9yIHJlY3RcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIENsckFsaWdubWVudC5FTkQ6IHtcbiAgICAgIHZlcnRpY2FsT2Zmc2V0ICs9IGFuY2hvci5oZWlnaHQ7IC8vIHB1c2ggY29udGVudCBkb3duIHRvIHRoZSBib3R0b20gb2YgdGhlIGFuY2hvclxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSB5IG9mZnNldHMgZm9yIGNvbnRlbnQgYWxpZ25tZW50XG4gIHN3aXRjaCAocG9zaXRpb24uY29udGVudCkge1xuICAgIGNhc2UgQ2xyQWxpZ25tZW50LlNUQVJUOiB7XG4gICAgICAvLyBhbGlnbmVkIHRvIHRoZSB0b3Agb2YgdGhlIGNvbnRlbnQgcmVjdFxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgQ2xyQWxpZ25tZW50LkNFTlRFUjoge1xuICAgICAgdmVydGljYWxPZmZzZXQgLT0gY29udGVudC5oZWlnaHQgLyAyOyAvLyBwdWxsIGNvbnRlbnQgYmFjayB1cCB0byB0aGUgbWlkZGxlIG9mIHRoZSBjb250ZW50IHJlY3RcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIENsckFsaWdubWVudC5FTkQ6IHtcbiAgICAgIHZlcnRpY2FsT2Zmc2V0IC09IGNvbnRlbnQuaGVpZ2h0OyAvLyBwdWxsIGNvbnRlbnQgYmFjayB1cCB0byB0aGUgYm90dG9tIG9mIHRoZSBjb250ZW50IHJlY3RcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZlcnRpY2FsT2Zmc2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVzdFZpc2liaWxpdHkob2Zmc2V0OiBDbHJQb3BvdmVyQ29udGVudE9mZnNldCwgY29udGVudDogQ2xpZW50UmVjdCk6IENsclZpZXdwb3J0VmlvbGF0aW9uW10ge1xuICBjb25zdCB2aW9sYXRpb25zOiBDbHJWaWV3cG9ydFZpb2xhdGlvbltdID0gW107XG4gIGNvbnN0IG1vY2tDb29yZHM6IENsclZpc2liaWxpdHlDb29yZHMgPSB7XG4gICAgYm90dG9tOiBvZmZzZXQueU9mZnNldCArIGNvbnRlbnQuaGVpZ2h0LFxuICAgIGxlZnQ6IG9mZnNldC54T2Zmc2V0LFxuICAgIHJpZ2h0OiBvZmZzZXQueE9mZnNldCArIGNvbnRlbnQud2lkdGgsXG4gICAgdG9wOiBvZmZzZXQueU9mZnNldCxcbiAgfTtcblxuICBpZiAoIShtb2NrQ29vcmRzLnRvcCA+PSAwKSkge1xuICAgIHZpb2xhdGlvbnMucHVzaChDbHJWaWV3cG9ydFZpb2xhdGlvbi5UT1ApO1xuICB9XG4gIGlmICghKG1vY2tDb29yZHMubGVmdCA+PSAwKSkge1xuICAgIHZpb2xhdGlvbnMucHVzaChDbHJWaWV3cG9ydFZpb2xhdGlvbi5MRUZUKTtcbiAgfVxuICBpZiAoIShtb2NrQ29vcmRzLmJvdHRvbSA8PSAod2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKSkge1xuICAgIHZpb2xhdGlvbnMucHVzaChDbHJWaWV3cG9ydFZpb2xhdGlvbi5CT1RUT00pO1xuICB9XG4gIGlmICghKG1vY2tDb29yZHMucmlnaHQgPD0gKHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpKSB7XG4gICAgdmlvbGF0aW9ucy5wdXNoKENsclZpZXdwb3J0VmlvbGF0aW9uLlJJR0hUKTtcbiAgfVxuXG4gIHJldHVybiB2aW9sYXRpb25zO1xufVxuIl19