UNPKG

@dcl-sdk/utils

Version:

A collection of helpers to make it easier to build a Decentraland scene using the SDK 7.

239 lines 34.5 kB
import { Transform } from '@dcl/sdk/ecs'; import { Vector3, Quaternion } from '@dcl/sdk/math'; export function remap(value, min1, max1, min2, max2) { let range1 = max1 - min1; let range2 = max2 - min2; return ((value - min1) / range1) * range2 + min2; } export function getWorldPosition(entity) { let transform = Transform.getOrNull(entity); if (!transform) return Vector3.Zero(); let parent = transform.parent; if (!parent) { return transform.position; } else { let parentRotation = Transform.get(parent).rotation; return Vector3.add(getWorldPosition(parent), Vector3.rotate(transform.position, getWorldRotation(parent))); } } export function getWorldRotation(entity) { let transform = Transform.getOrNull(entity); if (!transform) return Quaternion.Identity(); let parent = transform.parent; if (!parent) { return transform.rotation; } else { return Quaternion.multiply(transform.rotation, getWorldRotation(parent)); } } export var InterpolationType; (function (InterpolationType) { InterpolationType["LINEAR"] = "linear"; InterpolationType["EASEINQUAD"] = "easeinquad"; InterpolationType["EASEOUTQUAD"] = "easeoutquad"; InterpolationType["EASEQUAD"] = "easequad"; InterpolationType["EASEINSINE"] = "easeinsine"; InterpolationType["EASEOUTSINE"] = "easeoutsine"; InterpolationType["EASESINE"] = "easeinoutsine"; InterpolationType["EASEINEXPO"] = "easeinexpo"; InterpolationType["EASEOUTEXPO"] = "easeoutexpo"; InterpolationType["EASEEXPO"] = "easeinoutexpo"; InterpolationType["EASEINELASTIC"] = "easeinelastic"; InterpolationType["EASEOUTELASTIC"] = "easeoutelastic"; InterpolationType["EASEELASTIC"] = "easeinoutelastic"; InterpolationType["EASEINBOUNCE"] = "easeinbounce"; InterpolationType["EASEOUTEBOUNCE"] = "easeoutbounce"; InterpolationType["EASEBOUNCE"] = "easeinoutbounce"; })(InterpolationType || (InterpolationType = {})); export function interpolate(type, t) { switch (type) { case InterpolationType.LINEAR: return InterpolateLinear(t); case InterpolationType.EASEINQUAD: return InterpolateEaseInQuad(t); case InterpolationType.EASEOUTQUAD: return InterpolateEaseOutQuad(t); case InterpolationType.EASEQUAD: return InterpolateEaseQuad(t); case InterpolationType.EASEINSINE: return InterpolateEaseInSine(t); case InterpolationType.EASEOUTSINE: return InterpolateEaseOutSine(t); case InterpolationType.EASESINE: return InterpolateEaseInOutSine(t); case InterpolationType.EASEINEXPO: return InterpolateEaseInExpo(t); case InterpolationType.EASEOUTEXPO: return InterpolateEaseOutExpo(t); case InterpolationType.EASEEXPO: return InterpolateEaseInOutExpo(t); case InterpolationType.EASEINELASTIC: return InterpolateEaseInElastic(t); case InterpolationType.EASEOUTELASTIC: return InterpolateEaseOutElastic(t); case InterpolationType.EASEELASTIC: return InterpolateEaseInOutElastic(t); case InterpolationType.EASEINBOUNCE: return InterpolateEaseInBounce(t); case InterpolationType.EASEOUTEBOUNCE: return InterpolateEaseOutBounce(t); case InterpolationType.EASEBOUNCE: return InterpolateEaseInOutBounce(t); default: return InterpolateLinear(t); } } function InterpolateLinear(t) { return t; } function InterpolateEaseInQuad(t) { return t * t; } function InterpolateEaseOutQuad(t) { return t * (2 - t); } function InterpolateEaseQuad(t) { return (t * t) / (2.0 * (t * t - t) + 1.0); } function InterpolateEaseInSine(t) { return 1 - Math.cos((t * Math.PI) / 2); } function InterpolateEaseOutSine(t) { return Math.sin((t * Math.PI) / 2); } function InterpolateEaseInOutSine(t) { return -(Math.cos(Math.PI * t) - 1) / 2; } function InterpolateEaseInExpo(t) { return t === 0 ? 0 : Math.pow(2, 10 * t - 10); } function InterpolateEaseOutExpo(t) { return t === 1 ? 1 : 1 - Math.pow(2, -10 * t); } function InterpolateEaseInOutExpo(t) { return t === 0 ? 0 : t === 1 ? 1 : t < 0.5 ? Math.pow(2, 20 * t - 10) / 2 : (2 - Math.pow(2, -20 * t + 10)) / 2; } function InterpolateEaseInElastic(t) { const c4 = (2 * Math.PI) / 3; return t === 0 ? 0 : t === 1 ? 1 : -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 10.75) * c4); } function InterpolateEaseOutElastic(t) { const c5 = (2 * Math.PI) / 3; return t === 0 ? 0 : t === 1 ? 1 : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c5) + 1; } function InterpolateEaseInOutElastic(t) { const c6 = (2 * Math.PI) / 4.5; return t === 0 ? 0 : t === 1 ? 1 : t < 0.5 ? -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * c6)) / 2 : (Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * c6)) / 2 + 1; } function InterpolateEaseInBounce(t) { return 1 - bounce(1 - t); } function InterpolateEaseOutBounce(t) { return bounce(t); } function InterpolateEaseInOutBounce(t) { return t < 0.5 ? (1 - bounce(1 - 2 * t)) / 2 : (1 + bounce(2 * t - 1)) / 2; } function bounce(x) { const n1 = 7.5625; const d1 = 2.75; if (x < 1 / d1) { return n1 * x * x; } else if (x < 2 / d1) { return n1 * (x -= 1.5 / d1) * x + 0.75; } else if (x < 2.5 / d1) { return n1 * (x -= 2.25 / d1) * x + 0.9375; } else { return n1 * (x -= 2.625 / d1) * x + 0.984375; } } export function createCatmullRomSpline(points, nbPoints, closed) { const catmullRom = new Array(); const step = 1.0 / nbPoints; let amount = 0.0; if (closed) { const pointsCount = points.length; for (let i = 0; i < pointsCount; i++) { amount = 0; for (let c = 0; c < nbPoints; c++) { catmullRom.push(Vector3.catmullRom(points[i % pointsCount], points[(i + 1) % pointsCount], points[(i + 2) % pointsCount], points[(i + 3) % pointsCount], amount)); amount += step; } } catmullRom.push(catmullRom[0]); } else { const totalPoints = new Array(); totalPoints.push(Vector3.clone(points[0])); Array.prototype.push.apply(totalPoints, points); totalPoints.push(Vector3.clone(points[points.length - 1])); let i = 0; for (; i < totalPoints.length - 3; i++) { amount = 0; for (let c = 0; c < nbPoints; c++) { catmullRom.push(Vector3.catmullRom(totalPoints[i], totalPoints[i + 1], totalPoints[i + 2], totalPoints[i + 3], amount)); amount += step; } } i--; catmullRom.push(Vector3.catmullRom(totalPoints[i], totalPoints[i + 1], totalPoints[i + 2], totalPoints[i + 3], amount)); } return catmullRom; } export function areAABBIntersecting(aMin, aMax, bMin, bMax) { return (aMin.x <= bMax.x && aMax.x >= bMin.x && aMin.y <= bMax.y && aMax.y >= bMin.y && aMin.z <= bMax.z && aMax.z >= bMin.z); } export function areSpheresIntersecting(aPos, aRadius, bPos, bRadius) { const sqDist = Vector3.distanceSquared(aPos, bPos); const radiusSum = aRadius + bRadius; return sqDist < radiusSum * radiusSum; } export function areAABBSphereIntersecting(boxMin, boxMax, spherePos, sphereRadius) { let dmin = 0; if (spherePos.x < boxMin.x) dmin += (boxMin.x - spherePos.x) * (boxMin.x - spherePos.x); if (spherePos.x > boxMax.x) dmin += (spherePos.x - boxMax.x) * (spherePos.x - boxMax.x); if (spherePos.y < boxMin.y) dmin += (boxMin.y - spherePos.y) * (boxMin.y - spherePos.y); if (spherePos.y > boxMax.y) dmin += (spherePos.y - boxMax.y) * (spherePos.y - boxMax.y); if (spherePos.z < boxMin.z) dmin += (boxMin.z - spherePos.z) * (boxMin.z - spherePos.z); if (spherePos.z > boxMax.z) dmin += (spherePos.z - boxMax.z) * (spherePos.z - boxMax.z); return dmin < sphereRadius * sphereRadius; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBVSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFhbkQsTUFBTSxVQUFVLEtBQUssQ0FDbkIsS0FBYSxFQUNiLElBQVksRUFDWixJQUFZLEVBQ1osSUFBWSxFQUNaLElBQVk7SUFFWixJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFBO0lBQ3hCLElBQUksTUFBTSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUE7SUFDeEIsT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUE7QUFDbEQsQ0FBQztBQVNELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFjO0lBQzdDLElBQUksU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7SUFHM0MsSUFBSSxDQUFDLFNBQVM7UUFBRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUVyQyxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFBO0lBRTdCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQTtJQUMzQixDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksY0FBYyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFBO1FBQ25ELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFB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QkFBeUIsQ0FBQyxNQUFlLEVBQUUsTUFBZSxFQUFFLFNBQWtCLEVBQUUsWUFBb0I7SUFDbEgsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFBO0lBRVosSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDN0QsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDN0QsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDN0QsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDN0QsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDN0QsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFN0QsT0FBTyxJQUFJLEdBQUcsWUFBWSxHQUFHLFlBQVksQ0FBQTtBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBUcmFuc2Zvcm0gfSBmcm9tICdAZGNsL3Nkay9lY3MnXG5pbXBvcnQgeyBWZWN0b3IzLCBRdWF0ZXJuaW9uIH0gZnJvbSAnQGRjbC9zZGsvbWF0aCdcblxuLyoqXG4gKiBSZW1hcHMgYSB2YWx1ZSBmcm9tIG9uZSByYW5nZSBvZiB2YWx1ZXMgdG8gaXRzIGVxdWl2YWxlbnQsIHNjYWxlZCBpbiBwcm9wb3J0aW9uIHRvIGFub3RoZXIgcmFuZ2Ugb2YgdmFsdWVzLCB1c2luZyBtYXhpbXVtIGFuZCBtaW5pbXVtLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIHZhbHVlIGlucHV0IG51bWJlclxuICogQHBhcmFtIG1pbjEgLSBtaW4xIE1pbmltdW0gdmFsdWUgaW4gdGhlIHJhbmdlIG9mIHRoZSBpbnB1dC5cbiAqIEBwYXJhbSBtYXgxIC0gbWF4MSBNYXhpbXVtIHZhbHVlIGluIHRoZSByYW5nZSBvZiB0aGUgaW5wdXQuXG4gKiBAcGFyYW0gbWluMiAtIG1pbjIgTWluaW11bSB2YWx1ZSBpbiB0aGUgcmFuZ2Ugb2YgdGhlIG91dHB1dC5cbiAqIEBwYXJhbSBtYXgyIC0gbWF4MiBNYXhpbXVtIHZhbHVlIGluIHRoZSByYW5nZSBvZiB0aGUgb3V0cHV0LlxuICogQHJldHVybnMgVGhlIHJlc3VsdGluZyByZW1hcHBlZCB2YWx1ZSBiZXR3ZWVuIHRoZSBuZXcgbWluIGFuZCBtYXhcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbWFwKFxuICB2YWx1ZTogbnVtYmVyLFxuICBtaW4xOiBudW1iZXIsXG4gIG1heDE6IG51bWJlcixcbiAgbWluMjogbnVtYmVyLFxuICBtYXgyOiBudW1iZXJcbikge1xuICBsZXQgcmFuZ2UxID0gbWF4MSAtIG1pbjFcbiAgbGV0IHJhbmdlMiA9IG1heDIgLSBtaW4yXG4gIHJldHVybiAoKHZhbHVlIC0gbWluMSkgLyByYW5nZTEpICogcmFuZ2UyICsgbWluMlxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIGFuIGVudGl0eSB0aGF0IGlzIGEgY2hpbGQgb2Ygb3RoZXIgZW50aXRpZXMsIHJlbGF0aXZlIHRvIHRoZSBzY2VuZSBpbnN0ZWFkIG9mIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQuIFJldHVybnMgYSBWZWN0b3IzLlxuICpcbiAqIEBwYXJhbSBlbnRpdHkgLSBFbnRpdHkgdG8gY2FsY3VsYXRlIHBvc2l0aW9uXG4gKiBAcmV0dXJucyBUaGUgRW50aXR5J3MgZ2xvYmFsIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBzY2VuZSdzIG9yaWdpblxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ybGRQb3NpdGlvbihlbnRpdHk6IEVudGl0eSk6IFZlY3RvcjMge1xuICBsZXQgdHJhbnNmb3JtID0gVHJhbnNmb3JtLmdldE9yTnVsbChlbnRpdHkpXG5cblxuICBpZiAoIXRyYW5zZm9ybSkgcmV0dXJuIFZlY3RvcjMuWmVybygpXG5cbiAgbGV0IHBhcmVudCA9IHRyYW5zZm9ybS5wYXJlbnRcblxuICBpZiAoIXBhcmVudCkge1xuICAgIHJldHVybiB0cmFuc2Zvcm0ucG9zaXRpb25cbiAgfSBlbHNlIHtcbiAgICBsZXQgcGFyZW50Um90YXRpb24gPSBUcmFuc2Zvcm0uZ2V0KHBhcmVudCkucm90YXRpb25cbiAgICByZXR1cm4gVmVjdG9yMy5hZGQoZ2V0V29ybGRQb3NpdGlvbihwYXJlbnQpLCBWZWN0b3IzLnJvdGF0ZSh0cmFuc2Zvcm0ucG9zaXRpb24sIGdldFdvcmxkUm90YXRpb24ocGFyZW50KSkpXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiBhbiBlbnRpdHkgdGhhdCBpcyBhIGNoaWxkIG9mIG90aGVyIGVudGl0aWVzLCByZWxhdGl2ZSB0byB0aGUgc2NlbmUgaW5zdGVhZCBvZiByZWxhdGl2ZSB0byB0aGUgcGFyZW50LiBSZXR1cm5zIGEgVmVjdG9yMy5cbiAqXG4gKiBAcGFyYW0gZW50aXR5IC0gRW50aXR5IHRvIGNhbGN1bGF0ZSBwb3NpdGlvblxuICogQHJldHVybnMgVGhlIEVudGl0eSdzIGdsb2JhbCByb3RhdGlvbiBpbiByZWZlcmVuY2UgdG8gdGhlIHNjZW5lJ3Mgb3JpZ2luXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JsZFJvdGF0aW9uKGVudGl0eTogRW50aXR5KTogUXVhdGVybmlvbiB7XG4gIGxldCB0cmFuc2Zvcm0gPSBUcmFuc2Zvcm0uZ2V0T3JOdWxsKGVudGl0eSlcblxuICBpZiAoIXRyYW5zZm9ybSlcbiAgICByZXR1cm4gUXVhdGVybmlvbi5JZGVudGl0eSgpXG5cbiAgbGV0IHBhcmVudCA9IHRyYW5zZm9ybS5wYXJlbnRcblxuICBpZiAoIXBhcmVudCkge1xuICAgIHJldHVybiB0cmFuc2Zvcm0ucm90YXRpb25cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gUXVhdGVybmlvbi5tdWx0aXBseSh0cmFuc2Zvcm0ucm90YXRpb24sIGdldFdvcmxkUm90YXRpb24ocGFyZW50KSlcbiAgfVxufVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGVudW0gSW50ZXJwb2xhdGlvblR5cGUge1xuICBMSU5FQVIgPSAnbGluZWFyJyxcblxuICBFQVNFSU5RVUFEID0gJ2Vhc2VpbnF1YWQnLFxuICBFQVNFT1VUUVVBRCA9ICdlYXNlb3V0cXVhZCcsXG4gIEVBU0VRVUFEID0gJ2Vhc2VxdWFkJyxcblxuICBFQVNFSU5TSU5FID0gJ2Vhc2VpbnNpbmUnLFxuICBFQVNFT1VUU0lORSA9ICdlYXNlb3V0c2luZScsXG4gIEVBU0VTSU5FID0gJ2Vhc2Vpbm91dHNpbmUnLFxuXG4gIEVBU0VJTkVYUE8gPSAnZWFzZWluZXhwbycsXG4gIEVBU0VPVVRFWFBPID0gJ2Vhc2VvdXRleHBvJyxcbiAgRUFTRUVYUE8gPSAnZWFzZWlub3V0ZXhwbycsXG5cbiAgRUFTRUlORUxBU1RJQyA9ICdlYXNlaW5lbGFzdGljJyxcbiAgRUFTRU9VVEVMQVNUSUMgPSAnZWFzZW91dGVsYXN0aWMnLFxuICBFQVNFRUxBU1RJQyA9ICdlYXNlaW5vdXRlbGFzdGljJyxcblxuICBFQVNFSU5CT1VOQ0UgPSAnZWFzZWluYm91bmNlJyxcbiAgRUFTRU9VVEVCT1VOQ0UgPSAnZWFzZW91dGJvdW5jZScsXG4gIEVBU0VCT1VOQ0UgPSAnZWFzZWlub3V0Ym91bmNlJyxcbn1cblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZSh0eXBlOiBJbnRlcnBvbGF0aW9uVHlwZSwgdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5MSU5FQVI6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVMaW5lYXIodClcbiAgICBjYXNlIEludGVycG9sYXRpb25UeXBlLkVBU0VJTlFVQUQ6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlSW5RdWFkKHQpXG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFT1VUUVVBRDpcbiAgICAgIHJldHVybiBJbnRlcnBvbGF0ZUVhc2VPdXRRdWFkKHQpXG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFUVVBRDpcbiAgICAgIHJldHVybiBJbnRlcnBvbGF0ZUVhc2VRdWFkKHQpXG5cdCAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFSU5TSU5FOlxuXHRcdCAgcmV0dXJuIEludGVycG9sYXRlRWFzZUluU2luZSh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRU9VVFNJTkU6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlT3V0U2luZSh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRVNJTkU6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlSW5PdXRTaW5lKHQpXG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFSU5FWFBPOlxuICAgICAgcmV0dXJuIEludGVycG9sYXRlRWFzZUluRXhwbyh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRU9VVEVYUE86XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlT3V0RXhwbyh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRUVYUE86XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlSW5PdXRFeHBvKHQpXG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFSU5FTEFTVElDOlxuICAgICAgcmV0dXJuIEludGVycG9sYXRlRWFzZUluRWxhc3RpYyh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRU9VVEVMQVNUSUM6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlT3V0RWxhc3RpYyh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRUVMQVNUSUM6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlSW5PdXRFbGFzdGljKHQpXG4gICAgY2FzZSBJbnRlcnBvbGF0aW9uVHlwZS5FQVNFSU5CT1VOQ0U6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVFYXNlSW5Cb3VuY2UodClcbiAgICBjYXNlIEludGVycG9sYXRpb25UeXBlLkVBU0VPVVRFQk9VTkNFOlxuICAgICAgcmV0dXJuIEludGVycG9sYXRlRWFzZU91dEJvdW5jZSh0KVxuICAgIGNhc2UgSW50ZXJwb2xhdGlvblR5cGUuRUFTRUJPVU5DRTpcbiAgICAgIHJldHVybiBJbnRlcnBvbGF0ZUVhc2VJbk91dEJvdW5jZSh0KVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gSW50ZXJwb2xhdGVMaW5lYXIodClcbiAgfVxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUxpbmVhcih0OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdFxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VJblF1YWQodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHQgKiB0XG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZU91dFF1YWQodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHQgKiAoMiAtIHQpXG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZVF1YWQodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuICh0ICogdCkgLyAoMi4wICogKHQgKiB0IC0gdCkgKyAxLjApXG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZUluU2luZSh0OiBudW1iZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gMSAtIE1hdGguY29zKCh0ICogTWF0aC5QSSkgLyAyKVxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VPdXRTaW5lKHQ6IG51bWJlcik6IG51bWJlciB7XG5cdHJldHVybiBNYXRoLnNpbigodCAqIE1hdGguUEkpIC8gMilcbn1cblxuZnVuY3Rpb24gSW50ZXJwb2xhdGVFYXNlSW5PdXRTaW5lKHQ6IG51bWJlcik6IG51bWJlciB7XG5cdHJldHVybiAtKE1hdGguY29zKE1hdGguUEkgKiB0KSAtIDEpIC8gMlxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VJbkV4cG8odDogbnVtYmVyKTogbnVtYmVyIHtcblx0cmV0dXJuIHQgPT09IDAgPyAwIDogTWF0aC5wb3coMiwgMTAgKiB0IC0gMTApXG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZU91dEV4cG8odDogbnVtYmVyKTogbnVtYmVyIHtcblx0cmV0dXJuIHQgPT09IDEgPyAxIDogMSAtIE1hdGgucG93KDIsIC0xMCAqIHQpXG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZUluT3V0RXhwbyh0OiBudW1iZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gdCA9PT0gMFxuXHRcdFx0PyAwXG5cdFx0XHQ6IHQgPT09IDFcblx0XHRcdD8gMVxuXHRcdFx0OiB0IDwgMC41XG5cdFx0XHQ/IE1hdGgucG93KDIsIDIwICogdCAtIDEwKSAvIDJcblx0XHRcdDogKDIgLSBNYXRoLnBvdygyLCAtMjAgKiB0ICsgMTApKSAvIDJcbn1cblxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VJbkVsYXN0aWModDogbnVtYmVyKTogbnVtYmVyIHtcblx0Y29uc3QgYzQgPSAoMiAqIE1hdGguUEkpIC8gM1xuXG5cdHJldHVybiB0ID09PSAwXG5cdFx0XHQ/IDBcblx0XHRcdDogdCA9PT0gMVxuXHRcdFx0PyAxXG5cdFx0XHQ6IC1NYXRoLnBvdygyLCAxMCAqIHQgLSAxMCkgKiBNYXRoLnNpbigodCAqIDEwIC0gMTAuNzUpICogYzQpXG59XG5cbmZ1bmN0aW9uIEludGVycG9sYXRlRWFzZU91dEVsYXN0aWModDogbnVtYmVyKTogbnVtYmVyIHtcblx0Y29uc3QgYzUgPSAoMiAqIE1hdGguUEkpIC8gM1xuXG5cdHJldHVybiB0ID09PSAwXG5cdFx0XHQ/IDBcblx0XHRcdDogdCA9PT0gMVxuXHRcdFx0PyAxXG5cdFx0XHQ6IE1hdGgucG93KDIsIC0xMCAqIHQpICogTWF0aC5zaW4oKHQgKiAxMCAtIDAuNzUpICogYzUpICsgMVxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VJbk91dEVsYXN0aWModDogbnVtYmVyKTogbnVtYmVyIHtcblx0Y29uc3QgYzYgPSAoMiAqIE1hdGguUEkpIC8gNC41XG5cblx0cmV0dXJuIHQgPT09IDBcblx0XHRcdD8gMFxuXHRcdFx0OiB0ID09PSAxXG5cdFx0XHQ/IDFcblx0XHRcdDogdCA8IDAuNVxuXHRcdFx0PyAtKE1hdGgucG93KDIsIDIwICogdCAtIDEwKSAqIE1hdGguc2luKCgyMCAqIHQgLSAxMS4xMjUpICogYzYpKSAvIDJcblx0XHRcdDogKE1hdGgucG93KDIsIC0yMCAqIHQgKyAxMCkgKiBNYXRoLnNpbigoMjAgKiB0IC0gMTEuMTI1KSAqIGM2KSkgLyAyICsgMVxufVxuXG5mdW5jdGlvbiBJbnRlcnBvbGF0ZUVhc2VJbkJvdW5jZSh0OiBudW1iZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gMSAtIGJvdW5jZSgxIC0gdClcbn1cblxuZnVuY3Rpb24gSW50ZXJwb2xhdGVFYXNlT3V0Qm91bmNlKHQ6IG51bWJlcik6IG51bWJlciB7XG5cdHJldHVybiBib3VuY2UodClcbn1cblxuZnVuY3Rpb24gSW50ZXJwb2xhdGVFYXNlSW5PdXRCb3VuY2UodDogbnVtYmVyKTogbnVtYmVyIHtcblx0cmV0dXJuIHQgPCAwLjUgPyAoMSAtIGJvdW5jZSgxIC0gMiAqIHQpKSAvIDIgOiAoMSArIGJvdW5jZSgyICogdCAtIDEpKSAvIDJcbn1cblxuZnVuY3Rpb24gYm91bmNlKHg6IG51bWJlcikge1xuXHRjb25zdCBuMSA9IDcuNTYyNVxuXHRjb25zdCBkMSA9IDIuNzVcblxuXHRpZiAoeCA8IDEgLyBkMSkge1xuXHRcdHJldHVybiBuMSAqIHggKiB4XG5cdH0gZWxzZSBpZiAoeCA8IDIgLyBkMSkge1xuXHRcdHJldHVybiBuMSAqICh4IC09IDEuNSAvIGQxKSAqIHggKyAwLjc1XG5cdH0gZWxzZSBpZiAoeCA8IDIuNSAvIGQxKSB7XG5cdFx0cmV0dXJuIG4xICogKHggLT0gMi4yNSAvIGQxKSAqIHggKyAwLjkzNzVcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gbjEgKiAoeCAtPSAyLjYyNSAvIGQxKSAqIHggKyAwLjk4NDM3NVxuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYXRtdWxsUm9tU3BsaW5lKHBvaW50czogVmVjdG9yM1tdLCBuYlBvaW50czogbnVtYmVyLCBjbG9zZWQ/OiBib29sZWFuKTogVmVjdG9yM1tdIHtcblx0Y29uc3QgY2F0bXVsbFJvbSA9IG5ldyBBcnJheTxWZWN0b3IzPigpO1xuXHRjb25zdCBzdGVwID0gMS4wIC8gbmJQb2ludHM7XG5cdGxldCBhbW91bnQgPSAwLjA7XG5cdGlmIChjbG9zZWQpIHtcblx0XHRjb25zdCBwb2ludHNDb3VudCA9IHBvaW50cy5sZW5ndGg7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHNDb3VudDsgaSsrKSB7XG5cdFx0XHRhbW91bnQgPSAwO1xuXHRcdFx0Zm9yIChsZXQgYyA9IDA7IGMgPCBuYlBvaW50czsgYysrKSB7XG5cdFx0XHRcdGNhdG11bGxSb20ucHVzaChcblx0XHRcdFx0XHRWZWN0b3IzLmNhdG11bGxSb20ocG9pbnRzW2kgJSBwb2ludHNDb3VudF0sIHBvaW50c1soaSArIDEpICUgcG9pbnRzQ291bnRdLCBwb2ludHNbKGkgKyAyKSAlIHBvaW50c0NvdW50XSwgcG9pbnRzWyhpICsgMykgJSBwb2ludHNDb3VudF0sIGFtb3VudClcblx0XHRcdFx0KTtcblx0XHRcdFx0YW1vdW50ICs9IHN0ZXA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNhdG11bGxSb20ucHVzaChjYXRtdWxsUm9tWzBdKTtcblx0fSBlbHNlIHtcblx0XHRjb25zdCB0b3RhbFBvaW50cyA9IG5ldyBBcnJheTxWZWN0b3IzPigpO1xuXHRcdHRvdGFsUG9pbnRzLnB1c2goVmVjdG9yMy5jbG9uZShwb2ludHNbMF0pKTtcblx0XHRBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0b3RhbFBvaW50cywgcG9pbnRzKTtcblx0XHR0b3RhbFBvaW50cy5wdXNoKFZlY3RvcjMuY2xvbmUocG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXSkpO1xuXHRcdGxldCBpID0gMDtcblx0XHRmb3IgKDsgaSA8IHRvdGFsUG9pbnRzLmxlbmd0aCAtIDM7IGkrKykge1xuXHRcdFx0YW1vdW50ID0gMDtcblx0XHRcdGZvciAobGV0IGMgPSAwOyBjIDwgbmJQb2ludHM7IGMrKykge1xuXHRcdFx0XHRjYXRtdWxsUm9tLnB1c2goVmVjdG9yMy5jYXRtdWxsUm9tKHRvdGFsUG9pbnRzW2ldLCB0b3RhbFBvaW50c1tpICsgMV0sIHRvdGFsUG9pbnRzW2kgKyAyXSwgdG90YWxQb2ludHNbaSArIDNdLCBhbW91bnQpKTtcblx0XHRcdFx0YW1vdW50ICs9IHN0ZXA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGktLTtcblx0XHRjYXRtdWxsUm9tLnB1c2goVmVjdG9yMy5jYXRtdWxsUm9tKHRvdGFsUG9pbnRzW2ldLCB0b3RhbFBvaW50c1tpICsgMV0sIHRvdGFsUG9pbnRzW2kgKyAyXSwgdG90YWxQb2ludHNbaSArIDNdLCBhbW91bnQpKTtcblx0fVxuXHRyZXR1cm4gY2F0bXVsbFJvbTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyZUFBQkJJbnRlcnNlY3RpbmcoYU1pbjogVmVjdG9yMywgYU1heDogVmVjdG9yMywgYk1pbjogVmVjdG9yMywgYk1heDogVmVjdG9yMyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdGFNaW4ueCA8PSBiTWF4LnggJiZcblx0XHRhTWF4LnggPj0gYk1pbi54ICYmXG5cdFx0YU1pbi55IDw9IGJNYXgueSAmJlxuXHRcdGFNYXgueSA+PSBiTWluLnkgJiZcblx0XHRhTWluLnogPD0gYk1heC56ICYmXG5cdFx0YU1heC56ID49IGJNaW4uelxuXHQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmVTcGhlcmVzSW50ZXJzZWN0aW5nKGFQb3M6IFZlY3RvcjMsIGFSYWRpdXM6IG51bWJlciwgYlBvczogVmVjdG9yMywgYlJhZGl1czogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNxRGlzdCA9IFZlY3RvcjMuZGlzdGFuY2VTcXVhcmVkKGFQb3MsIGJQb3MpXG4gIGNvbnN0IHJhZGl1c1N1bSA9IGFSYWRpdXMgKyBiUmFkaXVzXG4gIHJldHVybiBzcURpc3QgPCByYWRpdXNTdW0gKiByYWRpdXNTdW1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyZUFBQkJTcGhlcmVJbnRlcnNlY3RpbmcoYm94TWluOiBWZWN0b3IzLCBib3hNYXg6IFZlY3RvcjMsIHNwaGVyZVBvczogVmVjdG9yMywgc3BoZXJlUmFkaXVzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgbGV0IGRtaW4gPSAwXG5cbiAgaWYgKHNwaGVyZVBvcy54IDwgYm94TWluLngpXG4gICAgZG1pbiArPSAoYm94TWluLnggLSBzcGhlcmVQb3MueCkgKiAoYm94TWluLnggLSBzcGhlcmVQb3MueClcbiAgaWYgKHNwaGVyZVBvcy54ID4gYm94TWF4LngpXG4gICAgZG1pbiArPSAoc3BoZXJlUG9zLnggLSBib3hNYXgueCkgKiAoc3BoZXJlUG9zLnggLSBib3hNYXgueClcbiAgaWYgKHNwaGVyZVBvcy55IDwgYm94TWluLnkpXG4gICAgZG1pbiArPSAoYm94TWluLnkgLSBzcGhlcmVQb3MueSkgKiAoYm94TWluLnkgLSBzcGhlcmVQb3MueSlcbiAgaWYgKHNwaGVyZVBvcy55ID4gYm94TWF4LnkpXG4gICAgZG1pbiArPSAoc3BoZXJlUG9zLnkgLSBib3hNYXgueSkgKiAoc3BoZXJlUG9zLnkgLSBib3hNYXgueSlcbiAgaWYgKHNwaGVyZVBvcy56IDwgYm94TWluLnopXG4gICAgZG1pbiArPSAoYm94TWluLnogLSBzcGhlcmVQb3MueikgKiAoYm94TWluLnogLSBzcGhlcmVQb3MueilcbiAgaWYgKHNwaGVyZVBvcy56ID4gYm94TWF4LnopXG4gICAgZG1pbiArPSAoc3BoZXJlUG9zLnogLSBib3hNYXgueikgKiAoc3BoZXJlUG9zLnogLSBib3hNYXgueilcblxuICByZXR1cm4gZG1pbiA8IHNwaGVyZVJhZGl1cyAqIHNwaGVyZVJhZGl1c1xufVxuIl19