UNPKG

three-bvh-csg

Version:

A fast, flexible, dynamic CSG implementation on top of three-mesh-bvh

1,077 lines (1,067 loc) 63.3 kB
// Auto-generated ESM bundle of cdt2d var __getOwnPropNames = Object.getOwnPropertyNames; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; // node_modules/binary-search-bounds/search-bounds.js var require_search_bounds = __commonJS({ "node_modules/binary-search-bounds/search-bounds.js"(exports, module) { "use strict"; function ge(a, y, c, l, h) { var i = h + 1; while (l <= h) { var m = l + h >>> 1, x = a[m]; var p = c !== void 0 ? c(x, y) : x - y; if (p >= 0) { i = m; h = m - 1; } else { l = m + 1; } } return i; } function gt(a, y, c, l, h) { var i = h + 1; while (l <= h) { var m = l + h >>> 1, x = a[m]; var p = c !== void 0 ? c(x, y) : x - y; if (p > 0) { i = m; h = m - 1; } else { l = m + 1; } } return i; } function lt(a, y, c, l, h) { var i = l - 1; while (l <= h) { var m = l + h >>> 1, x = a[m]; var p = c !== void 0 ? c(x, y) : x - y; if (p < 0) { i = m; l = m + 1; } else { h = m - 1; } } return i; } function le(a, y, c, l, h) { var i = l - 1; while (l <= h) { var m = l + h >>> 1, x = a[m]; var p = c !== void 0 ? c(x, y) : x - y; if (p <= 0) { i = m; l = m + 1; } else { h = m - 1; } } return i; } function eq(a, y, c, l, h) { while (l <= h) { var m = l + h >>> 1, x = a[m]; var p = c !== void 0 ? c(x, y) : x - y; if (p === 0) { return m; } if (p <= 0) { l = m + 1; } else { h = m - 1; } } return -1; } function norm(a, y, c, l, h, f) { if (typeof c === "function") { return f(a, y, c, l === void 0 ? 0 : l | 0, h === void 0 ? a.length - 1 : h | 0); } return f(a, y, void 0, c === void 0 ? 0 : c | 0, l === void 0 ? a.length - 1 : l | 0); } module.exports = { ge: function(a, y, c, l, h) { return norm(a, y, c, l, h, ge); }, gt: function(a, y, c, l, h) { return norm(a, y, c, l, h, gt); }, lt: function(a, y, c, l, h) { return norm(a, y, c, l, h, lt); }, le: function(a, y, c, l, h) { return norm(a, y, c, l, h, le); }, eq: function(a, y, c, l, h) { return norm(a, y, c, l, h, eq); } }; } }); // node_modules/two-product/two-product.js var require_two_product = __commonJS({ "node_modules/two-product/two-product.js"(exports, module) { "use strict"; module.exports = twoProduct; var SPLITTER = +(Math.pow(2, 27) + 1); function twoProduct(a, b, result) { var x = a * b; var c = SPLITTER * a; var abig = c - a; var ahi = c - abig; var alo = a - ahi; var d = SPLITTER * b; var bbig = d - b; var bhi = d - bbig; var blo = b - bhi; var err1 = x - ahi * bhi; var err2 = err1 - alo * bhi; var err3 = err2 - ahi * blo; var y = alo * blo - err3; if (result) { result[0] = y; result[1] = x; return result; } return [y, x]; } } }); // node_modules/robust-sum/robust-sum.js var require_robust_sum = __commonJS({ "node_modules/robust-sum/robust-sum.js"(exports, module) { "use strict"; module.exports = linearExpansionSum; function scalarScalar(a, b) { var x = a + b; var bv = x - a; var av = x - bv; var br = b - bv; var ar = a - av; var y = ar + br; if (y) { return [y, x]; } return [x]; } function linearExpansionSum(e, f) { var ne = e.length | 0; var nf = f.length | 0; if (ne === 1 && nf === 1) { return scalarScalar(e[0], f[0]); } var n = ne + nf; var g = new Array(n); var count = 0; var eptr = 0; var fptr = 0; var abs = Math.abs; var ei = e[eptr]; var ea = abs(ei); var fi = f[fptr]; var fa = abs(fi); var a, b; if (ea < fa) { b = ei; eptr += 1; if (eptr < ne) { ei = e[eptr]; ea = abs(ei); } } else { b = fi; fptr += 1; if (fptr < nf) { fi = f[fptr]; fa = abs(fi); } } if (eptr < ne && ea < fa || fptr >= nf) { a = ei; eptr += 1; if (eptr < ne) { ei = e[eptr]; ea = abs(ei); } } else { a = fi; fptr += 1; if (fptr < nf) { fi = f[fptr]; fa = abs(fi); } } var x = a + b; var bv = x - a; var y = b - bv; var q0 = y; var q1 = x; var _x, _bv, _av, _br, _ar; while (eptr < ne && fptr < nf) { if (ea < fa) { a = ei; eptr += 1; if (eptr < ne) { ei = e[eptr]; ea = abs(ei); } } else { a = fi; fptr += 1; if (fptr < nf) { fi = f[fptr]; fa = abs(fi); } } b = q0; x = a + b; bv = x - a; y = b - bv; if (y) { g[count++] = y; } _x = q1 + x; _bv = _x - q1; _av = _x - _bv; _br = x - _bv; _ar = q1 - _av; q0 = _ar + _br; q1 = _x; } while (eptr < ne) { a = ei; b = q0; x = a + b; bv = x - a; y = b - bv; if (y) { g[count++] = y; } _x = q1 + x; _bv = _x - q1; _av = _x - _bv; _br = x - _bv; _ar = q1 - _av; q0 = _ar + _br; q1 = _x; eptr += 1; if (eptr < ne) { ei = e[eptr]; } } while (fptr < nf) { a = fi; b = q0; x = a + b; bv = x - a; y = b - bv; if (y) { g[count++] = y; } _x = q1 + x; _bv = _x - q1; _av = _x - _bv; _br = x - _bv; _ar = q1 - _av; q0 = _ar + _br; q1 = _x; fptr += 1; if (fptr < nf) { fi = f[fptr]; } } if (q0) { g[count++] = q0; } if (q1) { g[count++] = q1; } if (!count) { g[count++] = 0; } g.length = count; return g; } } }); // node_modules/two-sum/two-sum.js var require_two_sum = __commonJS({ "node_modules/two-sum/two-sum.js"(exports, module) { "use strict"; module.exports = fastTwoSum; function fastTwoSum(a, b, result) { var x = a + b; var bv = x - a; var av = x - bv; var br = b - bv; var ar = a - av; if (result) { result[0] = ar + br; result[1] = x; return result; } return [ar + br, x]; } } }); // node_modules/robust-scale/robust-scale.js var require_robust_scale = __commonJS({ "node_modules/robust-scale/robust-scale.js"(exports, module) { "use strict"; var twoProduct = require_two_product(); var twoSum = require_two_sum(); module.exports = scaleLinearExpansion; function scaleLinearExpansion(e, scale) { var n = e.length; if (n === 1) { var ts = twoProduct(e[0], scale); if (ts[0]) { return ts; } return [ts[1]]; } var g = new Array(2 * n); var q = [0.1, 0.1]; var t = [0.1, 0.1]; var count = 0; twoProduct(e[0], scale, q); if (q[0]) { g[count++] = q[0]; } for (var i = 1; i < n; ++i) { twoProduct(e[i], scale, t); var pq = q[1]; twoSum(pq, t[0], q); if (q[0]) { g[count++] = q[0]; } var a = t[1]; var b = q[1]; var x = a + b; var bv = x - a; var y = b - bv; q[1] = x; if (y) { g[count++] = y; } } if (q[1]) { g[count++] = q[1]; } if (count === 0) { g[count++] = 0; } g.length = count; return g; } } }); // node_modules/robust-subtract/robust-diff.js var require_robust_diff = __commonJS({ "node_modules/robust-subtract/robust-diff.js"(exports, module) { "use strict"; module.exports = robustSubtract; function scalarScalar(a, b) { var x = a + b; var bv = x - a; var av = x - bv; var br = b - bv; var ar = a - av; var y = ar + br; if (y) { return [y, x]; } return [x]; } function robustSubtract(e, f) { var ne = e.length | 0; var nf = f.length | 0; if (ne === 1 && nf === 1) { return scalarScalar(e[0], -f[0]); } var n = ne + nf; var g = new Array(n); var count = 0; var eptr = 0; var fptr = 0; var abs = Math.abs; var ei = e[eptr]; var ea = abs(ei); var fi = -f[fptr]; var fa = abs(fi); var a, b; if (ea < fa) { b = ei; eptr += 1; if (eptr < ne) { ei = e[eptr]; ea = abs(ei); } } else { b = fi; fptr += 1; if (fptr < nf) { fi = -f[fptr]; fa = abs(fi); } } if (eptr < ne && ea < fa || fptr >= nf) { a = ei; eptr += 1; if (eptr < ne) { ei = e[eptr]; ea = abs(ei); } } else { a = fi; fptr += 1; if (fptr < nf) { fi = -f[fptr]; fa = abs(fi); } } var x = a + b; var bv = x - a; var y = b - bv; var q0 = y; var q1 = x; var _x, _bv, _av, _br, _ar; while (eptr < ne && fptr < nf) { if (ea < fa) { a = ei; eptr += 1; if (eptr < ne) { ei = e[eptr]; ea = abs(ei); } } else { a = fi; fptr += 1; if (fptr < nf) { fi = -f[fptr]; fa = abs(fi); } } b = q0; x = a + b; bv = x - a; y = b - bv; if (y) { g[count++] = y; } _x = q1 + x; _bv = _x - q1; _av = _x - _bv; _br = x - _bv; _ar = q1 - _av; q0 = _ar + _br; q1 = _x; } while (eptr < ne) { a = ei; b = q0; x = a + b; bv = x - a; y = b - bv; if (y) { g[count++] = y; } _x = q1 + x; _bv = _x - q1; _av = _x - _bv; _br = x - _bv; _ar = q1 - _av; q0 = _ar + _br; q1 = _x; eptr += 1; if (eptr < ne) { ei = e[eptr]; } } while (fptr < nf) { a = fi; b = q0; x = a + b; bv = x - a; y = b - bv; if (y) { g[count++] = y; } _x = q1 + x; _bv = _x - q1; _av = _x - _bv; _br = x - _bv; _ar = q1 - _av; q0 = _ar + _br; q1 = _x; fptr += 1; if (fptr < nf) { fi = -f[fptr]; } } if (q0) { g[count++] = q0; } if (q1) { g[count++] = q1; } if (!count) { g[count++] = 0; } g.length = count; return g; } } }); // node_modules/robust-orientation/orientation.js var require_orientation = __commonJS({ "node_modules/robust-orientation/orientation.js"(exports, module) { "use strict"; var twoProduct = require_two_product(); var robustSum = require_robust_sum(); var robustScale = require_robust_scale(); var robustSubtract = require_robust_diff(); var NUM_EXPAND = 5; var EPSILON = 11102230246251565e-32; var ERRBOUND3 = (3 + 16 * EPSILON) * EPSILON; var ERRBOUND4 = (7 + 56 * EPSILON) * EPSILON; function orientation_3(sum, prod, scale, sub) { return function orientation3Exact2(m0, m1, m2) { var p = sum(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0]))); var n = sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])); var d = sub(p, n); return d[d.length - 1]; }; } function orientation_4(sum, prod, scale, sub) { return function orientation4Exact2(m0, m1, m2, m3) { var p = sum(sum(scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m1[2]), sum(scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), -m2[2]), scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m3[2]))), sum(scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m3[2])))); var n = sum(sum(scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m0[2]), sum(scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), -m2[2]), scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), m3[2]))), sum(scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m2[2])))); var d = sub(p, n); return d[d.length - 1]; }; } function orientation_5(sum, prod, scale, sub) { return function orientation5Exact(m0, m1, m2, m3, m4) { var p = sum(sum(sum(scale(sum(scale(sum(prod(m3[1], m4[0]), prod(-m4[1], m3[0])), m2[2]), sum(scale(sum(prod(m2[1], m4[0]), prod(-m4[1], m2[0])), -m3[2]), scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m4[2]))), m1[3]), sum(scale(sum(scale(sum(prod(m3[1], m4[0]), prod(-m4[1], m3[0])), m1[2]), sum(scale(sum(prod(m1[1], m4[0]), prod(-m4[1], m1[0])), -m3[2]), scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), m4[2]))), -m2[3]), scale(sum(scale(sum(prod(m2[1], m4[0]), prod(-m4[1], m2[0])), m1[2]), sum(scale(sum(prod(m1[1], m4[0]), prod(-m4[1], m1[0])), -m2[2]), scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m4[2]))), m3[3]))), sum(scale(sum(scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m1[2]), sum(scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), -m2[2]), scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m3[2]))), -m4[3]), sum(scale(sum(scale(sum(prod(m3[1], m4[0]), prod(-m4[1], m3[0])), m1[2]), sum(scale(sum(prod(m1[1], m4[0]), prod(-m4[1], m1[0])), -m3[2]), scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), m4[2]))), m0[3]), scale(sum(scale(sum(prod(m3[1], m4[0]), prod(-m4[1], m3[0])), m0[2]), sum(scale(sum(prod(m0[1], m4[0]), prod(-m4[1], m0[0])), -m3[2]), scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), m4[2]))), -m1[3])))), sum(sum(scale(sum(scale(sum(prod(m1[1], m4[0]), prod(-m4[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m4[0]), prod(-m4[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m4[2]))), m3[3]), sum(scale(sum(scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m3[2]))), -m4[3]), scale(sum(scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m1[2]), sum(scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), -m2[2]), scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m3[2]))), m0[3]))), sum(scale(sum(scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m0[2]), sum(scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), -m2[2]), scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), m3[2]))), -m1[3]), sum(scale(sum(scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m3[2]))), m2[3]), scale(sum(scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m2[2]))), -m3[3]))))); var n = sum(sum(sum(scale(sum(scale(sum(prod(m3[1], m4[0]), prod(-m4[1], m3[0])), m2[2]), sum(scale(sum(prod(m2[1], m4[0]), prod(-m4[1], m2[0])), -m3[2]), scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m4[2]))), m0[3]), scale(sum(scale(sum(prod(m3[1], m4[0]), prod(-m4[1], m3[0])), m0[2]), sum(scale(sum(prod(m0[1], m4[0]), prod(-m4[1], m0[0])), -m3[2]), scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), m4[2]))), -m2[3])), sum(scale(sum(scale(sum(prod(m2[1], m4[0]), prod(-m4[1], m2[0])), m0[2]), sum(scale(sum(prod(m0[1], m4[0]), prod(-m4[1], m0[0])), -m2[2]), scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), m4[2]))), m3[3]), scale(sum(scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m0[2]), sum(scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), -m2[2]), scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), m3[2]))), -m4[3]))), sum(sum(scale(sum(scale(sum(prod(m2[1], m4[0]), prod(-m4[1], m2[0])), m1[2]), sum(scale(sum(prod(m1[1], m4[0]), prod(-m4[1], m1[0])), -m2[2]), scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m4[2]))), m0[3]), scale(sum(scale(sum(prod(m2[1], m4[0]), prod(-m4[1], m2[0])), m0[2]), sum(scale(sum(prod(m0[1], m4[0]), prod(-m4[1], m0[0])), -m2[2]), scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), m4[2]))), -m1[3])), sum(scale(sum(scale(sum(prod(m1[1], m4[0]), prod(-m4[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m4[0]), prod(-m4[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m4[2]))), m2[3]), scale(sum(scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m2[2]))), -m4[3])))); var d = sub(p, n); return d[d.length - 1]; }; } function orientation(n) { var fn = n === 3 ? orientation_3 : n === 4 ? orientation_4 : orientation_5; return fn(robustSum, twoProduct, robustScale, robustSubtract); } var orientation3Exact = orientation(3); var orientation4Exact = orientation(4); var CACHED = [ function orientation0() { return 0; }, function orientation1() { return 0; }, function orientation2(a, b) { return b[0] - a[0]; }, function orientation3(a, b, c) { var l = (a[1] - c[1]) * (b[0] - c[0]); var r = (a[0] - c[0]) * (b[1] - c[1]); var det = l - r; var s; if (l > 0) { if (r <= 0) { return det; } else { s = l + r; } } else if (l < 0) { if (r >= 0) { return det; } else { s = -(l + r); } } else { return det; } var tol = ERRBOUND3 * s; if (det >= tol || det <= -tol) { return det; } return orientation3Exact(a, b, c); }, function orientation4(a, b, c, d) { var adx = a[0] - d[0]; var bdx = b[0] - d[0]; var cdx = c[0] - d[0]; var ady = a[1] - d[1]; var bdy = b[1] - d[1]; var cdy = c[1] - d[1]; var adz = a[2] - d[2]; var bdz = b[2] - d[2]; var cdz = c[2] - d[2]; var bdxcdy = bdx * cdy; var cdxbdy = cdx * bdy; var cdxady = cdx * ady; var adxcdy = adx * cdy; var adxbdy = adx * bdy; var bdxady = bdx * ady; var det = adz * (bdxcdy - cdxbdy) + bdz * (cdxady - adxcdy) + cdz * (adxbdy - bdxady); var permanent = (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * Math.abs(adz) + (Math.abs(cdxady) + Math.abs(adxcdy)) * Math.abs(bdz) + (Math.abs(adxbdy) + Math.abs(bdxady)) * Math.abs(cdz); var tol = ERRBOUND4 * permanent; if (det > tol || -det > tol) { return det; } return orientation4Exact(a, b, c, d); } ]; function slowOrient(args) { var proc2 = CACHED[args.length]; if (!proc2) { proc2 = CACHED[args.length] = orientation(args.length); } return proc2.apply(void 0, args); } function proc(slow, o0, o1, o2, o3, o4, o5) { return function getOrientation(a0, a1, a2, a3, a4) { switch (arguments.length) { case 0: case 1: return 0; case 2: return o2(a0, a1); case 3: return o3(a0, a1, a2); case 4: return o4(a0, a1, a2, a3); case 5: return o5(a0, a1, a2, a3, a4); } var s = new Array(arguments.length); for (var i = 0; i < arguments.length; ++i) { s[i] = arguments[i]; } return slow(s); }; } function generateOrientationProc() { while (CACHED.length <= NUM_EXPAND) { CACHED.push(orientation(CACHED.length)); } module.exports = proc.apply(void 0, [slowOrient].concat(CACHED)); for (var i = 0; i <= NUM_EXPAND; ++i) { module.exports[i] = CACHED[i]; } } generateOrientationProc(); } }); // node_modules/cdt2d/lib/monotone.js var require_monotone = __commonJS({ "node_modules/cdt2d/lib/monotone.js"(exports, module) { "use strict"; var bsearch = require_search_bounds(); var orient = require_orientation()[3]; var EVENT_POINT = 0; var EVENT_END = 1; var EVENT_START = 2; module.exports = monotoneTriangulate; function PartialHull(a, b, idx, lowerIds, upperIds) { this.a = a; this.b = b; this.idx = idx; this.lowerIds = lowerIds; this.upperIds = upperIds; } function Event(a, b, type, idx) { this.a = a; this.b = b; this.type = type; this.idx = idx; } function compareEvent(a, b) { var d = a.a[0] - b.a[0] || a.a[1] - b.a[1] || a.type - b.type; if (d) { return d; } if (a.type !== EVENT_POINT) { d = orient(a.a, a.b, b.b); if (d) { return d; } } return a.idx - b.idx; } function testPoint(hull, p) { return orient(hull.a, hull.b, p); } function addPoint(cells, hulls, points, p, idx) { var lo = bsearch.lt(hulls, p, testPoint); var hi = bsearch.gt(hulls, p, testPoint); for (var i = lo; i < hi; ++i) { var hull = hulls[i]; var lowerIds = hull.lowerIds; var m = lowerIds.length; while (m > 1 && orient( points[lowerIds[m - 2]], points[lowerIds[m - 1]], p ) > 0) { cells.push( [ lowerIds[m - 1], lowerIds[m - 2], idx ] ); m -= 1; } lowerIds.length = m; lowerIds.push(idx); var upperIds = hull.upperIds; var m = upperIds.length; while (m > 1 && orient( points[upperIds[m - 2]], points[upperIds[m - 1]], p ) < 0) { cells.push( [ upperIds[m - 2], upperIds[m - 1], idx ] ); m -= 1; } upperIds.length = m; upperIds.push(idx); } } function findSplit(hull, edge) { var d; if (hull.a[0] < edge.a[0]) { d = orient(hull.a, hull.b, edge.a); } else { d = orient(edge.b, edge.a, hull.a); } if (d) { return d; } if (edge.b[0] < hull.b[0]) { d = orient(hull.a, hull.b, edge.b); } else { d = orient(edge.b, edge.a, hull.b); } return d || hull.idx - edge.idx; } function splitHulls(hulls, points, event) { var splitIdx = bsearch.le(hulls, event, findSplit); var hull = hulls[splitIdx]; var upperIds = hull.upperIds; var x = upperIds[upperIds.length - 1]; hull.upperIds = [x]; hulls.splice( splitIdx + 1, 0, new PartialHull(event.a, event.b, event.idx, [x], upperIds) ); } function mergeHulls(hulls, points, event) { var tmp = event.a; event.a = event.b; event.b = tmp; var mergeIdx = bsearch.eq(hulls, event, findSplit); var upper = hulls[mergeIdx]; var lower = hulls[mergeIdx - 1]; lower.upperIds = upper.upperIds; hulls.splice(mergeIdx, 1); } function monotoneTriangulate(points, edges) { var numPoints = points.length; var numEdges = edges.length; var events = []; for (var i = 0; i < numPoints; ++i) { events.push(new Event( points[i], null, EVENT_POINT, i )); } for (var i = 0; i < numEdges; ++i) { var e = edges[i]; var a = points[e[0]]; var b = points[e[1]]; if (a[0] < b[0]) { events.push( new Event(a, b, EVENT_START, i), new Event(b, a, EVENT_END, i) ); } else if (a[0] > b[0]) { events.push( new Event(b, a, EVENT_START, i), new Event(a, b, EVENT_END, i) ); } } events.sort(compareEvent); var minX = events[0].a[0] - (1 + Math.abs(events[0].a[0])) * Math.pow(2, -52); var hull = [new PartialHull([minX, 1], [minX, 0], -1, [], [], [], [])]; var cells = []; for (var i = 0, numEvents = events.length; i < numEvents; ++i) { var event = events[i]; var type = event.type; if (type === EVENT_POINT) { addPoint(cells, hull, points, event.a, event.idx); } else if (type === EVENT_START) { splitHulls(hull, points, event); } else { mergeHulls(hull, points, event); } } return cells; } } }); // node_modules/cdt2d/lib/triangulation.js var require_triangulation = __commonJS({ "node_modules/cdt2d/lib/triangulation.js"(exports, module) { "use strict"; var bsearch = require_search_bounds(); module.exports = createTriangulation; function Triangulation(stars, edges) { this.stars = stars; this.edges = edges; } var proto = Triangulation.prototype; function removePair(list, j, k) { for (var i = 1, n = list.length; i < n; i += 2) { if (list[i - 1] === j && list[i] === k) { list[i - 1] = list[n - 2]; list[i] = list[n - 1]; list.length = n - 2; return; } } } proto.isConstraint = /* @__PURE__ */ (function() { var e = [0, 0]; function compareLex(a, b) { return a[0] - b[0] || a[1] - b[1]; } return function(i, j) { e[0] = Math.min(i, j); e[1] = Math.max(i, j); return bsearch.eq(this.edges, e, compareLex) >= 0; }; })(); proto.removeTriangle = function(i, j, k) { var stars = this.stars; removePair(stars[i], j, k); removePair(stars[j], k, i); removePair(stars[k], i, j); }; proto.addTriangle = function(i, j, k) { var stars = this.stars; stars[i].push(j, k); stars[j].push(k, i); stars[k].push(i, j); }; proto.opposite = function(j, i) { var list = this.stars[i]; for (var k = 1, n = list.length; k < n; k += 2) { if (list[k] === j) { return list[k - 1]; } } return -1; }; proto.flip = function(i, j) { var a = this.opposite(i, j); var b = this.opposite(j, i); this.removeTriangle(i, j, a); this.removeTriangle(j, i, b); this.addTriangle(i, b, a); this.addTriangle(j, a, b); }; proto.edges = function() { var stars = this.stars; var result = []; for (var i = 0, n = stars.length; i < n; ++i) { var list = stars[i]; for (var j = 0, m = list.length; j < m; j += 2) { result.push([list[j], list[j + 1]]); } } return result; }; proto.cells = function() { var stars = this.stars; var result = []; for (var i = 0, n = stars.length; i < n; ++i) { var list = stars[i]; for (var j = 0, m = list.length; j < m; j += 2) { var s = list[j]; var t = list[j + 1]; if (i < Math.min(s, t)) { result.push([i, s, t]); } } } return result; }; function createTriangulation(numVerts, edges) { var stars = new Array(numVerts); for (var i = 0; i < numVerts; ++i) { stars[i] = []; } return new Triangulation(stars, edges); } } }); // node_modules/robust-in-sphere/in-sphere.js var require_in_sphere = __commonJS({ "node_modules/robust-in-sphere/in-sphere.js"(exports, module) { "use strict"; var twoProduct = require_two_product(); var robustSum = require_robust_sum(); var robustDiff = require_robust_diff(); var robustScale = require_robust_scale(); var NUM_EXPAND = 6; function orientation(n) { var fn = n === 3 ? inSphere3 : n === 4 ? inSphere4 : n === 5 ? inSphere5 : inSphere6; return fn(robustSum, robustDiff, twoProduct, robustScale); } function inSphere0() { return 0; } function inSphere1() { return 0; } function inSphere2() { return 0; } function inSphere3(sum, diff, prod, scale) { function exactInSphere3(m0, m1, m2) { var w0 = prod(m0[0], m0[0]); var w0m1 = scale(w0, m1[0]); var w0m2 = scale(w0, m2[0]); var w1 = prod(m1[0], m1[0]); var w1m0 = scale(w1, m0[0]); var w1m2 = scale(w1, m2[0]); var w2 = prod(m2[0], m2[0]); var w2m0 = scale(w2, m0[0]); var w2m1 = scale(w2, m1[0]); var p = sum(diff(w2m1, w1m2), diff(w1m0, w0m1)); var n = diff(w2m0, w0m2); var d = diff(p, n); return d[d.length - 1]; } return exactInSphere3; } function inSphere4(sum, diff, prod, scale) { function exactInSphere4(m0, m1, m2, m3) { var w0 = sum(prod(m0[0], m0[0]), prod(m0[1], m0[1])); var w0m1 = scale(w0, m1[0]); var w0m2 = scale(w0, m2[0]); var w0m3 = scale(w0, m3[0]); var w1 = sum(prod(m1[0], m1[0]), prod(m1[1], m1[1])); var w1m0 = scale(w1, m0[0]); var w1m2 = scale(w1, m2[0]); var w1m3 = scale(w1, m3[0]); var w2 = sum(prod(m2[0], m2[0]), prod(m2[1], m2[1])); var w2m0 = scale(w2, m0[0]); var w2m1 = scale(w2, m1[0]); var w2m3 = scale(w2, m3[0]); var w3 = sum(prod(m3[0], m3[0]), prod(m3[1], m3[1])); var w3m0 = scale(w3, m0[0]); var w3m1 = scale(w3, m1[0]); var w3m2 = scale(w3, m2[0]); var p = sum(sum(scale(diff(w3m2, w2m3), m1[1]), sum(scale(diff(w3m1, w1m3), -m2[1]), scale(diff(w2m1, w1m2), m3[1]))), sum(scale(diff(w3m1, w1m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m1[1]), scale(diff(w1m0, w0m1), m3[1])))); var n = sum(sum(scale(diff(w3m2, w2m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m2[1]), scale(diff(w2m0, w0m2), m3[1]))), sum(scale(diff(w2m1, w1m2), m0[1]), sum(scale(diff(w2m0, w0m2), -m1[1]), scale(diff(w1m0, w0m1), m2[1])))); var d = diff(p, n); return d[d.length - 1]; } return exactInSphere4; } function inSphere5(sum, diff, prod, scale) { function exactInSphere5(m0, m1, m2, m3, m4) { var w0 = sum(prod(m0[0], m0[0]), sum(prod(m0[1], m0[1]), prod(m0[2], m0[2]))); var w0m1 = scale(w0, m1[0]); var w0m2 = scale(w0, m2[0]); var w0m3 = scale(w0, m3[0]); var w0m4 = scale(w0, m4[0]); var w1 = sum(prod(m1[0], m1[0]), sum(prod(m1[1], m1[1]), prod(m1[2], m1[2]))); var w1m0 = scale(w1, m0[0]); var w1m2 = scale(w1, m2[0]); var w1m3 = scale(w1, m3[0]); var w1m4 = scale(w1, m4[0]); var w2 = sum(prod(m2[0], m2[0]), sum(prod(m2[1], m2[1]), prod(m2[2], m2[2]))); var w2m0 = scale(w2, m0[0]); var w2m1 = scale(w2, m1[0]); var w2m3 = scale(w2, m3[0]); var w2m4 = scale(w2, m4[0]); var w3 = sum(prod(m3[0], m3[0]), sum(prod(m3[1], m3[1]), prod(m3[2], m3[2]))); var w3m0 = scale(w3, m0[0]); var w3m1 = scale(w3, m1[0]); var w3m2 = scale(w3, m2[0]); var w3m4 = scale(w3, m4[0]); var w4 = sum(prod(m4[0], m4[0]), sum(prod(m4[1], m4[1]), prod(m4[2], m4[2]))); var w4m0 = scale(w4, m0[0]); var w4m1 = scale(w4, m1[0]); var w4m2 = scale(w4, m2[0]); var w4m3 = scale(w4, m3[0]); var p = sum(sum(sum(scale(sum(scale(diff(w4m3, w3m4), m2[1]), sum(scale(diff(w4m2, w2m4), -m3[1]), scale(diff(w3m2, w2m3), m4[1]))), m1[2]), sum(scale(sum(scale(diff(w4m3, w3m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m3[1]), scale(diff(w3m1, w1m3), m4[1]))), -m2[2]), scale(sum(scale(diff(w4m2, w2m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m2[1]), scale(diff(w2m1, w1m2), m4[1]))), m3[2]))), sum(scale(sum(scale(diff(w3m2, w2m3), m1[1]), sum(scale(diff(w3m1, w1m3), -m2[1]), scale(diff(w2m1, w1m2), m3[1]))), -m4[2]), sum(scale(sum(scale(diff(w4m3, w3m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m3[1]), scale(diff(w3m1, w1m3), m4[1]))), m0[2]), scale(sum(scale(diff(w4m3, w3m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m3[1]), scale(diff(w3m0, w0m3), m4[1]))), -m1[2])))), sum(sum(scale(sum(scale(diff(w4m1, w1m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m1[1]), scale(diff(w1m0, w0m1), m4[1]))), m3[2]), sum(scale(sum(scale(diff(w3m1, w1m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m1[1]), scale(diff(w1m0, w0m1), m3[1]))), -m4[2]), scale(sum(scale(diff(w3m2, w2m3), m1[1]), sum(scale(diff(w3m1, w1m3), -m2[1]), scale(diff(w2m1, w1m2), m3[1]))), m0[2]))), sum(scale(sum(scale(diff(w3m2, w2m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m2[1]), scale(diff(w2m0, w0m2), m3[1]))), -m1[2]), sum(scale(sum(scale(diff(w3m1, w1m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m1[1]), scale(diff(w1m0, w0m1), m3[1]))), m2[2]), scale(sum(scale(diff(w2m1, w1m2), m0[1]), sum(scale(diff(w2m0, w0m2), -m1[1]), scale(diff(w1m0, w0m1), m2[1]))), -m3[2]))))); var n = sum(sum(sum(scale(sum(scale(diff(w4m3, w3m4), m2[1]), sum(scale(diff(w4m2, w2m4), -m3[1]), scale(diff(w3m2, w2m3), m4[1]))), m0[2]), scale(sum(scale(diff(w4m3, w3m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m3[1]), scale(diff(w3m0, w0m3), m4[1]))), -m2[2])), sum(scale(sum(scale(diff(w4m2, w2m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m2[1]), scale(diff(w2m0, w0m2), m4[1]))), m3[2]), scale(sum(scale(diff(w3m2, w2m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m2[1]), scale(diff(w2m0, w0m2), m3[1]))), -m4[2]))), sum(sum(scale(sum(scale(diff(w4m2, w2m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m2[1]), scale(diff(w2m1, w1m2), m4[1]))), m0[2]), scale(sum(scale(diff(w4m2, w2m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m2[1]), scale(diff(w2m0, w0m2), m4[1]))), -m1[2])), sum(scale(sum(scale(diff(w4m1, w1m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m1[1]), scale(diff(w1m0, w0m1), m4[1]))), m2[2]), scale(sum(scale(diff(w2m1, w1m2), m0[1]), sum(scale(diff(w2m0, w0m2), -m1[1]), scale(diff(w1m0, w0m1), m2[1]))), -m4[2])))); var d = diff(p, n); return d[d.length - 1]; } return exactInSphere5; } function inSphere6(sum, diff, prod, scale) { function exactInSphere6(m0, m1, m2, m3, m4, m5) { var w0 = sum(sum(prod(m0[0], m0[0]), prod(m0[1], m0[1])), sum(prod(m0[2], m0[2]), prod(m0[3], m0[3]))); var w0m1 = scale(w0, m1[0]); var w0m2 = scale(w0, m2[0]); var w0m3 = scale(w0, m3[0]); var w0m4 = scale(w0, m4[0]); var w0m5 = scale(w0, m5[0]); var w1 = sum(sum(prod(m1[0], m1[0]), prod(m1[1], m1[1])), sum(prod(m1[2], m1[2]), prod(m1[3], m1[3]))); var w1m0 = scale(w1, m0[0]); var w1m2 = scale(w1, m2[0]); var w1m3 = scale(w1, m3[0]); var w1m4 = scale(w1, m4[0]); var w1m5 = scale(w1, m5[0]); var w2 = sum(sum(prod(m2[0], m2[0]), prod(m2[1], m2[1])), sum(prod(m2[2], m2[2]), prod(m2[3], m2[3]))); var w2m0 = scale(w2, m0[0]); var w2m1 = scale(w2, m1[0]); var w2m3 = scale(w2, m3[0]); var w2m4 = scale(w2, m4[0]); var w2m5 = scale(w2, m5[0]); var w3 = sum(sum(prod(m3[0], m3[0]), prod(m3[1], m3[1])), sum(prod(m3[2], m3[2]), prod(m3[3], m3[3]))); var w3m0 = scale(w3, m0[0]); var w3m1 = scale(w3, m1[0]); var w3m2 = scale(w3, m2[0]); var w3m4 = scale(w3, m4[0]); var w3m5 = scale(w3, m5[0]); var w4 = sum(sum(prod(m4[0], m4[0]), prod(m4[1], m4[1])), sum(prod(m4[2], m4[2]), prod(m4[3], m4[3]))); var w4m0 = scale(w4, m0[0]); var w4m1 = scale(w4, m1[0]); var w4m2 = scale(w4, m2[0]); var w4m3 = scale(w4, m3[0]); var w4m5 = scale(w4, m5[0]); var w5 = sum(sum(prod(m5[0], m5[0]), prod(m5[1], m5[1])), sum(prod(m5[2], m5[2]), prod(m5[3], m5[3]))); var w5m0 = scale(w5, m0[0]); var w5m1 = scale(w5, m1[0]); var w5m2 = scale(w5, m2[0]); var w5m3 = scale(w5, m3[0]); var w5m4 = scale(w5, m4[0]); var p = sum(sum(sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m3[1]), sum(scale(diff(w5m3, w3m5), -m4[1]), scale(diff(w4m3, w3m4), m5[1]))), m2[2]), scale(sum(scale(diff(w5m4, w4m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m4[1]), scale(diff(w4m2, w2m4), m5[1]))), -m3[2])), sum(scale(sum(scale(diff(w5m3, w3m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m3[1]), scale(diff(w3m2, w2m3), m5[1]))), m4[2]), scale(sum(scale(diff(w4m3, w3m4), m2[1]), sum(scale(diff(w4m2, w2m4), -m3[1]), scale(diff(w3m2, w2m3), m4[1]))), -m5[2]))), m1[3]), sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m3[1]), sum(scale(diff(w5m3, w3m5), -m4[1]), scale(diff(w4m3, w3m4), m5[1]))), m1[2]), scale(sum(scale(diff(w5m4, w4m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m4[1]), scale(diff(w4m1, w1m4), m5[1]))), -m3[2])), sum(scale(sum(scale(diff(w5m3, w3m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m3[1]), scale(diff(w3m1, w1m3), m5[1]))), m4[2]), scale(sum(scale(diff(w4m3, w3m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m3[1]), scale(diff(w3m1, w1m3), m4[1]))), -m5[2]))), -m2[3]), scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m4[1]), scale(diff(w4m2, w2m4), m5[1]))), m1[2]), scale(sum(scale(diff(w5m4, w4m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m4[1]), scale(diff(w4m1, w1m4), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m2[1]), scale(diff(w2m1, w1m2), m5[1]))), m4[2]), scale(sum(scale(diff(w4m2, w2m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m2[1]), scale(diff(w2m1, w1m2), m4[1]))), -m5[2]))), m3[3]))), sum(sum(scale(sum(sum(scale(sum(scale(diff(w5m3, w3m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m3[1]), scale(diff(w3m2, w2m3), m5[1]))), m1[2]), scale(sum(scale(diff(w5m3, w3m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m3[1]), scale(diff(w3m1, w1m3), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m2[1]), scale(diff(w2m1, w1m2), m5[1]))), m3[2]), scale(sum(scale(diff(w3m2, w2m3), m1[1]), sum(scale(diff(w3m1, w1m3), -m2[1]), scale(diff(w2m1, w1m2), m3[1]))), -m5[2]))), -m4[3]), scale(sum(sum(scale(sum(scale(diff(w4m3, w3m4), m2[1]), sum(scale(diff(w4m2, w2m4), -m3[1]), scale(diff(w3m2, w2m3), m4[1]))), m1[2]), scale(sum(scale(diff(w4m3, w3m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m3[1]), scale(diff(w3m1, w1m3), m4[1]))), -m2[2])), sum(scale(sum(scale(diff(w4m2, w2m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m2[1]), scale(diff(w2m1, w1m2), m4[1]))), m3[2]), scale(sum(scale(diff(w3m2, w2m3), m1[1]), sum(scale(diff(w3m1, w1m3), -m2[1]), scale(diff(w2m1, w1m2), m3[1]))), -m4[2]))), m5[3])), sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m3[1]), sum(scale(diff(w5m3, w3m5), -m4[1]), scale(diff(w4m3, w3m4), m5[1]))), m1[2]), scale(sum(scale(diff(w5m4, w4m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m4[1]), scale(diff(w4m1, w1m4), m5[1]))), -m3[2])), sum(scale(sum(scale(diff(w5m3, w3m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m3[1]), scale(diff(w3m1, w1m3), m5[1]))), m4[2]), scale(sum(scale(diff(w4m3, w3m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m3[1]), scale(diff(w3m1, w1m3), m4[1]))), -m5[2]))), m0[3]), scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m3[1]), sum(scale(diff(w5m3, w3m5), -m4[1]), scale(diff(w4m3, w3m4), m5[1]))), m0[2]), scale(sum(scale(diff(w5m4, w4m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m4[1]), scale(diff(w4m0, w0m4), m5[1]))), -m3[2])), sum(scale(sum(scale(diff(w5m3, w3m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m3[1]), scale(diff(w3m0, w0m3), m5[1]))), m4[2]), scale(sum(scale(diff(w4m3, w3m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m3[1]), scale(diff(w3m0, w0m3), m4[1]))), -m5[2]))), -m1[3])))), sum(sum(sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m4[1]), scale(diff(w4m1, w1m4), m5[1]))), m0[2]), scale(sum(scale(diff(w5m4, w4m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m4[1]), scale(diff(w4m0, w0m4), m5[1]))), -m1[2])), sum(scale(sum(scale(diff(w5m1, w1m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m1[1]), scale(diff(w1m0, w0m1), m5[1]))), m4[2]), scale(sum(scale(diff(w4m1, w1m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m1[1]), scale(diff(w1m0, w0m1), m4[1]))), -m5[2]))), m3[3]), scale(sum(sum(scale(sum(scale(diff(w5m3, w3m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m3[1]), scale(diff(w3m1, w1m3), m5[1]))), m0[2]), scale(sum(scale(diff(w5m3, w3m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m3[1]), scale(diff(w3m0, w0m3), m5[1]))), -m1[2])), sum(scale(sum(scale(diff(w5m1, w1m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m1[1]), scale(diff(w1m0, w0m1), m5[1]))), m3[2]), scale(sum(scale(diff(w3m1, w1m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m1[1]), scale(diff(w1m0, w0m1), m3[1]))), -m5[2]))), -m4[3])), sum(scale(sum(sum(scale(sum(scale(diff(w4m3, w3m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m3[1]), scale(diff(w3m1, w1m3), m4[1]))), m0[2]), scale(sum(scale(diff(w4m3, w3m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m3[1]), scale(diff(w3m0, w0m3), m4[1]))), -m1[2])), sum(scale(sum(scale(diff(w4m1, w1m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m1[1]), scale(diff(w1m0, w0m1), m4[1]))), m3[2]), scale(sum(scale(diff(w3m1, w1m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m1[1]), scale(diff(w1m0, w0m1), m3[1]))), -m4[2]))), m5[3]), scale(sum(sum(scale(sum(scale(diff(w5m3, w3m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m3[1]), scale(diff(w3m2, w2m3), m5[1]))), m1[2]), scale(sum(scale(diff(w5m3, w3m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m3[1]), scale(diff(w3m1, w1m3), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m2[1]), scale(diff(w2m1, w1m2), m5[1]))), m3[2]), scale(sum(scale(diff(w3m2, w2m3), m1[1]), sum(scale(diff(w3m1, w1m3), -m2[1]), scale(diff(w2m1, w1m2), m3[1]))), -m5[2]))), m0[3]))), sum(sum(scale(sum(sum(scale(sum(scale(diff(w5m3, w3m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m3[1]), scale(diff(w3m2, w2m3), m5[1]))), m0[2]), scale(sum(scale(diff(w5m3, w3m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m3[1]), scale(diff(w3m0, w0m3), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m2[1]), scale(diff(w2m0, w0m2), m5[1]))), m3[2]), scale(sum(scale(diff(w3m2, w2m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m2[1]), scale(diff(w2m0, w0m2), m3[1]))), -m5[2]))), -m1[3]), scale(sum(sum(scale(sum(scale(diff(w5m3, w3m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m3[1]), scale(diff(w3m1, w1m3), m5[1]))), m0[2]), scale(sum(scale(diff(w5m3, w3m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m3[1]), scale(diff(w3m0, w0m3), m5[1]))), -m1[2])), sum(scale(sum(scale(diff(w5m1, w1m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m1[1]), scale(diff(w1m0, w0m1), m5[1]))), m3[2]), scale(sum(scale(diff(w3m1, w1m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m1[1]), scale(diff(w1m0, w0m1), m3[1]))), -m5[2]))), m2[3])), sum(scale(sum(sum(scale(sum(scale(diff(w5m2, w2m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m2[1]), scale(diff(w2m1, w1m2), m5[1]))), m0[2]), scale(sum(scale(diff(w5m2, w2m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m2[1]), scale(diff(w2m0, w0m2), m5[1]))), -m1[2])), sum(scale(sum(scale(diff(w5m1, w1m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m1[1]), scale(diff(w1m0, w0m1), m5[1]))), m2[2]), scale(sum(scale(diff(w2m1, w1m2), m0[1]), sum(scale(diff(w2m0, w0m2), -m1[1]), scale(diff(w1m0, w0m1), m2[1]))), -m5[2]))), -m3[3]), scale(sum(sum(scale(sum(scale(diff(w3m2, w2m3), m1[1]), sum(scale(diff(w3m1, w1m3), -m2[1]), scale(diff(w2m1, w1m2), m3[1]))), m0[2]), scale(sum(scale(diff(w3m2, w2m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m2[1]), scale(diff(w2m0, w0m2), m3[1]))), -m1[2])), sum(scale(sum(scale(diff(w3m1, w1m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m1[1]), scale(diff(w1m0, w0m1), m3[1]))), m2[2]), scale(sum(scale(diff(w2m1, w1m2), m0[1]), sum(scale(diff(w2m0, w0m2), -m1[1]), scale(diff(w1m0, w0m1), m2[1]))), -m3[2]))), m5[3]))))); var n = sum(sum(sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m3[1]), sum(scale(diff(w5m3, w3m5), -m4[1]), scale(diff(w4m3, w3m4), m5[1]))), m2[2]), scale(sum(scale(diff(w5m4, w4m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m4[1]), scale(diff(w4m2, w2m4), m5[1]))), -m3[2])), sum(scale(sum(scale(diff(w5m3, w3m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m3[1]), scale(diff(w3m2, w2m3), m5[1]))), m4[2]), scale(sum(scale(diff(w4m3, w3m4), m2[1]), sum(scale(diff(w4m2, w2m4), -m3[1]), scale(diff(w3m2, w2m3), m4[1]))), -m5[2]))), m0[3]), sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m3[1]), sum(scale(diff(w5m3, w3m5), -m4[1]), scale(diff(w4m3, w3m4), m5[1]))), m0[2]), scale(sum(scale(diff(w5m4, w4m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m4[1]), scale(diff(w4m0, w0m4), m5[1]))), -m3[2])), sum(scale(sum(scale(diff(w5m3, w3m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m3[1]), scale(diff(w3m0, w0m3), m5[1]))), m4[2]), scale(sum(scale(diff(w4m3, w3m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m3[1]), scale(diff(w3m0, w0m3), m4[1]))), -m5[2]))), -m2[3]), scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m4[1]), scale(diff(w4m2, w2m4), m5[1]))), m0[2]), scale(sum(scale(diff(w5m4, w4m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m4[1]), scale(diff(w4m0, w0m4), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m2[1]), scale(diff(w2m0, w0m2), m5[1]))), m4[2]), scale(sum(scale(diff(w4m2, w2m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m2[1]), scale(diff(w2m0, w0m2), m4[1]))), -m5[2]))), m3[3]))), sum(sum(scale(sum(sum(scale(sum(scale(diff(w5m3, w3m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m3[1]), scale(diff(w3m2, w2m3), m5[1]))), m0[2]), scale(sum(scale(diff(w5m3, w3m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m3[1]), scale(diff(w3m0, w0m3), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m2[1]), scale(diff(w2m0, w0m2), m5[1]))), m3[2]), scale(sum(scale(diff(w3m2, w2m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m2[1]), scale(diff(w2m0, w0m2), m3[1]))), -m5[2]))), -m4[3]), scale(sum(sum(scale(sum(scale(diff(w4m3, w3m4), m2[1]), sum(scale(diff(w4m2, w2m4), -m3[1]), scale(diff(w3m2, w2m3), m4[1]))), m0[2]), scale(sum(scale(diff(w4m3, w3m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m3[1]), scale(diff(w3m0, w0m3), m4[1]))), -m2[2])), sum(scale(sum(scale(diff(w4m2, w2m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m2[1]), scale(diff(w2m0, w0m2), m4[1]))), m3[2]), scale(sum(scale(diff(w3m2, w2m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m2[1]), scale(diff(w2m0, w0m2), m3[1]))), -m4[2]))), m5[3])), sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m4[1]), scale(diff(w4m2, w2m4), m5[1]))), m1[2]), scale(sum(scale(diff(w5m4, w4m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m4[1]), scale(diff(w4m1, w1m4), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m2[1]), scale(diff(w2m1, w1m2), m5[1]))), m4[2]), scale(sum(scale(diff(w4m2, w2m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m2[1]), scale(diff(w2m1, w1m2), m4[1]))), -m5[2]))), m0[3]), scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m4[1]), scale(diff(w4m2, w2m4), m5[1]))), m0[2]), scale(sum(scale(diff(w5m4, w4m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m4[1]), scale(diff(w4m0, w0m4), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m2[1]), scale(diff(w2m0, w0m2), m5[1]))), m4[2]), scale(sum(scale(diff(w4m2, w2m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m2[1]), scale(diff(w2m0, w0m2), m4[1]))), -m5[2]))), -m1[3])))), sum(sum(sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m4[1]), scale(diff(w4m1, w1m4), m5[1]))), m0[2]), scale(sum(scale(diff(w5m4, w4m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m4[1]), scale(diff(w4m0, w0m4), m5[1]))), -m1[2])), sum(scale(sum(scale(diff(w5m1, w1m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m1[1]), scale(diff(w1m0, w0m1), m5[1]))), m4[2]), scale(sum(scale(diff(w4m1, w1m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m1[1]), scale(diff(w1m0, w0m1), m4[1]))), -m5[2]))), m2[3]), scale(sum(sum(scale(sum(scale(diff(w5m2, w2m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m2[1]), scale(diff(w2m1, w1m2), m5[1]))), m0[2]), scale(sum(scale(diff(w5m2, w2m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m2[1]), scale(diff(w2m0, w0m2), m5[1]))), -m1[2])), sum(scale(sum(scale(diff(w5m1, w1m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m1[1]), scale(diff(w1m0, w0m1), m5[1]))), m2[2]), scale(sum(scale(diff(w2m1, w1m2), m0[1]), sum(scale(diff(w2m0, w0m2), -m1[1]), scale(diff(w1m0, w0m1), m2[1]))), -m5[2]))), -m4[3])), sum(scale(sum(sum(scale(sum(scale(diff(w4m2, w2m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m2[1]), scale(diff(w2m1, w1m2), m4[1]))), m0[2]), scale(sum(scale(diff(w4m2, w2m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m2[1]), s