@dotglitch/ngx-common
Version:
Angular components and utilities that are commonly used.
120 lines • 16.3 kB
JavaScript
/**
* This utils file exists outside of the strict angular DI zone
* This enables opening popups without requiring absolute DI bindings.
*/
export const getPosition = (el, config = {}, bounds) => {
// Bounds of the popup owner
const src = !!el['nodeName']
? el.getBoundingClientRect()
: {
// It's a pointer event, so we'll take the X and Y from the pointer.
x: el['clientX'],
y: el['clientY'],
// Set a default tiny size, so we don't divide by zero.
width: 0.0001,
height: 0.0001
};
// Popup bounds
const { width, height } = bounds;
const winh = window.innerHeight;
const winw = window.innerWidth;
const cords = {
top: null,
left: null
};
if (config?.position == "left" || config?.position == "right" || !config?.position) {
switch (config?.alignment) {
case "end": {
// vertically bind to bottom
cords.top = src.y + src.height - height;
break;
}
case "afterend": {
// vertically bind below bottom
cords.top = src.y + src.height;
break;
}
case "beforestart": {
// vertically bind above top
cords.top = src.y - height;
break;
}
case "start": {
// vertically bind to top
cords.top = src.y;
break;
}
case "center":
default: {
// vertically center
cords.top = (src.y + (src.height / 2)) - (height / 2);
break;
}
}
// Apply bounds to prevent the dialog from being cut-off screen
// Lower bound
cords.top = Math.max(config?.edgePadding || 0, cords.top);
// Upper bound
cords.top = Math.min(winh - height, cords.top);
if (config?.position == "left") {
cords.left = src.x - (width + (config?.arrowSize || 0) + (config?.arrowPadding || 0));
}
if (config?.position == "right" || !config?.position) {
cords.left = src.x + (src.width + (config?.arrowSize || 0) + (config?.arrowPadding || 0));
}
// Lower bound
cords.left = Math.max(config?.edgePadding || 0, cords.left);
// Upper bound
cords.left = Math.min(winw - width, cords.left);
}
else if (config?.position == "top" || config?.position == "bottom") {
switch (config?.alignment) {
case "end": {
// vertically bind to right
cords.left = src.x + src.width - width;
break;
}
case "afterend": {
// vertically bind past right
cords.left = src.x + src.width;
break;
}
case "beforestart": {
// vertically bind before left
cords.left = src.x - width;
break;
}
case "start": {
// vertically bind to left
cords.left = src.x;
break;
}
case "center":
default: {
// vertically center
cords.left = (src.x + (src.width / 2)) - (width / 2);
break;
}
}
// Apply bounds to prevent the dialog from being cut-off screen
// Lower bound
cords.left = Math.max(config?.edgePadding || 0, cords.left);
// Upper bound
cords.left = Math.min(winw - width, cords.left);
if (config?.position == "top") {
cords.top = src.y - (height + (config?.arrowSize || 0) + (config?.arrowPadding || 0));
}
if (config?.position == "bottom") {
cords.top = src.y + (src.height + (config?.arrowSize || 0) + (config?.arrowPadding || 0));
}
// Lower bound
cords.top = Math.max(config?.edgePadding || 0, cords.top);
// Upper bound
cords.top = Math.min(winh - height, cords.top);
}
// Assign unit
cords.top = cords.top + 'px';
cords.left = cords.left + 'px';
return cords;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vY29yZS9kaXJlY3RpdmVzL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEVBQThCLEVBQUUsU0FBYyxFQUFFLEVBQUUsTUFBZSxFQUFFLEVBQUU7SUFDN0YsNEJBQTRCO0lBQzVCLE1BQU0sR0FBRyxHQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUMsQ0FBRSxFQUFrQixDQUFDLHFCQUFxQixFQUFFO1FBQzdDLENBQUMsQ0FBQztZQUNFLG9FQUFvRTtZQUNwRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUNoQixDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUNoQix1REFBdUQ7WUFDdkQsS0FBSyxFQUFFLE1BQU07WUFDYixNQUFNLEVBQUUsTUFBTTtTQUNOLENBQUM7SUFFekIsZUFBZTtJQUNmLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRWpDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUUvQixNQUFNLEtBQUssR0FBRztRQUNWLEdBQUcsRUFBRSxJQUFJO1FBQ1QsSUFBSSxFQUFFLElBQUk7S0FDYixDQUFDO0lBRUYsSUFBSSxNQUFNLEVBQUUsUUFBUSxJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUUsUUFBUSxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUNqRixRQUFRLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUV4QixLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ1QsNEJBQTRCO2dCQUM1QixLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Z0JBQ3hDLE1BQU07WUFDVixDQUFDO1lBQ0QsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNkLCtCQUErQjtnQkFDL0IsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7Z0JBQy9CLE1BQU07WUFDVixDQUFDO1lBQ0QsS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUNqQiw0QkFBNEI7Z0JBQzVCLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQzNCLE1BQU07WUFDVixDQUFDO1lBQ0QsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNYLHlCQUF5QjtnQkFDekIsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixNQUFNO1lBQ1YsQ0FBQztZQUNELEtBQUssUUFBUSxDQUFDO1lBQ2QsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDTixvQkFBb0I7Z0JBQ3BCLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxNQUFNO1lBQ1YsQ0FBQztRQUNMLENBQUM7UUFFRCwrREFBK0Q7UUFDL0QsY0FBYztRQUNkLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUQsY0FBYztRQUNkLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUvQyxJQUFJLE1BQU0sRUFBRSxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7WUFDN0IsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQ0QsSUFBSSxNQUFNLEVBQUUsUUFBUSxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUNuRCxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBRUQsY0FBYztRQUNkLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQsY0FBYztRQUNkLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDO1NBQ0ksSUFBSSxNQUFNLEVBQUUsUUFBUSxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUUsUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2pFLFFBQVEsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDVCwyQkFBMkI7Z0JBQzNCLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDdkMsTUFBTTtZQUNWLENBQUM7WUFDRCxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsNkJBQTZCO2dCQUM3QixLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFDL0IsTUFBTTtZQUNWLENBQUM7WUFDRCxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLDhCQUE4QjtnQkFDOUIsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDM0IsTUFBTTtZQUNWLENBQUM7WUFDRCxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ1gsMEJBQTBCO2dCQUMxQixLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLE1BQU07WUFDVixDQUFDO1lBQ0QsS0FBSyxRQUFRLENBQUM7WUFDZCxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNOLG9CQUFvQjtnQkFDcEIsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELE1BQU07WUFDVixDQUFDO1FBQ0wsQ0FBQztRQUVELCtEQUErRDtRQUMvRCxjQUFjO1FBQ2QsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxXQUFXLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1RCxjQUFjO1FBQ2QsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBR2hELElBQUksTUFBTSxFQUFFLFFBQVEsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUM1QixLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFDRCxJQUFJLE1BQU0sRUFBRSxRQUFRLElBQUksUUFBUSxFQUFFLENBQUM7WUFDL0IsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUYsQ0FBQztRQUVELGNBQWM7UUFDZCxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFdBQVcsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFELGNBQWM7UUFDZCxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELGNBQWM7SUFDZCxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO0lBQzdCLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFFL0IsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIHV0aWxzIGZpbGUgZXhpc3RzIG91dHNpZGUgb2YgdGhlIHN0cmljdCBhbmd1bGFyIERJIHpvbmVcbiAqIFRoaXMgZW5hYmxlcyBvcGVuaW5nIHBvcHVwcyB3aXRob3V0IHJlcXVpcmluZyBhYnNvbHV0ZSBESSBiaW5kaW5ncy5cbiAqL1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zaXRpb24gPSAoZWw6IEhUTUxFbGVtZW50IHwgUG9pbnRlckV2ZW50LCBjb25maWc6IGFueSA9IHt9LCBib3VuZHM6IERPTVJlY3QpID0+IHtcbiAgICAvLyBCb3VuZHMgb2YgdGhlIHBvcHVwIG93bmVyXG4gICAgY29uc3Qgc3JjOiBET01SZWN0ID0gISFlbFsnbm9kZU5hbWUnXVxuICAgICAgICAgICAgICAgID8gKGVsIGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIGEgcG9pbnRlciBldmVudCwgc28gd2UnbGwgdGFrZSB0aGUgWCBhbmQgWSBmcm9tIHRoZSBwb2ludGVyLlxuICAgICAgICAgICAgICAgICAgICB4OiBlbFsnY2xpZW50WCddLFxuICAgICAgICAgICAgICAgICAgICB5OiBlbFsnY2xpZW50WSddLFxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYSBkZWZhdWx0IHRpbnkgc2l6ZSwgc28gd2UgZG9uJ3QgZGl2aWRlIGJ5IHplcm8uXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAwLjAwMDEsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogMC4wMDAxXG4gICAgICAgICAgICAgICAgfSBhcyBET01SZWN0O1xuXG4gICAgLy8gUG9wdXAgYm91bmRzXG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBib3VuZHM7XG5cbiAgICBjb25zdCB3aW5oID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgIGNvbnN0IHdpbncgPSB3aW5kb3cuaW5uZXJXaWR0aDtcblxuICAgIGNvbnN0IGNvcmRzID0ge1xuICAgICAgICB0b3A6IG51bGwsXG4gICAgICAgIGxlZnQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKGNvbmZpZz8ucG9zaXRpb24gPT0gXCJsZWZ0XCIgfHwgY29uZmlnPy5wb3NpdGlvbiA9PSBcInJpZ2h0XCIgfHwgIWNvbmZpZz8ucG9zaXRpb24pIHtcbiAgICAgICAgc3dpdGNoIChjb25maWc/LmFsaWdubWVudCkge1xuXG4gICAgICAgICAgICBjYXNlIFwiZW5kXCI6IHtcbiAgICAgICAgICAgICAgICAvLyB2ZXJ0aWNhbGx5IGJpbmQgdG8gYm90dG9tXG4gICAgICAgICAgICAgICAgY29yZHMudG9wID0gc3JjLnkgKyBzcmMuaGVpZ2h0IC0gaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImFmdGVyZW5kXCI6IHtcbiAgICAgICAgICAgICAgICAvLyB2ZXJ0aWNhbGx5IGJpbmQgYmVsb3cgYm90dG9tXG4gICAgICAgICAgICAgICAgY29yZHMudG9wID0gc3JjLnkgKyBzcmMuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImJlZm9yZXN0YXJ0XCI6IHtcbiAgICAgICAgICAgICAgICAvLyB2ZXJ0aWNhbGx5IGJpbmQgYWJvdmUgdG9wXG4gICAgICAgICAgICAgICAgY29yZHMudG9wID0gc3JjLnkgLSBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwic3RhcnRcIjoge1xuICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgYmluZCB0byB0b3BcbiAgICAgICAgICAgICAgICBjb3Jkcy50b3AgPSBzcmMueTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJjZW50ZXJcIjpcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAvLyB2ZXJ0aWNhbGx5IGNlbnRlclxuICAgICAgICAgICAgICAgIGNvcmRzLnRvcCA9IChzcmMueSArIChzcmMuaGVpZ2h0IC8gMikpIC0gKGhlaWdodCAvIDIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgYm91bmRzIHRvIHByZXZlbnQgdGhlIGRpYWxvZyBmcm9tIGJlaW5nIGN1dC1vZmYgc2NyZWVuXG4gICAgICAgIC8vIExvd2VyIGJvdW5kXG4gICAgICAgIGNvcmRzLnRvcCA9IE1hdGgubWF4KGNvbmZpZz8uZWRnZVBhZGRpbmcgfHwgMCwgY29yZHMudG9wKTtcbiAgICAgICAgLy8gVXBwZXIgYm91bmRcbiAgICAgICAgY29yZHMudG9wID0gTWF0aC5taW4od2luaCAtIGhlaWdodCwgY29yZHMudG9wKTtcblxuICAgICAgICBpZiAoY29uZmlnPy5wb3NpdGlvbiA9PSBcImxlZnRcIikge1xuICAgICAgICAgICAgY29yZHMubGVmdCA9IHNyYy54IC0gKHdpZHRoICsgKGNvbmZpZz8uYXJyb3dTaXplIHx8IDApICsgKGNvbmZpZz8uYXJyb3dQYWRkaW5nIHx8IDApKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnPy5wb3NpdGlvbiA9PSBcInJpZ2h0XCIgfHwgIWNvbmZpZz8ucG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNvcmRzLmxlZnQgPSBzcmMueCArIChzcmMud2lkdGggKyAoY29uZmlnPy5hcnJvd1NpemUgfHwgMCkgKyAoY29uZmlnPy5hcnJvd1BhZGRpbmcgfHwgMCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG93ZXIgYm91bmRcbiAgICAgICAgY29yZHMubGVmdCA9IE1hdGgubWF4KGNvbmZpZz8uZWRnZVBhZGRpbmcgfHwgMCwgY29yZHMubGVmdCk7XG4gICAgICAgIC8vIFVwcGVyIGJvdW5kXG4gICAgICAgIGNvcmRzLmxlZnQgPSBNYXRoLm1pbih3aW53IC0gd2lkdGgsIGNvcmRzLmxlZnQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChjb25maWc/LnBvc2l0aW9uID09IFwidG9wXCIgfHwgY29uZmlnPy5wb3NpdGlvbiA9PSBcImJvdHRvbVwiKSB7XG4gICAgICAgIHN3aXRjaCAoY29uZmlnPy5hbGlnbm1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJlbmRcIjoge1xuICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgYmluZCB0byByaWdodFxuICAgICAgICAgICAgICAgIGNvcmRzLmxlZnQgPSBzcmMueCArIHNyYy53aWR0aCAtIHdpZHRoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImFmdGVyZW5kXCI6IHtcbiAgICAgICAgICAgICAgICAvLyB2ZXJ0aWNhbGx5IGJpbmQgcGFzdCByaWdodFxuICAgICAgICAgICAgICAgIGNvcmRzLmxlZnQgPSBzcmMueCArIHNyYy53aWR0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJiZWZvcmVzdGFydFwiOiB7XG4gICAgICAgICAgICAgICAgLy8gdmVydGljYWxseSBiaW5kIGJlZm9yZSBsZWZ0XG4gICAgICAgICAgICAgICAgY29yZHMubGVmdCA9IHNyYy54IC0gd2lkdGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwic3RhcnRcIjoge1xuICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgYmluZCB0byBsZWZ0XG4gICAgICAgICAgICAgICAgY29yZHMubGVmdCA9IHNyYy54O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgY2VudGVyXG4gICAgICAgICAgICAgICAgY29yZHMubGVmdCA9IChzcmMueCArIChzcmMud2lkdGggLyAyKSkgLSAod2lkdGggLyAyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IGJvdW5kcyB0byBwcmV2ZW50IHRoZSBkaWFsb2cgZnJvbSBiZWluZyBjdXQtb2ZmIHNjcmVlblxuICAgICAgICAvLyBMb3dlciBib3VuZFxuICAgICAgICBjb3Jkcy5sZWZ0ID0gTWF0aC5tYXgoY29uZmlnPy5lZGdlUGFkZGluZyB8fCAwLCBjb3Jkcy5sZWZ0KTtcbiAgICAgICAgLy8gVXBwZXIgYm91bmRcbiAgICAgICAgY29yZHMubGVmdCA9IE1hdGgubWluKHdpbncgLSB3aWR0aCwgY29yZHMubGVmdCk7XG5cblxuICAgICAgICBpZiAoY29uZmlnPy5wb3NpdGlvbiA9PSBcInRvcFwiKSB7XG4gICAgICAgICAgICBjb3Jkcy50b3AgPSBzcmMueSAtIChoZWlnaHQgKyAoY29uZmlnPy5hcnJvd1NpemUgfHwgMCkgKyAoY29uZmlnPy5hcnJvd1BhZGRpbmcgfHwgMCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWc/LnBvc2l0aW9uID09IFwiYm90dG9tXCIpIHtcbiAgICAgICAgICAgIGNvcmRzLnRvcCA9IHNyYy55ICsgKHNyYy5oZWlnaHQgKyAoY29uZmlnPy5hcnJvd1NpemUgfHwgMCkgKyAoY29uZmlnPy5hcnJvd1BhZGRpbmcgfHwgMCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG93ZXIgYm91bmRcbiAgICAgICAgY29yZHMudG9wID0gTWF0aC5tYXgoY29uZmlnPy5lZGdlUGFkZGluZyB8fCAwLCBjb3Jkcy50b3ApO1xuICAgICAgICAvLyBVcHBlciBib3VuZFxuICAgICAgICBjb3Jkcy50b3AgPSBNYXRoLm1pbih3aW5oIC0gaGVpZ2h0LCBjb3Jkcy50b3ApO1xuICAgIH1cblxuICAgIC8vIEFzc2lnbiB1bml0XG4gICAgY29yZHMudG9wID0gY29yZHMudG9wICsgJ3B4JztcbiAgICBjb3Jkcy5sZWZ0ID0gY29yZHMubGVmdCArICdweCc7XG5cbiAgICByZXR1cm4gY29yZHM7XG59XG4iXX0=