in \"points to\" pull ? */\r\n let int_points_to_pull_start = next_int_point_num;\r\n let int_points_to_pull_num = intPointsPoolCount(int_points, int_points_to_pull_start, cur_face);\r\n\r\n\r\n let edge_from = int_point_current.edge_after;\r\n let edge_to = int_point_next.edge_before;\r\n\r\n if ((edge_from.bv === INSIDE$1 && edge_to.bv === INSIDE$1 && op === BOOLEAN_UNION) ||\r\n (edge_from.bv === OUTSIDE$1 && edge_to.bv === OUTSIDE$1 && op === BOOLEAN_INTERSECT) ||\r\n ((edge_from.bv === OUTSIDE$1 || edge_to.bv === OUTSIDE$1) && op === BOOLEAN_SUBTRACT && !is_res_polygon) ||\r\n ((edge_from.bv === INSIDE$1 || edge_to.bv === INSIDE$1) && op === BOOLEAN_SUBTRACT && is_res_polygon) ||\r\n (edge_from.bv === BOUNDARY$1 && edge_to.bv === BOUNDARY$1 && (edge_from.overlap & OVERLAP_SAME$1) && is_res_polygon) ||\r\n (edge_from.bv === BOUNDARY$1 && edge_to.bv === BOUNDARY$1 && (edge_from.overlap & OVERLAP_OPPOSITE$1))) {\r\n\r\n polygon.removeChain(cur_face, edge_from, edge_to);\r\n\r\n /* update all points in \"points from\" pull */\r\n for (let k = int_points_from_pull_start; k < int_points_from_pull_start + int_points_from_pull_num; k++) {\r\n int_points[k].edge_after = undefined;\r\n }\r\n\r\n /* update all points in \"points to\" pull */\r\n for (let k = int_points_to_pull_start; k < int_points_to_pull_start + int_points_to_pull_num; k++) {\r\n int_points[k].edge_before = undefined;\r\n }\r\n }\r\n\r\n /* skip to the last point in \"points from\" group */\r\n i += int_points_from_pull_num - 1;\r\n }\r\n}\r\nfunction copyWrkToRes(res_polygon, wrk_polygon, op, int_points)\r\n{\r\n for (let face of wrk_polygon.faces) {\r\n for (let edge of face) {\r\n res_polygon.edges.add(edge);\r\n }\r\n // If union - add face from wrk_polygon that is not intersected with res_polygon\r\n if ( /*(op === BOOLEAN_UNION || op == BOOLEAN_SUBTRACT) &&*/\r\n int_points.find((ip) => (ip.face === face)) === undefined) {\r\n res_polygon.addFace(face.first, face.last);\r\n }\r\n }\r\n}\r\n\r\nfunction swapLinks(res_polygon, wrk_polygon, intersections)\r\n{\r\n if (intersections.int_points1.length === 0) return;\r\n\r\n for (let i = 0; i < intersections.int_points1.length; i++) {\r\n let int_point1 = intersections.int_points1[i];\r\n let int_point2 = intersections.int_points2[i];\r\n\r\n // Simple case - find continuation on the other polygon\r\n\r\n // Process edge from res_polygon\r\n if (int_point1.edge_before !== undefined && int_point1.edge_after === undefined) { // swap need\r\n if (int_point2.edge_before === undefined && int_point2.edge_after !== undefined) { // simple case\r\n // Connect edges\r\n int_point1.edge_before.next = int_point2.edge_after;\r\n int_point2.edge_after.prev = int_point1.edge_before;\r\n\r\n // Fill in missed links in intersection points\r\n int_point1.edge_after = int_point2.edge_after;\r\n int_point2.edge_before = int_point1.edge_before;\r\n }\r\n }\r\n // Process edge from wrk_polygon\r\n if (int_point2.edge_before !== undefined && int_point2.edge_after === undefined) { // swap need\r\n if (int_point1.edge_before === undefined && int_point1.edge_after !== undefined) { // simple case\r\n // Connect edges\r\n int_point2.edge_before.next = int_point1.edge_after;\r\n int_point1.edge_after.prev = int_point2.edge_before;\r\n\r\n // Complete missed links\r\n int_point2.edge_after = int_point1.edge_after;\r\n int_point1.edge_before = int_point2.edge_before;\r\n }\r\n }\r\n\r\n // Continuation not found - complex case\r\n // Continuation will be found on the same polygon.\r\n // It happens when intersection point is actually touching point\r\n // Polygon1\r\n if (int_point1.edge_before !== undefined && int_point1.edge_after === undefined) { // still swap need\r\n for (let int_point of intersections.int_points1_sorted) {\r\n if (int_point === int_point1) continue; // skip same\r\n if (int_point.edge_before === undefined && int_point.edge_after !== undefined) {\r\n if (int_point.pt.equalTo(int_point1.pt)) {\r\n // Connect edges\r\n int_point1.edge_before.next = int_point.edge_after;\r\n int_point.edge_after.prev = int_point1.edge_before;\r\n\r\n // Complete missed links\r\n int_point1.edge_after = int_point.edge_after;\r\n int_point.edge_before = int_point1.edge_before;\r\n }\r\n }\r\n }\r\n }\r\n // Polygon2\r\n if (int_point2.edge_before !== undefined && int_point2.edge_after === undefined) { // still swap need\r\n for (let int_point of intersections.int_points2_sorted) {\r\n if (int_point === int_point2) continue; // skip same\r\n if (int_point.edge_before === undefined && int_point.edge_after !== undefined) {\r\n if (int_point.pt.equalTo(int_point2.pt)) {\r\n // Connect edges\r\n int_point2.edge_before.next = int_point.edge_after;\r\n int_point.edge_after.prev = int_point2.edge_before;\r\n\r\n // Complete missed links\r\n int_point2.edge_after = int_point.edge_after;\r\n int_point.edge_before = int_point2.edge_before;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // Sanity check that no dead ends left\r\n}\r\n\r\nfunction removeOldFaces(polygon, int_points)\r\n{\r\n for (let int_point of int_points) {\r\n polygon.faces.delete(int_point.face);\r\n int_point.face = undefined;\r\n if (int_point.edge_before)\r\n int_point.edge_before.face = undefined;\r\n if (int_point.edge_after)\r\n int_point.edge_after.face = undefined;\r\n }\r\n}\r\n\r\nfunction restoreFaces(polygon, int_points, other_int_points)\r\n{\r\n // For each intersection point - create new face\r\n for (let int_point of int_points) {\r\n if (int_point.edge_before === undefined || int_point.edge_after === undefined) // completely deleted\r\n continue;\r\n if (int_point.face) // already restored\r\n continue;\r\n\r\n if (int_point.edge_after.face || int_point.edge_before.face) // Face already created. Possible case in duplicated intersection points\r\n continue;\r\n\r\n let first = int_point.edge_after; // face start\r\n let last = int_point.edge_before; // face end;\r\n\r\n LinkedList.testInfiniteLoop(first); // check and throw error if infinite loop found\r\n\r\n let face = polygon.addFace(first, last);\r\n\r\n // Mark intersection points from the newly create face\r\n // to avoid multiple creation of the same face\r\n // Face was assigned to each edge of new face in addFace function\r\n for (let int_point_tmp of int_points) {\r\n if (int_point_tmp.edge_before && int_point_tmp.edge_after &&\r\n int_point_tmp.edge_before.face === face && int_point_tmp.edge_after.face === face) {\r\n int_point_tmp.face = face;\r\n }\r\n }\r\n // Mark other intersection points as well\r\n for (let int_point_tmp of other_int_points) {\r\n if (int_point_tmp.edge_before && int_point_tmp.edge_after &&\r\n int_point_tmp.edge_before.face === face && int_point_tmp.edge_after.face === face) {\r\n int_point_tmp.face = face;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction removeNotRelevantNotIntersectedFaces(polygon, notIntersectedFaces, op, is_res_polygon)\r\n{\r\n for (let face of notIntersectedFaces) {\r\n let rel = face.first.bv;\r\n if (op === BOOLEAN_UNION && rel === INSIDE$1 ||\r\n op === BOOLEAN_SUBTRACT && rel === INSIDE$1 && is_res_polygon ||\r\n op === BOOLEAN_SUBTRACT && rel === OUTSIDE$1 && !is_res_polygon ||\r\n op === BOOLEAN_INTERSECT && rel === OUTSIDE$1) {\r\n\r\n polygon.deleteFace(face);\r\n }\r\n }\r\n}\r\n\r\nvar BooleanOperations = /*#__PURE__*/Object.freeze({\r\n BOOLEAN_UNION: BOOLEAN_UNION,\r\n BOOLEAN_INTERSECT: BOOLEAN_INTERSECT,\r\n BOOLEAN_SUBTRACT: BOOLEAN_SUBTRACT,\r\n unify: unify,\r\n subtract: subtract,\r\n intersect: intersect,\r\n innerClip: innerClip,\r\n outerClip: outerClip,\r\n calculateIntersections: calculateIntersections,\r\n removeNotRelevantChains: removeNotRelevantChains,\r\n removeOldFaces: removeOldFaces,\r\n restoreFaces: restoreFaces\r\n});\r\n\r\n/*\r\n Dimensionally extended 9-intersected model\r\n See https://en.wikipedia.org/wiki/DE-9IM for more details\r\n */\r\n// const DISJOINT = RegExp('FF.FF....');\r\nconst EQUAL = RegExp('T.F..FFF.|T.F...F..');\r\nconst INTERSECT = RegExp('T........|.T.......|...T.....|....T....');\r\nconst TOUCH = RegExp('FT.......|F..T.....|F...T....');\r\nconst INSIDE$2 = RegExp('T.F..F...');\r\nconst COVERED = RegExp('T.F..F...|.TF..F...|..FT.F...|..F.TF...');\r\n\r\nclass DE9IM {\r\n /**\r\n * Create new instance of DE9IM matrix\r\n */\r\n constructor() {\r\n /**\r\n * Array representing 3x3 intersection matrix\r\n * @type {Shape[]}\r\n */\r\n this.m = new Array(9).fill(undefined);\r\n }\r\n\r\n /**\r\n * Get Interior To Interior intersection\r\n * @returns {Shape[] | undefined}\r\n */\r\n get I2I() {\r\n return this.m[0];\r\n }\r\n\r\n /**\r\n * Set Interior To Interior intersection\r\n * @param geom\r\n */\r\n set I2I(geom) {\r\n this.m[0] = geom;\r\n }\r\n\r\n /**\r\n * Get Interior To Boundary intersection\r\n * @returns {Shape[] | undefined}\r\n */\r\n get I2B() {\r\n return this.m[1];\r\n }\r\n\r\n /**\r\n * Set Interior to Boundary intersection\r\n * @param geomc\r\n */\r\n set I2B(geom) {\r\n this.m[1] = geom;\r\n }\r\n\r\n /**\r\n * Get Interior To Exterior intersection\r\n * @returns {Shape[] | undefined}\r\n */\r\n get I2E() {\r\n return this.m[2];\r\n }\r\n\r\n /**\r\n * Set Interior to Exterior intersection\r\n * @param geom\r\n */\r\n set I2E(geom) {\r\n this.m[2] = geom;\r\n }\r\n\r\n /**\r\n * Get Boundary To Interior intersection\r\n * @returns {Shape[] | undefined}\r\n */\r\n get B2I() {\r\n return this.m[3];\r\n }\r\n\r\n /**\r\n * Set Boundary to Interior intersection\r\n * @param geom\r\n */\r\n set B2I(geom) {\r\n this.m[3] = geom;\r\n }\r\n\r\n /**\r\n * Get Boundary To Boundary intersection\r\n * @returns {Shape[] | undefined}\r\n */\r\n get B2B() {\r\n return this.m[4];\r\n }\r\n\r\n /**\r\n * Set Boundary to Boundary intersection\r\n * @param geom\r\n */\r\n set B2B(geom) {\r\n this.m[4] = geom;\r\n }\r\n\r\n /**\r\n * Get Boundary To Exterior intersection\r\n * @returns {Shape[] | undefined}\r\n */\r\n get B2E() {\r\n return this.m[5];\r\n }\r\n\r\n /**\r\n * Set Boundary to Exterior intersection\r\n * @param geom\r\n */\r\n set B2E(geom) {\r\n this.m[5] = geom;\r\n }\r\n\r\n /**\r\n * Get Exterior To Interior intersection\r\n * @returns {Shape[] | undefined}\r\n */\r\n get E2I() {\r\n return this.m[6];\r\n }\r\n\r\n /**\r\n * Set Exterior to Interior intersection\r\n * @param geom\r\n */\r\n set E2I(geom) {\r\n this.m[6] = geom;\r\n }\r\n\r\n /**\r\n * Get Exterior To Boundary intersection\r\n * @returns {Shape[] | undefined}\r\n */\r\n get E2B() {\r\n return this.m[7];\r\n }\r\n\r\n /**\r\n * Set Exterior to Boundary intersection\r\n * @param geom\r\n */\r\n set E2B(geom) {\r\n this.m[7] = geom;\r\n }\r\n\r\n /**\r\n * Get Exterior to Exterior intersection\r\n * @returns {Shape[] | undefined}\r\n */\r\n get E2E() {\r\n return this.m[8];\r\n }\r\n\r\n /**\r\n * Set Exterior to Exterior intersection\r\n * @param geom\r\n */\r\n set E2E(geom) {\r\n this.m[8] = geom;\r\n }\r\n\r\n /**\r\n * Return de9im matrix as string where
\r\n * - intersection is 'T'
\r\n * - not intersected is 'F'
\r\n * - not relevant is '*'
\r\n * For example, string 'FF**FF****' means 'DISJOINT'\r\n * @returns {string}\r\n */\r\n toString() {\r\n return this.m.map( e => {\r\n if (e instanceof Array && e.length > 0) {\r\n return 'T'\r\n }\r\n else if (e instanceof Array && e.length === 0) {\r\n return 'F'\r\n }\r\n else {\r\n return '*'\r\n }\r\n }).join(\"\")\r\n }\r\n\r\n equal() {\r\n return EQUAL.test(this.toString());\r\n }\r\n\r\n intersect() {\r\n return INTERSECT.test(this.toString());\r\n }\r\n\r\n touch() {\r\n return TOUCH.test(this.toString());\r\n }\r\n\r\n inside() {\r\n return INSIDE$2.test(this.toString());\r\n }\r\n\r\n covered() {\r\n return COVERED.test(this.toString());\r\n }\r\n}\r\n\r\n/**\r\n * Intersection\r\n *\r\n * */\r\n\r\nfunction intersectLine2Line(line1, line2) {\r\n let ip = [];\r\n\r\n let [A1, B1, C1] = line1.standard;\r\n let [A2, B2, C2] = line2.standard;\r\n\r\n /* Cramer's rule */\r\n let det = A1 * B2 - B1 * A2;\r\n let detX = C1 * B2 - B1 * C2;\r\n let detY = A1 * C2 - C1 * A2;\r\n\r\n if (!Flatten.Utils.EQ_0(det)) {\r\n let x, y;\r\n\r\n if (B1 === 0) { // vertical line x = C1/A1, where A1 == +1 or -1\r\n x = C1/A1;\r\n y = detY / det;\r\n }\r\n else if (B2 === 0) { // vertical line x = C2/A2, where A2 = +1 or -1\r\n x = C2/A2;\r\n y = detY / det;\r\n }\r\n else if (A1 === 0) { // horizontal line y = C1/B1, where B1 = +1 or -1\r\n x = detX / det;\r\n y = C1/B1;\r\n }\r\n else if (A2 === 0) { // horizontal line y = C2/B2, where B2 = +1 or -1\r\n x = detX / det;\r\n y = C2/B2;\r\n }\r\n else {\r\n x = detX / det;\r\n y = detY / det;\r\n }\r\n\r\n ip.push(new Flatten.Point(x, y));\r\n }\r\n\r\n return ip;\r\n}\r\n\r\nfunction intersectLine2Circle(line, circle) {\r\n let ip = [];\r\n let prj = circle.pc.projectionOn(line); // projection of circle center on line\r\n let dist = circle.pc.distanceTo(prj)[0]; // distance from circle center to projection\r\n\r\n if (Flatten.Utils.EQ(dist, circle.r)) { // line tangent to circle - return single intersection point\r\n ip.push(prj);\r\n } else if (Flatten.Utils.LT(dist, circle.r)) { // return two intersection points\r\n let delta = Math.sqrt(circle.r * circle.r - dist * dist);\r\n let v_trans, pt;\r\n\r\n v_trans = line.norm.rotate90CCW().multiply(delta);\r\n pt = prj.translate(v_trans);\r\n ip.push(pt);\r\n\r\n v_trans = line.norm.rotate90CW().multiply(delta);\r\n pt = prj.translate(v_trans);\r\n ip.push(pt);\r\n }\r\n return ip;\r\n}\r\n\r\nfunction intersectLine2Box(line, box) {\r\n let ips = [];\r\n for (let seg of box.toSegments()) {\r\n let ips_tmp = intersectSegment2Line(seg, line);\r\n for (let pt of ips_tmp) {\r\n if (!ptInIntPoints(pt, ips)) {\r\n ips.push(pt);\r\n }\r\n }\r\n }\r\n return ips;\r\n}\r\n\r\nfunction intersectLine2Arc(line, arc) {\r\n let ip = [];\r\n\r\n if (intersectLine2Box(line, arc.box).length === 0) {\r\n return ip;\r\n }\r\n\r\n let circle = new Flatten.Circle(arc.pc, arc.r);\r\n let ip_tmp = intersectLine2Circle(line, circle);\r\n for (let pt of ip_tmp) {\r\n if (pt.on(arc)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n return ip;\r\n}\r\n\r\nfunction intersectSegment2Line(seg, line) {\r\n let ip = [];\r\n\r\n // Boundary cases\r\n if (seg.ps.on(line)) {\r\n ip.push(seg.ps);\r\n }\r\n // If both ends lay on line, return two intersection points\r\n if (seg.pe.on(line) && !seg.isZeroLength()) {\r\n ip.push(seg.pe);\r\n }\r\n\r\n if (ip.length > 0) {\r\n return ip; // done, intersection found\r\n }\r\n\r\n // If zero-length segment and nothing found, return no intersections\r\n if (seg.isZeroLength()) {\r\n return ip;\r\n }\r\n\r\n // Not a boundary case, check if both points are on the same side and\r\n // hence there is no intersection\r\n if (seg.ps.leftTo(line) && seg.pe.leftTo(line) ||\r\n !seg.ps.leftTo(line) && !seg.pe.leftTo(line)) {\r\n return ip;\r\n }\r\n\r\n // Calculate intersection between lines\r\n let line1 = new Flatten.Line(seg.ps, seg.pe);\r\n return intersectLine2Line(line1, line);\r\n}\r\n\r\nfunction intersectSegment2Segment(seg1, seg2) {\r\n let ip = [];\r\n\r\n // quick reject\r\n if (seg1.box.not_intersect(seg2.box)) {\r\n return ip;\r\n }\r\n\r\n // Special case of seg1 zero length\r\n if (seg1.isZeroLength()) {\r\n if (seg1.ps.on(seg2)) {\r\n ip.push(seg1.ps);\r\n }\r\n return ip;\r\n }\r\n\r\n // Special case of seg2 zero length\r\n if (seg2.isZeroLength()) {\r\n if (seg2.ps.on(seg1)) {\r\n ip.push(seg2.ps);\r\n }\r\n return ip;\r\n }\r\n\r\n // Neither seg1 nor seg2 is zero length\r\n let line1 = new Flatten.Line(seg1.ps, seg1.pe);\r\n let line2 = new Flatten.Line(seg2.ps, seg2.pe);\r\n\r\n // Check overlapping between segments in case of incidence\r\n // If segments touching, add one point. If overlapping, add two points\r\n if (line1.incidentTo(line2)) {\r\n if (seg1.ps.on(seg2)) {\r\n ip.push(seg1.ps);\r\n }\r\n if (seg1.pe.on(seg2)) {\r\n ip.push(seg1.pe);\r\n }\r\n if (seg2.ps.on(seg1) && !seg2.ps.equalTo(seg1.ps) && !seg2.ps.equalTo(seg1.pe)) {\r\n ip.push(seg2.ps);\r\n }\r\n if (seg2.pe.on(seg1) && !seg2.pe.equalTo(seg1.ps) && !seg2.pe.equalTo(seg1.pe)) {\r\n ip.push(seg2.pe);\r\n }\r\n } else { /* not incident - parallel or intersect */\r\n // Calculate intersection between lines\r\n let new_ip = intersectLine2Line(line1, line2);\r\n if (new_ip.length > 0 && new_ip[0].on(seg1) && new_ip[0].on(seg2)) {\r\n ip.push(new_ip[0]);\r\n }\r\n\r\n // Fix missing intersection\r\n // const tol = 10*Flatten.DP_TOL;\r\n // if (ip.length === 0 && new_ip.length > 0 && (new_ip[0].distanceTo(seg1)[0] < tol || new_ip[0].distanceTo(seg2)[0] < tol) ) {\r\n // if (seg1.start.distanceTo(seg2)[0] < tol) {\r\n // ip.push(new_ip[0]);\r\n // }\r\n // else if (seg1.end.distanceTo(seg2)[0] < tol) {\r\n // ip.push(new_ip[0]);\r\n // }\r\n // else if (seg2.start.distanceTo(seg1)[0] < tol) {\r\n // ip.push(new_ip[0]);\r\n // }\r\n // else if (seg2.end.distanceTo(seg1)[0] < tol) {\r\n // ip.push(new_ip[0]);\r\n // }\r\n // }\r\n }\r\n\r\n return ip;\r\n}\r\n\r\nfunction intersectSegment2Circle(segment, circle) {\r\n let ips = [];\r\n\r\n if (segment.box.not_intersect(circle.box)) {\r\n return ips;\r\n }\r\n\r\n // Special case of zero length segment\r\n if (segment.isZeroLength()) {\r\n let [dist, shortest_segment] = segment.ps.distanceTo(circle.pc);\r\n if (Flatten.Utils.EQ(dist, circle.r)) {\r\n ips.push(segment.ps);\r\n }\r\n return ips;\r\n }\r\n\r\n // Non zero-length segment\r\n let line = new Flatten.Line(segment.ps, segment.pe);\r\n\r\n let ips_tmp = intersectLine2Circle(line, circle);\r\n\r\n for (let ip of ips_tmp) {\r\n if (ip.on(segment)) {\r\n ips.push(ip);\r\n }\r\n }\r\n\r\n return ips;\r\n}\r\n\r\nfunction intersectSegment2Arc(segment, arc) {\r\n let ip = [];\r\n\r\n if (segment.box.not_intersect(arc.box)) {\r\n return ip;\r\n }\r\n\r\n // Special case of zero-length segment\r\n if (segment.isZeroLength()) {\r\n if (segment.ps.on(arc)) {\r\n ip.push(segment.ps);\r\n }\r\n return ip;\r\n }\r\n\r\n // Non-zero length segment\r\n let line = new Flatten.Line(segment.ps, segment.pe);\r\n let circle = new Flatten.Circle(arc.pc, arc.r);\r\n\r\n let ip_tmp = intersectLine2Circle(line, circle);\r\n\r\n for (let pt of ip_tmp) {\r\n if (pt.on(segment) && pt.on(arc)) {\r\n ip.push(pt);\r\n }\r\n }\r\n return ip;\r\n\r\n}\r\n\r\nfunction intersectSegment2Box(segment, box) {\r\n let ips = [];\r\n for (let seg of box.toSegments()) {\r\n let ips_tmp = intersectSegment2Segment(seg, segment);\r\n for (let ip of ips_tmp) {\r\n ips.push(ip);\r\n }\r\n }\r\n return ips;\r\n}\r\n\r\nfunction intersectCircle2Circle(circle1, circle2) {\r\n let ip = [];\r\n\r\n if (circle1.box.not_intersect(circle2.box)) {\r\n return ip;\r\n }\r\n\r\n let vec = new Flatten.Vector(circle1.pc, circle2.pc);\r\n\r\n let r1 = circle1.r;\r\n let r2 = circle2.r;\r\n\r\n // Degenerated circle\r\n if (Flatten.Utils.EQ_0(r1) || Flatten.Utils.EQ_0(r2))\r\n return ip;\r\n\r\n // In case of equal circles return one leftmost point\r\n if (Flatten.Utils.EQ_0(vec.x) && Flatten.Utils.EQ_0(vec.y) && Flatten.Utils.EQ(r1, r2)) {\r\n ip.push(circle1.pc.translate(-r1, 0));\r\n return ip;\r\n }\r\n\r\n let dist = circle1.pc.distanceTo(circle2.pc)[0];\r\n\r\n if (Flatten.Utils.GT(dist, r1 + r2)) // circles too far, no intersections\r\n return ip;\r\n\r\n if (Flatten.Utils.LT(dist, Math.abs(r1 - r2))) // one circle is contained within another, no intersections\r\n return ip;\r\n\r\n // Normalize vector.\r\n vec.x /= dist;\r\n vec.y /= dist;\r\n\r\n let pt;\r\n\r\n // Case of touching from outside or from inside - single intersection point\r\n // TODO: check this specifically not sure if correct\r\n if (Flatten.Utils.EQ(dist, r1 + r2) || Flatten.Utils.EQ(dist, Math.abs(r1 - r2))) {\r\n pt = circle1.pc.translate(r1 * vec.x, r1 * vec.y);\r\n ip.push(pt);\r\n return ip;\r\n }\r\n\r\n // Case of two intersection points\r\n\r\n // Distance from first center to center of common chord:\r\n // a = (r1^2 - r2^2 + d^2) / 2d\r\n // Separate for better accuracy\r\n let a = (r1 * r1) / (2 * dist) - (r2 * r2) / (2 * dist) + dist / 2;\r\n\r\n let mid_pt = circle1.pc.translate(a * vec.x, a * vec.y);\r\n let h = Math.sqrt(r1 * r1 - a * a);\r\n // let norm;\r\n\r\n // norm = vec.rotate90CCW().multiply(h);\r\n pt = mid_pt.translate(vec.rotate90CCW().multiply(h));\r\n ip.push(pt);\r\n\r\n // norm = vec.rotate90CW();\r\n pt = mid_pt.translate(vec.rotate90CW().multiply(h));\r\n ip.push(pt);\r\n\r\n return ip;\r\n}\r\n\r\nfunction intersectCircle2Box(circle, box) {\r\n let ips = [];\r\n for (let seg of box.toSegments()) {\r\n let ips_tmp = intersectSegment2Circle(seg, circle);\r\n for (let ip of ips_tmp) {\r\n ips.push(ip);\r\n }\r\n }\r\n return ips;\r\n}\r\n\r\nfunction intersectArc2Arc(arc1, arc2) {\r\n var ip = [];\r\n\r\n if (arc1.box.not_intersect(arc2.box)) {\r\n return ip;\r\n }\r\n\r\n // Special case: overlapping arcs\r\n // May return up to 4 intersection points\r\n if (arc1.pc.equalTo(arc2.pc) && Flatten.Utils.EQ(arc1.r, arc2.r)) {\r\n let pt;\r\n\r\n pt = arc1.start;\r\n if (pt.on(arc2))\r\n ip.push(pt);\r\n\r\n pt = arc1.end;\r\n if (pt.on(arc2))\r\n ip.push(pt);\r\n\r\n pt = arc2.start;\r\n if (pt.on(arc1)) ip.push(pt);\r\n\r\n pt = arc2.end;\r\n if (pt.on(arc1)) ip.push(pt);\r\n\r\n return ip;\r\n }\r\n\r\n // Common case\r\n let circle1 = new Flatten.Circle(arc1.pc, arc1.r);\r\n let circle2 = new Flatten.Circle(arc2.pc, arc2.r);\r\n let ip_tmp = circle1.intersect(circle2);\r\n for (let pt of ip_tmp) {\r\n if (pt.on(arc1) && pt.on(arc2)) {\r\n ip.push(pt);\r\n }\r\n }\r\n return ip;\r\n}\r\n\r\nfunction intersectArc2Circle(arc, circle) {\r\n let ip = [];\r\n\r\n if (arc.box.not_intersect(circle.box)) {\r\n return ip;\r\n }\r\n\r\n // Case when arc center incident to circle center\r\n // Return arc's end points as 2 intersection points\r\n if (circle.pc.equalTo(arc.pc) && Flatten.Utils.EQ(circle.r, arc.r)) {\r\n ip.push(arc.start);\r\n ip.push(arc.end);\r\n return ip;\r\n }\r\n\r\n // Common case\r\n let circle1 = circle;\r\n let circle2 = new Flatten.Circle(arc.pc, arc.r);\r\n let ip_tmp = intersectCircle2Circle(circle1, circle2);\r\n for (let pt of ip_tmp) {\r\n if (pt.on(arc)) {\r\n ip.push(pt);\r\n }\r\n }\r\n return ip;\r\n}\r\n\r\nfunction intersectArc2Box(arc, box) {\r\n let ips = [];\r\n for (let seg of box.toSegments()) {\r\n let ips_tmp = intersectSegment2Arc(seg, arc);\r\n for (let ip of ips_tmp) {\r\n ips.push(ip);\r\n }\r\n }\r\n return ips;\r\n}\r\n\r\nfunction intersectEdge2Segment(edge, segment) {\r\n return edge.isSegment() ? intersectSegment2Segment(edge.shape, segment) : intersectSegment2Arc(segment, edge.shape);\r\n}\r\n\r\nfunction intersectEdge2Arc(edge, arc) {\r\n return edge.isSegment() ? intersectSegment2Arc(edge.shape, arc) : intersectArc2Arc(edge.shape, arc);\r\n}\r\n\r\nfunction intersectEdge2Line(edge, line) {\r\n return edge.isSegment() ? intersectSegment2Line(edge.shape, line) : intersectLine2Arc(line, edge.shape);\r\n}\r\n\r\nfunction intersectEdge2Circle(edge, circle) {\r\n return edge.isSegment() ? intersectSegment2Circle(edge.shape, circle) : intersectArc2Circle(edge.shape, circle);\r\n}\r\n\r\nfunction intersectSegment2Polygon(segment, polygon) {\r\n let ip = [];\r\n\r\n for (let edge of polygon.edges) {\r\n for (let pt of intersectEdge2Segment(edge, segment)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n return ip;\r\n}\r\n\r\nfunction intersectArc2Polygon(arc, polygon) {\r\n let ip = [];\r\n\r\n for (let edge of polygon.edges) {\r\n for (let pt of intersectEdge2Arc(edge, arc)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n return ip;\r\n}\r\n\r\nfunction intersectLine2Polygon(line, polygon) {\r\n let ip = [];\r\n\r\n if (polygon.isEmpty()) {\r\n return ip;\r\n }\r\n\r\n for (let edge of polygon.edges) {\r\n for (let pt of intersectEdge2Line(edge, line)) {\r\n if (!ptInIntPoints(pt, ip)) {\r\n ip.push(pt);\r\n }\r\n }\r\n }\r\n\r\n return line.sortPoints(ip);\r\n}\r\n\r\nfunction intersectCircle2Polygon(circle, polygon) {\r\n let ip = [];\r\n\r\n if (polygon.isEmpty()) {\r\n return ip;\r\n }\r\n\r\n for (let edge of polygon.edges) {\r\n for (let pt of intersectEdge2Circle(edge, circle)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n return ip;\r\n}\r\n\r\nfunction intersectEdge2Edge(edge1, edge2) {\r\n const shape1 = edge1.shape;\r\n const shape2 = edge2.shape;\r\n return edge1.isSegment() ?\r\n (edge2.isSegment() ? intersectSegment2Segment(shape1, shape2) : intersectSegment2Arc(shape1, shape2)) :\r\n (edge2.isSegment() ? intersectSegment2Arc(shape2, shape1) : intersectArc2Arc(shape1, shape2));\r\n}\r\n\r\nfunction intersectEdge2Polygon(edge, polygon) {\r\n let ip = [];\r\n\r\n if (polygon.isEmpty() || edge.shape.box.not_intersect(polygon.box)) {\r\n return ip;\r\n }\r\n\r\n let resp_edges = polygon.edges.search(edge.shape.box);\r\n\r\n for (let resp_edge of resp_edges) {\r\n for (let pt of intersectEdge2Edge(edge, resp_edge)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n return ip;\r\n}\r\n\r\nfunction intersectPolygon2Polygon(polygon1, polygon2) {\r\n let ip = [];\r\n\r\n if (polygon1.isEmpty() || polygon2.isEmpty()) {\r\n return ip;\r\n }\r\n\r\n if (polygon1.box.not_intersect(polygon2.box)) {\r\n return ip;\r\n }\r\n\r\n for (let edge1 of polygon1.edges) {\r\n for (let pt of intersectEdge2Polygon(edge1, polygon2)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n return ip;\r\n}\r\n\r\nfunction intersectShape2Polygon(shape, polygon) {\r\n if (shape instanceof Flatten.Line) {\r\n return intersectLine2Polygon(shape, polygon);\r\n }\r\n else if (shape instanceof Flatten.Segment) {\r\n return intersectSegment2Polygon(shape, polygon);\r\n }\r\n else if (shape instanceof Flatten.Arc) {\r\n return intersectArc2Polygon(shape, polygon);\r\n }\r\n else {\r\n return [];\r\n }\r\n}\r\n\r\nfunction ptInIntPoints(new_pt, ip) {\r\n return ip.some( pt => pt.equalTo(new_pt) )\r\n}\r\n\r\n/**\r\n * Class Multiline represent connected path of [edges]{@link Flatten.Edge}, where each edge may be\r\n * [segment]{@link Flatten.Segment}, [arc]{@link Flatten.Arc}, [line]{@link Flatten.Line} or [ray]{@link Flatten.Ray}\r\n */\r\nclass Multiline extends LinkedList {\r\n constructor(...args) {\r\n super();\r\n\r\n if (args.length === 0) {\r\n return;\r\n }\r\n\r\n if (args.length == 1) {\r\n if (args[0] instanceof Array) {\r\n let shapes = args[0];\r\n if (shapes.length == 0)\r\n return;\r\n\r\n // TODO: more strict validation:\r\n // there may be only one line\r\n // only first and last may be rays\r\n let validShapes = shapes.every((shape) => {\r\n return shape instanceof Flatten.Segment ||\r\n shape instanceof Flatten.Arc ||\r\n shape instanceof Flatten.Ray ||\r\n shape instanceof Flatten.Line\r\n });\r\n\r\n for (let shape of shapes) {\r\n let edge = new Flatten.Edge(shape);\r\n this.append(edge);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * (Getter) Return array of edges\r\n * @returns {Edge[]}\r\n */\r\n get edges() {\r\n return [...this];\r\n }\r\n\r\n /**\r\n * (Getter) Return bounding box of the multiline\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return this.edges.reduce( (acc,edge) => acc = acc.merge(edge.box), new Flatten.Box() );\r\n }\r\n\r\n /**\r\n * (Getter) Returns array of vertices\r\n * @returns {Point[]}\r\n */\r\n get vertices() {\r\n let v = this.edges.map(edge => edge.start);\r\n v.push(this.last.end);\r\n return v;\r\n }\r\n\r\n /**\r\n * Return new cloned instance of Multiline\r\n * @returns {Multiline}\r\n */\r\n clone() {\r\n return new Multiline(this.toShapes());\r\n }\r\n\r\n /**\r\n * Split edge and add new vertex, return new edge inserted\r\n * @param {Point} pt - point on edge that will be added as new vertex\r\n * @param {Edge} edge - edge to split\r\n * @returns {Edge}\r\n */\r\n addVertex(pt, edge) {\r\n let shapes = edge.shape.split(pt);\r\n // if (shapes.length < 2) return;\r\n\r\n if (shapes[0] === null) // point incident to edge start vertex, return previous edge\r\n return edge.prev;\r\n\r\n if (shapes[1] === null) // point incident to edge end vertex, return edge itself\r\n return edge;\r\n\r\n let newEdge = new Flatten.Edge(shapes[0]);\r\n let edgeBefore = edge.prev;\r\n\r\n /* Insert first split edge into linked list after edgeBefore */\r\n this.insert(newEdge, edgeBefore); // edge.face ?\r\n\r\n // Update edge shape with second split edge keeping links\r\n edge.shape = shapes[1];\r\n\r\n return newEdge;\r\n }\r\n\r\n /**\r\n * Split edges of multiline with intersection points and return mutated multiline\r\n * @param {Point[]} ip - array of points to be added as new vertices\r\n * @returns {Multiline}\r\n */\r\n split(ip) {\r\n for (let pt of ip) {\r\n let edge = this.findEdgeByPoint(pt);\r\n this.addVertex(pt, edge);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns edge which contains given point\r\n * @param {Point} pt\r\n * @returns {Edge}\r\n */\r\n findEdgeByPoint(pt) {\r\n let edgeFound;\r\n for (let edge of this) {\r\n if (edge.shape.contains(pt)) {\r\n edgeFound = edge;\r\n break;\r\n }\r\n }\r\n return edgeFound;\r\n }\r\n\r\n /**\r\n * Returns new multiline translated by vector vec\r\n * @param {Vector} vec\r\n * @returns {Multiline}\r\n */\r\n translate(vec) {\r\n return new Multiline(this.edges.map( edge => edge.shape.translate(vec)));\r\n }\r\n\r\n /**\r\n * Return new multiline rotated by given angle around given point\r\n * If point omitted, rotate around origin (0,0)\r\n * Positive value of angle defines rotation counter clockwise, negative - clockwise\r\n * @param {number} angle - rotation angle in radians\r\n * @param {Point} center - rotation center, default is (0,0)\r\n * @returns {Multiline} - new rotated polygon\r\n */\r\n rotate(angle = 0, center = new Flatten.Point()) {\r\n return new Multiline(this.edges.map( edge => edge.shape.rotate(angle, center) ));\r\n }\r\n\r\n /**\r\n * Return new multiline transformed using affine transformation matrix\r\n * Method does not support unbounded shapes\r\n * @param {Matrix} matrix - affine transformation matrix\r\n * @returns {Multiline} - new multiline\r\n */\r\n transform(matrix = new Flatten.Matrix()) {\r\n return new Multiline(this.edges.map( edge => edge.shape.transform(matrix)));\r\n }\r\n\r\n /**\r\n * Transform multiline into array of shapes\r\n * @returns {Shape[]}\r\n */\r\n toShapes() {\r\n return this.edges.map(edge => edge.shape.clone())\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return this.edges.map(edge => edge.toJSON());\r\n }\r\n\r\n /**\r\n * Return string to draw multiline in svg\r\n * @param attrs - an object with attributes for svg path element,\r\n * like \"stroke\", \"strokeWidth\", \"fill\", \"fillRule\", \"fillOpacity\"\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\", fill:\"lightcyan\", fillRule:\"evenodd\", fillOpacity: \"1\"\r\n * TODO: support semi-infinite Ray and infinite Line\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let {stroke, strokeWidth, fill, fillRule, fillOpacity, id, className} = attrs;\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n\r\n let svgStr = `\\n\\n`;\r\n\r\n return svgStr;\r\n }\r\n}\r\n\r\nFlatten.Multiline = Multiline;\r\n\r\n/**\r\n * Shortcut function to create multiline\r\n * @param args\r\n */\r\nconst multiline = (...args) => new Flatten.Multiline(...args);\r\nFlatten.multiline = multiline;\r\n\r\n/**\r\n * @module RayShoot\r\n */\r\n/**\r\n * Implements ray shooting algorithm. Returns relation between point and polygon: inside, outside or boundary\r\n * @param {Polygon} polygon - polygon to test\r\n * @param {Point} point - point to test\r\n * @returns {INSIDE|OUTSIDE|BOUNDARY}\r\n */\r\nfunction ray_shoot(polygon, point) {\r\n let contains = undefined;\r\n\r\n // 1. Quick reject\r\n // if (polygon.box.not_intersect(point.box)) {\r\n // return Flatten.OUTSIDE;\r\n // }\r\n\r\n let ray = new Flatten.Ray(point);\r\n let line = new Flatten.Line(ray.pt, ray.norm);\r\n\r\n // 2. Locate relevant edges of the polygon\r\n const searchBox = new Flatten.Box(\r\n ray.box.xmin-Flatten.DP_TOL, ray.box.ymin-Flatten.DP_TOL,\r\n ray.box.xmax, ray.box.ymax+Flatten.DP_TOL\r\n );\r\n\r\n if (polygon.box.not_intersect(searchBox)) {\r\n return Flatten.OUTSIDE;\r\n }\r\n\r\n let resp_edges = polygon.edges.search(searchBox);\r\n\r\n if (resp_edges.length == 0) {\r\n return Flatten.OUTSIDE;\r\n }\r\n\r\n // 2.5 Check if boundary\r\n for (let edge of resp_edges) {\r\n if (edge.shape.contains(point)) {\r\n return Flatten.BOUNDARY;\r\n }\r\n }\r\n\r\n // 3. Calculate intersections\r\n let intersections = [];\r\n for (let edge of resp_edges) {\r\n for (let ip of ray.intersect(edge.shape)) {\r\n\r\n // If intersection is equal to query point then point lays on boundary\r\n if (ip.equalTo(point)) {\r\n return Flatten.BOUNDARY;\r\n }\r\n\r\n intersections.push({\r\n pt: ip,\r\n edge: edge\r\n });\r\n }\r\n }\r\n\r\n // 4. Sort intersection in x-ascending order\r\n intersections.sort((i1, i2) => {\r\n if (LT(i1.pt.x, i2.pt.x)) {\r\n return -1;\r\n }\r\n if (GT(i1.pt.x, i2.pt.x)) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n\r\n // 5. Count real intersections, exclude touching\r\n let counter = 0;\r\n\r\n for (let i = 0; i < intersections.length; i++) {\r\n let intersection = intersections[i];\r\n if (intersection.pt.equalTo(intersection.edge.shape.start)) {\r\n /* skip same point between same edges if already counted */\r\n if (i > 0 && intersection.pt.equalTo(intersections[i - 1].pt) &&\r\n intersection.edge.prev === intersections[i - 1].edge) {\r\n continue;\r\n }\r\n let prev_edge = intersection.edge.prev;\r\n while (EQ_0(prev_edge.length)) {\r\n prev_edge = prev_edge.prev;\r\n }\r\n let prev_tangent = prev_edge.shape.tangentInEnd();\r\n let prev_point = intersection.pt.translate(prev_tangent);\r\n\r\n let cur_tangent = intersection.edge.shape.tangentInStart();\r\n let cur_point = intersection.pt.translate(cur_tangent);\r\n\r\n let prev_on_the_left = prev_point.leftTo(line);\r\n let cur_on_the_left = cur_point.leftTo(line);\r\n\r\n if ((prev_on_the_left && !cur_on_the_left) || (!prev_on_the_left && cur_on_the_left)) {\r\n counter++;\r\n }\r\n } else if (intersection.pt.equalTo(intersection.edge.shape.end)) {\r\n /* skip same point between same edges if already counted */\r\n if (i > 0 && intersection.pt.equalTo(intersections[i - 1].pt) &&\r\n intersection.edge.next === intersections[i - 1].edge) {\r\n continue;\r\n }\r\n let next_edge = intersection.edge.next;\r\n while (EQ_0(next_edge.length)) {\r\n next_edge = next_edge.next;\r\n }\r\n let next_tangent = next_edge.shape.tangentInStart();\r\n let next_point = intersection.pt.translate(next_tangent);\r\n\r\n let cur_tangent = intersection.edge.shape.tangentInEnd();\r\n let cur_point = intersection.pt.translate(cur_tangent);\r\n\r\n let next_on_the_left = next_point.leftTo(line);\r\n let cur_on_the_left = cur_point.leftTo(line);\r\n\r\n if ((next_on_the_left && !cur_on_the_left) || (!next_on_the_left && cur_on_the_left)) {\r\n counter++;\r\n }\r\n } else { /* intersection point is not a coincident with a vertex */\r\n if (intersection.edge.shape instanceof Flatten.Segment) {\r\n counter++;\r\n } else {\r\n /* Check if ray does not touch the curve in the extremal (top or bottom) point */\r\n let box = intersection.edge.shape.box;\r\n if (!(EQ(intersection.pt.y, box.ymin) ||\r\n EQ(intersection.pt.y, box.ymax))) {\r\n counter++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 6. Odd or even?\r\n contains = counter % 2 == 1 ? INSIDE : OUTSIDE;\r\n\r\n return contains;\r\n}\r\n\r\n/*\r\n Calculate relationship between two shapes and return result in the form of\r\n Dimensionally Extended nine-Intersection Matrix (https://en.wikipedia.org/wiki/DE-9IM)\r\n */\r\n\r\n/**\r\n * Returns true if shapes are topologically equal: their interiors intersect and\r\n * no part of the interior or boundary of one geometry intersects the exterior of the other\r\n * @param shape1\r\n * @param shape2\r\n * @returns {boolean}\r\n */\r\nfunction equal(shape1, shape2) {\r\n return relate(shape1, shape2).equal();\r\n}\r\n\r\n/**\r\n * Returns true if shapes have at least one point in common, same as \"not disjoint\"\r\n * @param shape1\r\n * @param shape2\r\n * @returns {boolean}\r\n */\r\nfunction intersect$1(shape1, shape2) {\r\n return relate(shape1, shape2).intersect();\r\n}\r\n\r\n/**\r\n * Returns true if shapes have at least one point in common, but their interiors do not intersect\r\n * @param shape1\r\n * @param shape2\r\n * @returns {boolean}\r\n */\r\nfunction touch(shape1, shape2) {\r\n return relate(shape1, shape2).touch();\r\n}\r\n\r\n/**\r\n * Returns true if shapes have no points in common neither in interior nor in boundary\r\n * @param shape1\r\n * @param shape2\r\n * @returns {boolean}\r\n */\r\nfunction disjoint(shape1, shape2) {\r\n return !intersect$1(shape1, shape2);\r\n}\r\n\r\n/**\r\n * Returns true shape1 lies in the interior of shape2\r\n * @param shape1\r\n * @param shape2\r\n * @returns {boolean}\r\n */\r\nfunction inside(shape1, shape2) {\r\n return relate(shape1, shape2).inside();\r\n}\r\n\r\n/**\r\n * Returns true if every point in shape1 lies in the interior or on the boundary of shape2\r\n * @param shape1\r\n * @param shape2\r\n * @returns {boolean}\r\n */\r\nfunction covered(shape1, shape2) {\r\n return relate(shape1, shape2).covered();\r\n}\r\n\r\n/**\r\n * Returns true shape1's interior contains shape2
\r\n * Same as inside(shape2, shape1)\r\n * @param shape1\r\n * @param shape2\r\n * @returns {boolean}\r\n */\r\nfunction contain(shape1, shape2) {\r\n return inside(shape2, shape1);\r\n}\r\n\r\n/**\r\n * Returns true shape1's cover shape2, same as shape2 covered by shape1\r\n * @param shape1\r\n * @param shape2\r\n * @returns {boolean}\r\n */\r\nfunction cover(shape1, shape2) {\r\n return covered(shape2, shape1);\r\n}\r\n\r\n/**\r\n * Returns relation between two shapes as intersection 3x3 matrix, where each\r\n * element contains relevant intersection as array of shapes.\r\n * If there is no intersection, element contains empty array\r\n * If intersection is irrelevant it left undefined. (For example, intersection\r\n * between two exteriors is usually irrelevant)\r\n * @param shape1\r\n * @param shape2\r\n * @returns {DE9IM}\r\n */\r\nfunction relate(shape1, shape2) {\r\n if (shape1 instanceof Flatten.Line && shape2 instanceof Flatten.Line) {\r\n return relateLine2Line(shape1, shape2);\r\n }\r\n else if (shape1 instanceof Flatten.Line && shape2 instanceof Flatten.Circle) {\r\n return relateLine2Circle(shape1, shape2);\r\n }\r\n else if (shape1 instanceof Flatten.Line && shape2 instanceof Flatten.Box) {\r\n return relateLine2Box(shape1, shape2);\r\n }\r\n else if ( shape1 instanceof Flatten.Line && shape2 instanceof Flatten.Polygon) {\r\n return relateLine2Polygon(shape1, shape2);\r\n }\r\n else if ( (shape1 instanceof Flatten.Segment || shape1 instanceof Flatten.Arc) && shape2 instanceof Flatten.Polygon) {\r\n return relateShape2Polygon(shape1, shape2);\r\n }\r\n else if ( (shape1 instanceof Flatten.Segment || shape1 instanceof Flatten.Arc) &&\r\n (shape2 instanceof Flatten.Circle || shape2 instanceof Flatten.Box) ) {\r\n return relateShape2Polygon(shape1, new Flatten.Polygon(shape2));\r\n }\r\n else if (shape1 instanceof Flatten.Polygon && shape2 instanceof Flatten.Polygon) {\r\n return relatePolygon2Polygon(shape1, shape2);\r\n }\r\n else if ((shape1 instanceof Flatten.Circle || shape1 instanceof Flatten.Box) &&\r\n (shape2 instanceof Flatten.Circle || shape2 instanceof Flatten.Box)) {\r\n return relatePolygon2Polygon(new Flatten.Polygon(shape1), new Flatten.Polygon(shape2));\r\n }\r\n else if ((shape1 instanceof Flatten.Circle || shape1 instanceof Flatten.Box) && shape2 instanceof Flatten.Polygon) {\r\n return relatePolygon2Polygon(new Flatten.Polygon(shape1), shape2);\r\n }\r\n else if (shape1 instanceof Flatten.Polygon && (shape2 instanceof Flatten.Circle || shape2 instanceof Flatten.Box)) {\r\n return relatePolygon2Polygon(shape1, new Flatten.Polygon(shape2));\r\n }\r\n}\r\n\r\nfunction relateLine2Line(line1, line2) {\r\n let denim = new DE9IM();\r\n let ip = intersectLine2Line(line1, line2);\r\n if (ip.length === 0) { // parallel or equal ?\r\n if (line1.contains(line2.pt) && line2.contains(line1.pt)) {\r\n denim.I2I = [line1]; // equal 'T.F...F..' - no boundary\r\n denim.I2E = [];\r\n denim.E2I = [];\r\n }\r\n else { // parallel - disjoint 'FFTFF*T**'\r\n denim.I2I = [];\r\n denim.I2E = [line1];\r\n denim.E2I = [line2];\r\n }\r\n }\r\n else { // intersect 'T********'\r\n denim.I2I = ip;\r\n denim.I2E = line1.split(ip);\r\n denim.E2I = line2.split(ip);\r\n }\r\n return denim;\r\n}\r\n\r\nfunction relateLine2Circle(line,circle) {\r\n let denim = new DE9IM();\r\n let ip = intersectLine2Circle(line, circle);\r\n if (ip.length === 0) {\r\n denim.I2I = [];\r\n denim.I2B = [];\r\n denim.I2E = [line];\r\n denim.E2I = [circle];\r\n }\r\n else if (ip.length === 1) {\r\n denim.I2I = [];\r\n denim.I2B = ip;\r\n denim.I2E = line.split(ip);\r\n\r\n denim.E2I = [circle];\r\n }\r\n else { // ip.length == 2\r\n let multiline = new Multiline([line]);\r\n let ip_sorted = line.sortPoints(ip);\r\n multiline.split(ip_sorted);\r\n let splitShapes = multiline.toShapes();\r\n\r\n denim.I2I = [splitShapes[1]];\r\n denim.I2B = ip_sorted;\r\n denim.I2E = [splitShapes[0], splitShapes[2]];\r\n\r\n denim.E2I = new Flatten.Polygon([circle.toArc()]).cut(multiline);\r\n }\r\n\r\n return denim;\r\n}\r\n\r\nfunction relateLine2Box(line, box) {\r\n let denim = new DE9IM();\r\n let ip = intersectLine2Box(line, box);\r\n if (ip.length === 0) {\r\n denim.I2I = [];\r\n denim.I2B = [];\r\n denim.I2E = [line];\r\n\r\n denim.E2I = [box];\r\n }\r\n else if (ip.length === 1) {\r\n denim.I2I = [];\r\n denim.I2B = ip;\r\n denim.I2E = line.split(ip);\r\n\r\n denim.E2I = [box];\r\n }\r\n else { // ip.length == 2\r\n let multiline = new Multiline([line]);\r\n let ip_sorted = line.sortPoints(ip);\r\n multiline.split(ip_sorted);\r\n let splitShapes = multiline.toShapes();\r\n\r\n /* Are two intersection points on the same segment of the box boundary ? */\r\n if (box.toSegments().some( segment => segment.contains(ip[0]) && segment.contains(ip[1]) )) {\r\n denim.I2I = []; // case of touching\r\n denim.I2B = [splitShapes[1]];\r\n denim.I2E = [splitShapes[0], splitShapes[2]];\r\n\r\n denim.E2I = [box];\r\n }\r\n else { // case of intersection\r\n denim.I2I = [splitShapes[1]]; // [segment(ip[0], ip[1])];\r\n denim.I2B = ip_sorted;\r\n denim.I2E = [splitShapes[0], splitShapes[2]];\r\n\r\n denim.E2I = new Flatten.Polygon(box.toSegments()).cut(multiline);\r\n }\r\n }\r\n return denim;\r\n}\r\n\r\nfunction relateLine2Polygon(line, polygon) {\r\n let denim = new DE9IM();\r\n let ip = intersectLine2Polygon(line, polygon);\r\n let multiline = new Multiline([line]);\r\n let ip_sorted = ip.length > 0 ? ip.slice() : line.sortPoints(ip);\r\n\r\n multiline.split(ip_sorted);\r\n\r\n [...multiline].forEach(edge => edge.setInclusion(polygon));\r\n\r\n denim.I2I = [...multiline].filter(edge => edge.bv === Flatten.INSIDE).map(edge => edge.shape);\r\n denim.I2B = [...multiline].slice(1).map( (edge) => edge.bv === Flatten.BOUNDARY ? edge.shape : edge.shape.start );\r\n denim.I2E = [...multiline].filter(edge => edge.bv === Flatten.OUTSIDE).map(edge => edge.shape);\r\n\r\n denim.E2I = polygon.cut(multiline);\r\n\r\n return denim;\r\n}\r\n\r\nfunction relateShape2Polygon(shape, polygon) {\r\n let denim = new DE9IM();\r\n let ip = intersectShape2Polygon(shape, polygon);\r\n let ip_sorted = ip.length > 0 ? ip.slice() : shape.sortPoints(ip);\r\n\r\n let multiline = new Multiline([shape]);\r\n multiline.split(ip_sorted);\r\n\r\n [...multiline].forEach(edge => edge.setInclusion(polygon));\r\n\r\n denim.I2I = [...multiline].filter(edge => edge.bv === Flatten.INSIDE).map(edge => edge.shape);\r\n denim.I2B = [...multiline].slice(1).map( (edge) => edge.bv === Flatten.BOUNDARY ? edge.shape : edge.shape.start );\r\n denim.I2E = [...multiline].filter(edge => edge.bv === Flatten.OUTSIDE).map(edge => edge.shape);\r\n\r\n\r\n denim.B2I = [];\r\n denim.B2B = [];\r\n denim.B2E = [];\r\n for (let pt of [shape.start, shape.end]) {\r\n switch (ray_shoot(polygon, pt)) {\r\n case Flatten.INSIDE:\r\n denim.B2I.push(pt);\r\n break;\r\n case Flatten.BOUNDARY:\r\n denim.B2B.push(pt);\r\n break;\r\n case Flatten.OUTSIDE:\r\n denim.B2E.push(pt);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n // denim.E2I TODO: calculate, not clear what is expected result\r\n\r\n return denim;\r\n}\r\n\r\nfunction relatePolygon2Polygon(polygon1, polygon2) {\r\n let denim = new DE9IM();\r\n\r\n let [ip_sorted1, ip_sorted2] = calculateIntersections(polygon1, polygon2);\r\n let boolean_intersection = intersect(polygon1, polygon2);\r\n let boolean_difference1 = subtract(polygon1, polygon2);\r\n let boolean_difference2 = subtract(polygon2, polygon1);\r\n let [inner_clip_shapes1, inner_clip_shapes2] = innerClip(polygon1, polygon2);\r\n let outer_clip_shapes1 = outerClip(polygon1, polygon2);\r\n let outer_clip_shapes2 = outerClip(polygon2, polygon1);\r\n\r\n denim.I2I = boolean_intersection.isEmpty() ? [] : [boolean_intersection];\r\n denim.I2B = inner_clip_shapes2;\r\n denim.I2E = boolean_difference1.isEmpty() ? [] : [boolean_difference1];\r\n\r\n denim.B2I = inner_clip_shapes1;\r\n denim.B2B = ip_sorted1;\r\n denim.B2E = outer_clip_shapes1;\r\n\r\n denim.E2I = boolean_difference2.isEmpty() ? [] : [boolean_difference2];\r\n denim.E2B = outer_clip_shapes2;\r\n // denim.E2E not relevant meanwhile\r\n\r\n return denim;\r\n}\r\n\r\nvar Relations = /*#__PURE__*/Object.freeze({\r\n equal: equal,\r\n intersect: intersect$1,\r\n touch: touch,\r\n disjoint: disjoint,\r\n inside: inside,\r\n covered: covered,\r\n contain: contain,\r\n cover: cover,\r\n relate: relate\r\n});\r\n\r\n/**\r\n * Class representing an affine transformation 3x3 matrix:\r\n * \r\n * [ a c tx\r\n * A = b d ty\r\n * 0 0 1 ]\r\n *
\r\n * If parameters omitted, construct identity matrix a = 1, d = 1\r\n * @param {number} a - position(0,0) sx*cos(alpha)\r\n * @param {number} b - position (0,1) sx*sin(alpha)\r\n * @param {number} c - position (1,0) -sy*sin(alpha)\r\n * @param {number} d - position (1,1) sy*cos(alpha)\r\n * @param {number} tx - position (2,0) translation by x\r\n * @param {number} ty - position (2,1) translation by y\r\n */\r\n constructor(a = 1, b = 0, c = 0, d = 1, tx = 0, ty = 0) {\r\n this.a = a;\r\n this.b = b;\r\n this.c = c;\r\n this.d = d;\r\n this.tx = tx;\r\n this.ty = ty;\r\n }\r\n\r\n /**\r\n * Return new cloned instance of matrix\r\n * @return {Matrix}\r\n **/\r\n clone() {\r\n return new Matrix(this.a, this.b, this.c, this.d, this.tx, this.ty);\r\n };\r\n\r\n /**\r\n * Transform vector [x,y] using transformation matrix.
\r\n * Vector [x,y] is an abstract array[2] of numbers and not a FlattenJS object
\r\n * The result is also an abstract vector [x',y'] = A * [x,y]:\r\n * \r\n * [x' [ ax + by + tx\r\n * y' = cx + dy + ty\r\n * 1] 1 ]\r\n *
\r\n * @param {number[]} vector - array[2] of numbers\r\n * @returns {number[]} transformation result - array[2] of numbers\r\n */\r\n transform(vector) {\r\n return [\r\n vector[0] * this.a + vector[1] * this.c + this.tx,\r\n vector[0] * this.b + vector[1] * this.d + this.ty\r\n ]\r\n };\r\n\r\n /**\r\n * Returns result of multiplication of this matrix by other matrix\r\n * @param {Matrix} other_matrix - matrix to multiply by\r\n * @returns {Matrix}\r\n */\r\n multiply(other_matrix) {\r\n return new Matrix(\r\n this.a * other_matrix.a + this.c * other_matrix.b,\r\n this.b * other_matrix.a + this.d * other_matrix.b,\r\n this.a * other_matrix.c + this.c * other_matrix.d,\r\n this.b * other_matrix.c + this.d * other_matrix.d,\r\n this.a * other_matrix.tx + this.c * other_matrix.ty + this.tx,\r\n this.b * other_matrix.tx + this.d * other_matrix.ty + this.ty\r\n )\r\n };\r\n\r\n /**\r\n * Return new matrix as a result of multiplication of the current matrix\r\n * by the matrix(1,0,0,1,tx,ty)\r\n * @param {number} tx - translation by x\r\n * @param {number} ty - translation by y\r\n * @returns {Matrix}\r\n */\r\n translate(...args) {\r\n let tx, ty;\r\n if (args.length == 1 && (args[0] instanceof Flatten.Vector)) {\r\n tx = args[0].x;\r\n ty = args[0].y;\r\n } else if (args.length == 2 && typeof (args[0]) == \"number\" && typeof (args[1]) == \"number\") {\r\n tx = args[0];\r\n ty = args[1];\r\n } else {\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n return this.multiply(new Matrix(1, 0, 0, 1, tx, ty))\r\n };\r\n\r\n /**\r\n * Return new matrix as a result of multiplication of the current matrix\r\n * by the matrix that defines rotation by given angle (in radians) around\r\n * point (0,0) in counter clockwise direction\r\n * @param {number} angle - angle in radians\r\n * @returns {Matrix}\r\n */\r\n rotate(angle) {\r\n let cos = Math.cos(angle);\r\n let sin = Math.sin(angle);\r\n return this.multiply(new Matrix(cos, sin, -sin, cos, 0, 0));\r\n };\r\n\r\n /**\r\n * Return new matrix as a result of multiplication of the current matrix\r\n * by the matrix (sx,0,0,sy,0,0) that defines scaling\r\n * @param {number} sx\r\n * @param {number} sy\r\n * @returns {Matrix}\r\n */\r\n scale(sx, sy) {\r\n return this.multiply(new Matrix(sx, 0, 0, sy, 0, 0));\r\n };\r\n\r\n /**\r\n * Returns true if two matrix are equal parameter by parameter\r\n * @param {Matrix} matrix - other matrix\r\n * @returns {boolean} true if equal, false otherwise\r\n */\r\n equalTo(matrix) {\r\n if (!Flatten.Utils.EQ(this.tx, matrix.tx)) return false;\r\n if (!Flatten.Utils.EQ(this.ty, matrix.ty)) return false;\r\n if (!Flatten.Utils.EQ(this.a, matrix.a)) return false;\r\n if (!Flatten.Utils.EQ(this.b, matrix.b)) return false;\r\n if (!Flatten.Utils.EQ(this.c, matrix.c)) return false;\r\n if (!Flatten.Utils.EQ(this.d, matrix.d)) return false;\r\n return true;\r\n };\r\n}\r\nFlatten.Matrix = Matrix;\r\n/**\r\n * Function to create matrix equivalent to \"new\" constructor\r\n * @param args\r\n */\r\nconst matrix = (...args) => new Flatten.Matrix(...args);\r\nFlatten.matrix = matrix;\r\n\r\n/**\r\n * Created by Alex Bol on 4/1/2017.\r\n */\r\n\r\n/**\r\n * Interval is a pair of numbers or a pair of any comparable objects on which may be defined predicates\r\n * *equal*, *less* and method *max(p1, p1)* that returns maximum in a pair.\r\n * When interval is an object rather than pair of numbers, this object should have properties *low*, *high*, *max*\r\n * and implement methods *less_than(), equal_to(), intersect(), not_intersect(), clone(), output()*.\r\n * Two static methods *comparable_max(), comparable_less_than()* define how to compare values in pair.
\r\n * This interface is described in typescript definition file *index.d.ts*\r\n *\r\n * Axis aligned rectangle is an example of such interval.\r\n * We may look at rectangle as an interval between its low left and top right corners.\r\n * See **Box** class in [flatten-js](https://github.com/alexbol99/flatten-js) library as the example\r\n * of Interval interface implementation\r\n * @type {Interval}\r\n */\r\nconst Interval = class Interval {\r\n /**\r\n * Accept two comparable values and creates new instance of interval\r\n * Predicate Interval.comparable_less(low, high) supposed to return true on these values\r\n * @param low\r\n * @param high\r\n */\r\n constructor(low, high) {\r\n this.low = low;\r\n this.high = high;\r\n }\r\n\r\n /**\r\n * Clone interval\r\n * @returns {Interval}\r\n */\r\n clone() {\r\n return new Interval(this.low, this.high);\r\n }\r\n\r\n /**\r\n * Propery max returns clone of this interval\r\n * @returns {Interval}\r\n */\r\n get max() {\r\n return this.clone(); // this.high;\r\n }\r\n\r\n /**\r\n * Predicate returns true is this interval less than other interval\r\n * @param other_interval\r\n * @returns {boolean}\r\n */\r\n less_than(other_interval) {\r\n return this.low < other_interval.low ||\r\n this.low == other_interval.low && this.high < other_interval.high;\r\n }\r\n\r\n /**\r\n * Predicate returns true is this interval equals to other interval\r\n * @param other_interval\r\n * @returns {boolean}\r\n */\r\n equal_to(other_interval) {\r\n return this.low == other_interval.low && this.high == other_interval.high;\r\n }\r\n\r\n /**\r\n * Predicate returns true if this interval intersects other interval\r\n * @param other_interval\r\n * @returns {boolean}\r\n */\r\n intersect(other_interval) {\r\n return !this.not_intersect(other_interval);\r\n }\r\n\r\n /**\r\n * Predicate returns true if this interval does not intersect other interval\r\n * @param other_interval\r\n * @returns {boolean}\r\n */\r\n not_intersect(other_interval) {\r\n return (this.high < other_interval.low || other_interval.high < this.low);\r\n }\r\n\r\n /**\r\n * Returns new interval merged with other interval\r\n * @param {Interval} interval - Other interval to merge with\r\n * @returns {Interval}\r\n */\r\n merge(other_interval) {\r\n return new Interval(\r\n this.low === undefined ? other_interval.low : Math.min(this.low, other_interval.low),\r\n this.high === undefined ? other_interval.high : Math.max(this.high, other_interval.high)\r\n );\r\n }\r\n\r\n /**\r\n * Returns how key should return\r\n */\r\n output() {\r\n return [this.low, this.high];\r\n }\r\n\r\n /**\r\n * Function returns maximum between two comparable values\r\n * @param interval1\r\n * @param interval2\r\n * @returns {Interval}\r\n */\r\n static comparable_max(interval1, interval2) {\r\n return interval1.merge(interval2);\r\n }\r\n\r\n /**\r\n * Predicate returns true if first value less than second value\r\n * @param val1\r\n * @param val2\r\n * @returns {boolean}\r\n */\r\n static comparable_less_than(val1, val2 ) {\r\n return val1 < val2;\r\n }\r\n};\r\n\r\n/**\r\n * Created by Alex Bol on 3/28/2017.\r\n */\r\n\r\n// module.exports = {\r\n// RB_TREE_COLOR_RED: 0,\r\n// RB_TREE_COLOR_BLACK: 1\r\n// };\r\n\r\nconst RB_TREE_COLOR_RED = 0;\r\nconst RB_TREE_COLOR_BLACK = 1;\r\n\r\n/**\r\n * Created by Alex Bol on 4/1/2017.\r\n */\r\n\r\nclass Node {\r\n constructor(key = undefined, value = undefined,\r\n left = null, right = null, parent = null, color = RB_TREE_COLOR_BLACK) {\r\n this.left = left; // reference to left child node\r\n this.right = right; // reference to right child node\r\n this.parent = parent; // reference to parent node\r\n this.color = color;\r\n\r\n this.item = {key: key, value: value}; // key is supposed to be instance of Interval\r\n\r\n /* If not, this should by an array of two numbers */\r\n if (key && key instanceof Array && key.length == 2) {\r\n if (!Number.isNaN(key[0]) && !Number.isNaN(key[1])) {\r\n this.item.key = new Interval(Math.min(key[0], key[1]), Math.max(key[0], key[1]));\r\n }\r\n }\r\n\r\n this.max = this.item.key ? this.item.key.max : undefined;\r\n }\r\n\r\n isNil() {\r\n return (this.item.key === undefined && this.item.value === undefined &&\r\n this.left === null && this.right === null && this.color === RB_TREE_COLOR_BLACK);\r\n }\r\n\r\n less_than(other_node) {\r\n // if tree stores only keys\r\n if (this.item.value === this.item.key && other_node.item.value === other_node.item.key) {\r\n return this.item.key.less_than(other_node.item.key);\r\n }\r\n else { // if tree stores keys and values\r\n let value_less_than = this.item.value && other_node.item.value && this.item.value.less_than ? this.item.value.less_than(other_node.item.value) :\r\n this.item.value < other_node.item.value;\r\n return this.item.key.less_than(other_node.item.key) ||\r\n this.item.key.equal_to((other_node.item.key)) && value_less_than;\r\n }\r\n\r\n // if (this.item.value && other_node.item.value) {\r\n // let item_less_than = this.item.value.less_than ? this.item.value.less_than(other_node.item.value) :\r\n // this.item.value < other_node.item.value;\r\n // return this.item.key.less_than(other_node.item.key) ||\r\n // this.item.key.equal_to((other_node.item.key)) && item_less_than;\r\n // }\r\n // else {\r\n // return this.item.key.less_than(other_node.item.key);\r\n // }\r\n }\r\n\r\n equal_to(other_node) {\r\n // if tree stores only keys\r\n if (this.item.value === this.item.key && other_node.item.value === other_node.item.key) {\r\n return this.item.key.equal_to(other_node.item.key);\r\n }\r\n else { // if tree stores keys and values\r\n let value_equal = this.item.value && other_node.item.value && this.item.value.equal_to ? this.item.value.equal_to(other_node.item.value) :\r\n this.item.value == other_node.item.value;\r\n return this.item.key.equal_to(other_node.item.key) && value_equal;\r\n }\r\n\r\n // let value_equal = true;\r\n // if (this.item.value && other_node.item.value) {\r\n // value_equal = this.item.value.equal_to ? this.item.value.equal_to(other_node.item.value) :\r\n // this.item.value == other_node.item.value;\r\n // }\r\n // return this.item.key.equal_to(other_node.item.key) && value_equal;\r\n }\r\n\r\n intersect(other_node) {\r\n return this.item.key.intersect(other_node.item.key);\r\n }\r\n\r\n copy_data(other_node) {\r\n this.item.key = other_node.item.key;\r\n this.item.value = other_node.item.value;\r\n }\r\n\r\n update_max() {\r\n // use key (Interval) max property instead of key.high\r\n this.max = this.item.key ? this.item.key.max : undefined;\r\n if (this.right && this.right.max) {\r\n const comparable_max = this.item.key.constructor.comparable_max; // static method\r\n this.max = comparable_max(this.max, this.right.max);\r\n }\r\n if (this.left && this.left.max) {\r\n const comparable_max = this.item.key.constructor.comparable_max; // static method\r\n this.max = comparable_max(this.max, this.left.max);\r\n }\r\n }\r\n\r\n // Other_node does not intersect any node of left subtree, if this.left.max < other_node.item.key.low\r\n not_intersect_left_subtree(search_node) {\r\n const comparable_less_than = this.item.key.constructor.comparable_less_than; // static method\r\n let high = this.left.max.high !== undefined ? this.left.max.high : this.left.max;\r\n return comparable_less_than(high, search_node.item.key.low);\r\n }\r\n\r\n // Other_node does not intersect right subtree if other_node.item.key.high < this.right.key.low\r\n not_intersect_right_subtree(search_node) {\r\n const comparable_less_than = this.item.key.constructor.comparable_less_than; // static method\r\n let low = this.right.max.low !== undefined ? this.right.max.low : this.right.item.key.low;\r\n return comparable_less_than(search_node.item.key.high, low);\r\n }\r\n}\r\n\r\n/**\r\n * Created by Alex Bol on 3/31/2017.\r\n */\r\n\r\n// const nil_node = new Node();\r\n\r\n/**\r\n * Implementation of interval binary search tree
\r\n * Interval tree stores items which are couples of {key:interval, value: value}
\r\n * Interval is an object with high and low properties or simply pair [low,high] of numeric values
\r\n * @type {IntervalTree}\r\n */\r\nclass IntervalTree {\r\n /**\r\n * Construct new empty instance of IntervalTree\r\n */\r\n constructor() {\r\n this.root = null;\r\n this.nil_node = new Node();\r\n }\r\n\r\n /**\r\n * Returns number of items stored in the interval tree\r\n * @returns {number}\r\n */\r\n get size() {\r\n let count = 0;\r\n this.tree_walk(this.root, () => count++);\r\n return count;\r\n }\r\n\r\n /**\r\n * Returns array of sorted keys in the ascending order\r\n * @returns {Array}\r\n */\r\n get keys() {\r\n let res = [];\r\n this.tree_walk(this.root, (node) => res.push(\r\n node.item.key.output ? node.item.key.output() : node.item.key\r\n ));\r\n return res;\r\n }\r\n\r\n /**\r\n * Return array of values in the ascending keys order\r\n * @returns {Array}\r\n */\r\n get values() {\r\n let res = [];\r\n this.tree_walk(this.root, (node) => res.push(node.item.value));\r\n return res;\r\n }\r\n\r\n /**\r\n * Returns array of items ( pairs) in the ascended keys order\r\n * @returns {Array}\r\n */\r\n get items() {\r\n let res = [];\r\n this.tree_walk(this.root, (node) => res.push({\r\n key: node.item.key.output ? node.item.key.output() : node.item.key,\r\n value: node.item.value\r\n }));\r\n return res;\r\n }\r\n\r\n /**\r\n * Returns true if tree is empty\r\n * @returns {boolean}\r\n */\r\n isEmpty() {\r\n return (this.root == null || this.root == this.nil_node);\r\n }\r\n\r\n /**\r\n * Clear tree\r\n */\r\n clear() {\r\n this.root = null;\r\n }\r\n\r\n /**\r\n * Insert new item into interval tree\r\n * @param {Interval} key - interval object or array of two numbers [low, high]\r\n * @param {any} value - value representing any object (optional)\r\n * @returns {Node} returns reference to inserted node as an object {key:interval, value: value}\r\n */\r\n insert(key, value = key) {\r\n if (key === undefined) return;\r\n let insert_node = new Node(key, value, this.nil_node, this.nil_node, null, RB_TREE_COLOR_RED);\r\n this.tree_insert(insert_node);\r\n this.recalc_max(insert_node);\r\n return insert_node;\r\n }\r\n\r\n /**\r\n * Returns true if item {key,value} exist in the tree\r\n * @param {Interval} key - interval correspondent to keys stored in the tree\r\n * @param {any} value - value object to be checked\r\n * @returns {boolean} true if item {key, value} exist in the tree, false otherwise\r\n */\r\n exist(key, value = key) {\r\n let search_node = new Node(key, value);\r\n return this.tree_search(this.root, search_node) ? true : false;\r\n }\r\n\r\n /**\r\n * Remove entry {key, value} from the tree\r\n * @param {Interval} key - interval correspondent to keys stored in the tree\r\n * @param {any} value - value object\r\n * @returns {boolean} true if item {key, value} deleted, false if not found\r\n */\r\n remove(key, value = key) {\r\n let search_node = new Node(key, value);\r\n let delete_node = this.tree_search(this.root, search_node);\r\n if (delete_node) {\r\n this.tree_delete(delete_node);\r\n }\r\n return delete_node;\r\n }\r\n\r\n /**\r\n * Returns array of entry values which keys intersect with given interval
\r\n * If no values stored in the tree, returns array of keys which intersect given interval\r\n * @param {Interval} interval - search interval, or tuple [low, high]\r\n * @param outputMapperFn(value,key) - optional function that maps (value, key) to custom output\r\n * @returns {Array}\r\n */\r\n search(interval, outputMapperFn = (value, key) => value === key ? key.output() : value) {\r\n let search_node = new Node(interval);\r\n let resp_nodes = [];\r\n this.tree_search_interval(this.root, search_node, resp_nodes);\r\n return resp_nodes.map(node => outputMapperFn(node.item.value, node.item.key))\r\n }\r\n\r\n /**\r\n * Returns true if intersection between given and any interval stored in the tree found\r\n * @param {Interval} interval - search interval or tuple [low, high]\r\n * @returns {boolean}\r\n */\r\n intersect_any(interval) {\r\n let search_node = new Node(interval);\r\n let found = this.tree_find_any_interval(this.root, search_node);\r\n return found;\r\n }\r\n\r\n /**\r\n * Tree visitor. For each node implement a callback function.
\r\n * Method calls a callback function with two parameters (key, value)\r\n * @param visitor(key,value) - function to be called for each tree item\r\n */\r\n forEach(visitor) {\r\n this.tree_walk(this.root, (node) => visitor(node.item.key, node.item.value));\r\n }\r\n\r\n /** Value Mapper. Walk through every node and map node value to another value\r\n * @param callback(value,key) - function to be called for each tree item\r\n */\r\n map(callback) {\r\n const tree = new IntervalTree();\r\n this.tree_walk(this.root, (node) => tree.insert(node.item.key, callback(node.item.value, node.item.key)));\r\n return tree;\r\n }\r\n\r\n recalc_max(node) {\r\n let node_current = node;\r\n while (node_current.parent != null) {\r\n node_current.parent.update_max();\r\n node_current = node_current.parent;\r\n }\r\n }\r\n\r\n tree_insert(insert_node) {\r\n let current_node = this.root;\r\n let parent_node = null;\r\n\r\n if (this.root == null || this.root == this.nil_node) {\r\n this.root = insert_node;\r\n }\r\n else {\r\n while (current_node != this.nil_node) {\r\n parent_node = current_node;\r\n if (insert_node.less_than(current_node)) {\r\n current_node = current_node.left;\r\n }\r\n else {\r\n current_node = current_node.right;\r\n }\r\n }\r\n\r\n insert_node.parent = parent_node;\r\n\r\n if (insert_node.less_than(parent_node)) {\r\n parent_node.left = insert_node;\r\n }\r\n else {\r\n parent_node.right = insert_node;\r\n }\r\n }\r\n\r\n this.insert_fixup(insert_node);\r\n }\r\n\r\n// After insertion insert_node may have red-colored parent, and this is a single possible violation\r\n// Go upwords to the root and re-color until violation will be resolved\r\n insert_fixup(insert_node) {\r\n let current_node;\r\n let uncle_node;\r\n\r\n current_node = insert_node;\r\n while (current_node != this.root && current_node.parent.color == RB_TREE_COLOR_RED) {\r\n if (current_node.parent == current_node.parent.parent.left) { // parent is left child of grandfather\r\n uncle_node = current_node.parent.parent.right; // right brother of parent\r\n if (uncle_node.color == RB_TREE_COLOR_RED) { // Case 1. Uncle is red\r\n // re-color father and uncle into black\r\n current_node.parent.color = RB_TREE_COLOR_BLACK;\r\n uncle_node.color = RB_TREE_COLOR_BLACK;\r\n current_node.parent.parent.color = RB_TREE_COLOR_RED;\r\n current_node = current_node.parent.parent;\r\n }\r\n else { // Case 2 & 3. Uncle is black\r\n if (current_node == current_node.parent.right) { // Case 2. Current if right child\r\n // This case is transformed into Case 3.\r\n current_node = current_node.parent;\r\n this.rotate_left(current_node);\r\n }\r\n current_node.parent.color = RB_TREE_COLOR_BLACK; // Case 3. Current is left child.\r\n // Re-color father and grandfather, rotate grandfather right\r\n current_node.parent.parent.color = RB_TREE_COLOR_RED;\r\n this.rotate_right(current_node.parent.parent);\r\n }\r\n }\r\n else { // parent is right child of grandfather\r\n uncle_node = current_node.parent.parent.left; // left brother of parent\r\n if (uncle_node.color == RB_TREE_COLOR_RED) { // Case 4. Uncle is red\r\n // re-color father and uncle into black\r\n current_node.parent.color = RB_TREE_COLOR_BLACK;\r\n uncle_node.color = RB_TREE_COLOR_BLACK;\r\n current_node.parent.parent.color = RB_TREE_COLOR_RED;\r\n current_node = current_node.parent.parent;\r\n }\r\n else {\r\n if (current_node == current_node.parent.left) { // Case 5. Current is left child\r\n // Transform into case 6\r\n current_node = current_node.parent;\r\n this.rotate_right(current_node);\r\n }\r\n current_node.parent.color = RB_TREE_COLOR_BLACK; // Case 6. Current is right child.\r\n // Re-color father and grandfather, rotate grandfather left\r\n current_node.parent.parent.color = RB_TREE_COLOR_RED;\r\n this.rotate_left(current_node.parent.parent);\r\n }\r\n }\r\n }\r\n\r\n this.root.color = RB_TREE_COLOR_BLACK;\r\n }\r\n\r\n tree_delete(delete_node) {\r\n let cut_node; // node to be cut - either delete_node or successor_node (\"y\" from 14.4)\r\n let fix_node; // node to fix rb tree property (\"x\" from 14.4)\r\n\r\n if (delete_node.left == this.nil_node || delete_node.right == this.nil_node) { // delete_node has less then 2 children\r\n cut_node = delete_node;\r\n }\r\n else { // delete_node has 2 children\r\n cut_node = this.tree_successor(delete_node);\r\n }\r\n\r\n // fix_node if single child of cut_node\r\n if (cut_node.left != this.nil_node) {\r\n fix_node = cut_node.left;\r\n }\r\n else {\r\n fix_node = cut_node.right;\r\n }\r\n\r\n // remove cut_node from parent\r\n /*if (fix_node != this.nil_node) {*/\r\n fix_node.parent = cut_node.parent;\r\n /*}*/\r\n\r\n if (cut_node == this.root) {\r\n this.root = fix_node;\r\n }\r\n else {\r\n if (cut_node == cut_node.parent.left) {\r\n cut_node.parent.left = fix_node;\r\n }\r\n else {\r\n cut_node.parent.right = fix_node;\r\n }\r\n cut_node.parent.update_max(); // update max property of the parent\r\n }\r\n\r\n this.recalc_max(fix_node); // update max property upward from fix_node to root\r\n\r\n // COPY DATA !!!\r\n // Delete_node becomes cut_node, it means that we cannot hold reference\r\n // to node in outer structure and we will have to delete by key, additional search need\r\n if (cut_node != delete_node) {\r\n delete_node.copy_data(cut_node);\r\n delete_node.update_max(); // update max property of the cut node at the new place\r\n this.recalc_max(delete_node); // update max property upward from delete_node to root\r\n }\r\n\r\n if (/*fix_node != this.nil_node && */cut_node.color == RB_TREE_COLOR_BLACK) {\r\n this.delete_fixup(fix_node);\r\n }\r\n }\r\n\r\n delete_fixup(fix_node) {\r\n let current_node = fix_node;\r\n let brother_node;\r\n\r\n while (current_node != this.root && current_node.parent != null && current_node.color == RB_TREE_COLOR_BLACK) {\r\n if (current_node == current_node.parent.left) { // fix node is left child\r\n brother_node = current_node.parent.right;\r\n if (brother_node.color == RB_TREE_COLOR_RED) { // Case 1. Brother is red\r\n brother_node.color = RB_TREE_COLOR_BLACK; // re-color brother\r\n current_node.parent.color = RB_TREE_COLOR_RED; // re-color father\r\n this.rotate_left(current_node.parent);\r\n brother_node = current_node.parent.right; // update brother\r\n }\r\n // Derive to cases 2..4: brother is black\r\n if (brother_node.left.color == RB_TREE_COLOR_BLACK &&\r\n brother_node.right.color == RB_TREE_COLOR_BLACK) { // case 2: both nephews black\r\n brother_node.color = RB_TREE_COLOR_RED; // re-color brother\r\n current_node = current_node.parent; // continue iteration\r\n }\r\n else {\r\n if (brother_node.right.color == RB_TREE_COLOR_BLACK) { // case 3: left nephew red, right nephew black\r\n brother_node.color = RB_TREE_COLOR_RED; // re-color brother\r\n brother_node.left.color = RB_TREE_COLOR_BLACK; // re-color nephew\r\n this.rotate_right(brother_node);\r\n brother_node = current_node.parent.right; // update brother\r\n // Derive to case 4: left nephew black, right nephew red\r\n }\r\n // case 4: left nephew black, right nephew red\r\n brother_node.color = current_node.parent.color;\r\n current_node.parent.color = RB_TREE_COLOR_BLACK;\r\n brother_node.right.color = RB_TREE_COLOR_BLACK;\r\n this.rotate_left(current_node.parent);\r\n current_node = this.root; // exit from loop\r\n }\r\n }\r\n else { // fix node is right child\r\n brother_node = current_node.parent.left;\r\n if (brother_node.color == RB_TREE_COLOR_RED) { // Case 1. Brother is red\r\n brother_node.color = RB_TREE_COLOR_BLACK; // re-color brother\r\n current_node.parent.color = RB_TREE_COLOR_RED; // re-color father\r\n this.rotate_right(current_node.parent);\r\n brother_node = current_node.parent.left; // update brother\r\n }\r\n // Go to cases 2..4\r\n if (brother_node.left.color == RB_TREE_COLOR_BLACK &&\r\n brother_node.right.color == RB_TREE_COLOR_BLACK) { // case 2\r\n brother_node.color = RB_TREE_COLOR_RED; // re-color brother\r\n current_node = current_node.parent; // continue iteration\r\n }\r\n else {\r\n if (brother_node.left.color == RB_TREE_COLOR_BLACK) { // case 3: right nephew red, left nephew black\r\n brother_node.color = RB_TREE_COLOR_RED; // re-color brother\r\n brother_node.right.color = RB_TREE_COLOR_BLACK; // re-color nephew\r\n this.rotate_left(brother_node);\r\n brother_node = current_node.parent.left; // update brother\r\n // Derive to case 4: right nephew black, left nephew red\r\n }\r\n // case 4: right nephew black, left nephew red\r\n brother_node.color = current_node.parent.color;\r\n current_node.parent.color = RB_TREE_COLOR_BLACK;\r\n brother_node.left.color = RB_TREE_COLOR_BLACK;\r\n this.rotate_right(current_node.parent);\r\n current_node = this.root; // force exit from loop\r\n }\r\n }\r\n }\r\n\r\n current_node.color = RB_TREE_COLOR_BLACK;\r\n }\r\n\r\n tree_search(node, search_node) {\r\n if (node == null || node == this.nil_node)\r\n return undefined;\r\n\r\n if (search_node.equal_to(node)) {\r\n return node;\r\n }\r\n if (search_node.less_than(node)) {\r\n return this.tree_search(node.left, search_node);\r\n }\r\n else {\r\n return this.tree_search(node.right, search_node);\r\n }\r\n }\r\n\r\n // Original search_interval method; container res support push() insertion\r\n // Search all intervals intersecting given one\r\n tree_search_interval(node, search_node, res) {\r\n if (node != null && node != this.nil_node) {\r\n // if (node->left != this.nil_node && node->left->max >= low) {\r\n if (node.left != this.nil_node && !node.not_intersect_left_subtree(search_node)) {\r\n this.tree_search_interval(node.left, search_node, res);\r\n }\r\n // if (low <= node->high && node->low <= high) {\r\n if (node.intersect(search_node)) {\r\n res.push(node);\r\n }\r\n // if (node->right != this.nil_node && node->low <= high) {\r\n if (node.right != this.nil_node && !node.not_intersect_right_subtree(search_node)) {\r\n this.tree_search_interval(node.right, search_node, res);\r\n }\r\n }\r\n }\r\n\r\n tree_find_any_interval(node, search_node) {\r\n let found = false;\r\n if (node != null && node != this.nil_node) {\r\n // if (node->left != this.nil_node && node->left->max >= low) {\r\n if (node.left != this.nil_node && !node.not_intersect_left_subtree(search_node)) {\r\n found = this.tree_find_any_interval(node.left, search_node);\r\n }\r\n // if (low <= node->high && node->low <= high) {\r\n if (!found) {\r\n found = node.intersect(search_node);\r\n }\r\n // if (node->right != this.nil_node && node->low <= high) {\r\n if (!found && node.right != this.nil_node && !node.not_intersect_right_subtree(search_node)) {\r\n found = this.tree_find_any_interval(node.right, search_node);\r\n }\r\n }\r\n return found;\r\n }\r\n\r\n local_minimum(node) {\r\n let node_min = node;\r\n while (node_min.left != null && node_min.left != this.nil_node) {\r\n node_min = node_min.left;\r\n }\r\n return node_min;\r\n }\r\n\r\n // not in use\r\n local_maximum(node) {\r\n let node_max = node;\r\n while (node_max.right != null && node_max.right != this.nil_node) {\r\n node_max = node_max.right;\r\n }\r\n return node_max;\r\n }\r\n\r\n tree_successor(node) {\r\n let node_successor;\r\n let current_node;\r\n let parent_node;\r\n\r\n if (node.right != this.nil_node) {\r\n node_successor = this.local_minimum(node.right);\r\n }\r\n else {\r\n current_node = node;\r\n parent_node = node.parent;\r\n while (parent_node != null && parent_node.right == current_node) {\r\n current_node = parent_node;\r\n parent_node = parent_node.parent;\r\n }\r\n node_successor = parent_node;\r\n }\r\n return node_successor;\r\n }\r\n\r\n // | right-rotate(T,y) |\r\n // y ---------------. x\r\n // / \\ / \\\r\n // x c left-rotate(T,x) a y\r\n // / \\ <--------------- / \\\r\n // a b b c\r\n\r\n rotate_left(x) {\r\n let y = x.right;\r\n\r\n x.right = y.left; // b goes to x.right\r\n\r\n if (y.left != this.nil_node) {\r\n y.left.parent = x; // x becomes parent of b\r\n }\r\n y.parent = x.parent; // move parent\r\n\r\n if (x == this.root) {\r\n this.root = y; // y becomes root\r\n }\r\n else { // y becomes child of x.parent\r\n if (x == x.parent.left) {\r\n x.parent.left = y;\r\n }\r\n else {\r\n x.parent.right = y;\r\n }\r\n }\r\n y.left = x; // x becomes left child of y\r\n x.parent = y; // and y becomes parent of x\r\n\r\n if (x != null && x != this.nil_node) {\r\n x.update_max();\r\n }\r\n\r\n y = x.parent;\r\n if (y != null && y != this.nil_node) {\r\n y.update_max();\r\n }\r\n }\r\n\r\n rotate_right(y) {\r\n let x = y.left;\r\n\r\n y.left = x.right; // b goes to y.left\r\n\r\n if (x.right != this.nil_node) {\r\n x.right.parent = y; // y becomes parent of b\r\n }\r\n x.parent = y.parent; // move parent\r\n\r\n if (y == this.root) { // x becomes root\r\n this.root = x;\r\n }\r\n else { // y becomes child of x.parent\r\n if (y == y.parent.left) {\r\n y.parent.left = x;\r\n }\r\n else {\r\n y.parent.right = x;\r\n }\r\n }\r\n x.right = y; // y becomes right child of x\r\n y.parent = x; // and x becomes parent of y\r\n\r\n if (y != null && y != this.nil_node) {\r\n y.update_max();\r\n }\r\n\r\n x = y.parent;\r\n if (x != null && x != this.nil_node) {\r\n x.update_max();\r\n }\r\n }\r\n\r\n tree_walk(node, action) {\r\n if (node != null && node != this.nil_node) {\r\n this.tree_walk(node.left, action);\r\n // arr.push(node.toArray());\r\n action(node);\r\n this.tree_walk(node.right, action);\r\n }\r\n }\r\n\r\n /* Return true if all red nodes have exactly two black child nodes */\r\n testRedBlackProperty() {\r\n let res = true;\r\n this.tree_walk(this.root, function (node) {\r\n if (node.color == RB_TREE_COLOR_RED) {\r\n if (!(node.left.color == RB_TREE_COLOR_BLACK && node.right.color == RB_TREE_COLOR_BLACK)) {\r\n res = false;\r\n }\r\n }\r\n });\r\n return res;\r\n }\r\n\r\n /* Throw error if not every path from root to bottom has same black height */\r\n testBlackHeightProperty(node) {\r\n let height = 0;\r\n let heightLeft = 0;\r\n let heightRight = 0;\r\n if (node.color == RB_TREE_COLOR_BLACK) {\r\n height++;\r\n }\r\n if (node.left != this.nil_node) {\r\n heightLeft = this.testBlackHeightProperty(node.left);\r\n }\r\n else {\r\n heightLeft = 1;\r\n }\r\n if (node.right != this.nil_node) {\r\n heightRight = this.testBlackHeightProperty(node.right);\r\n }\r\n else {\r\n heightRight = 1;\r\n }\r\n if (heightLeft != heightRight) {\r\n throw new Error('Red-black height property violated');\r\n }\r\n height += heightLeft;\r\n return height;\r\n };\r\n}\r\n\r\n/**\r\n * Created by Alex Bol on 3/12/2017.\r\n */\r\n\r\n/**\r\n * Class representing a planar set - a generic container with ability to keep and retrieve shapes and\r\n * perform spatial queries. Planar set is an extension of Set container, so it supports\r\n * Set properties and methods\r\n */\r\nclass PlanarSet extends Set {\r\n /**\r\n * Create new instance of PlanarSet\r\n * @param shapes - array or set of geometric objects to store in planar set\r\n * Each object should have a box property\r\n */\r\n constructor(shapes) {\r\n super(shapes);\r\n this.index = new IntervalTree();\r\n this.forEach(shape => this.index.insert(shape));\r\n }\r\n\r\n /**\r\n * Add new shape to planar set and to its spatial index.
\r\n * If shape already exist, it will not be added again.\r\n * This happens with no error, it is possible to use size property to check if\r\n * a shape was actually added.
\r\n * Method returns planar set object updated and may be chained\r\n * @param {Shape} shape - shape to be added, should have valid box property\r\n * @returns {PlanarSet}\r\n */\r\n add(shape) {\r\n let size = this.size;\r\n super.add(shape);\r\n // size not changed - item not added, probably trying to add same item twice\r\n if (this.size > size) {\r\n let node = this.index.insert(shape.box, shape);\r\n }\r\n return this; // in accordance to Set.add interface\r\n }\r\n\r\n /**\r\n * Delete shape from planar set. Returns true if shape was actually deleted, false otherwise\r\n * @param {Shape} shape - shape to be deleted\r\n * @returns {boolean}\r\n */\r\n delete(shape) {\r\n let deleted = super.delete(shape);\r\n if (deleted) {\r\n this.index.remove(shape.box, shape);\r\n }\r\n return deleted;\r\n }\r\n\r\n /**\r\n * Clear planar set\r\n */\r\n clear() {\r\n super.clear();\r\n this.index = new IntervalTree();\r\n }\r\n\r\n /**\r\n * 2d range search in planar set.
\r\n * Returns array of all shapes in planar set which bounding box is intersected with query box\r\n * @param {Box} box - query box\r\n * @returns {Shapes[]}\r\n */\r\n search(box) {\r\n let resp = this.index.search(box);\r\n return resp;\r\n }\r\n\r\n /**\r\n * Point location test. Returns array of shapes which contains given point\r\n * @param {Point} point - query point\r\n * @returns {Array}\r\n */\r\n hit(point) {\r\n let box = new Flatten.Box(point.x - 1, point.y - 1, point.x + 1, point.y + 1);\r\n let resp = this.index.search(box);\r\n return resp.filter((shape) => point.on(shape));\r\n }\r\n\r\n /**\r\n * Returns svg string to draw all shapes in planar set\r\n * @returns {String}\r\n */\r\n svg() {\r\n let svgcontent = [...this].reduce((acc, shape) => acc + shape.svg(), \"\");\r\n return svgcontent;\r\n }\r\n}\r\n\r\nFlatten.PlanarSet = PlanarSet;\r\n\r\n/**\r\n * Created by Alex Bol on 2/18/2017.\r\n */\r\n\r\n/**\r\n *\r\n * Class representing a point\r\n * @type {Point}\r\n */\r\nclass Point {\r\n /**\r\n * Point may be constructed by two numbers, or by array of two numbers\r\n * @param {number} x - x-coordinate (float number)\r\n * @param {number} y - y-coordinate (float number)\r\n */\r\n constructor(...args) {\r\n /**\r\n * x-coordinate (float number)\r\n * @type {number}\r\n */\r\n this.x = 0;\r\n /**\r\n * y-coordinate (float number)\r\n * @type {number}\r\n */\r\n this.y = 0;\r\n\r\n if (args.length === 0) {\r\n return;\r\n }\r\n\r\n if (args.length === 1 && args[0] instanceof Array && args[0].length === 2) {\r\n let arr = args[0];\r\n if (typeof (arr[0]) == \"number\" && typeof (arr[1]) == \"number\") {\r\n this.x = arr[0];\r\n this.y = arr[1];\r\n return;\r\n }\r\n }\r\n\r\n if (args.length === 1 && args[0] instanceof Object && args[0].name === \"point\") {\r\n let {x, y} = args[0];\r\n this.x = x;\r\n this.y = y;\r\n return;\r\n }\r\n\r\n if (args.length === 2) {\r\n if (typeof (args[0]) == \"number\" && typeof (args[1]) == \"number\") {\r\n this.x = args[0];\r\n this.y = args[1];\r\n return;\r\n }\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n\r\n }\r\n\r\n /**\r\n * Returns bounding box of a point\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return new Flatten.Box(this.x, this.y, this.x, this.y);\r\n }\r\n\r\n /**\r\n * Return new cloned instance of point\r\n * @returns {Point}\r\n */\r\n clone() {\r\n return new Flatten.Point(this.x, this.y);\r\n }\r\n\r\n get vertices() {\r\n return [this.clone()];\r\n }\r\n\r\n /**\r\n * Returns true if points are equal up to [Flatten.Utils.DP_TOL]{@link DP_TOL} tolerance\r\n * @param {Point} pt Query point\r\n * @returns {boolean}\r\n */\r\n equalTo(pt) {\r\n return Flatten.Utils.EQ(this.x, pt.x) && Flatten.Utils.EQ(this.y, pt.y);\r\n }\r\n\r\n /**\r\n * Defines predicate \"less than\" between points. Returns true if the point is less than query points, false otherwise
\r\n * By definition point1 < point2 if {point1.y < point2.y || point1.y == point2.y && point1.x < point2.x
\r\n * Numeric values compared with [Flatten.Utils.DP_TOL]{@link DP_TOL} tolerance\r\n * @param {Point} pt Query point\r\n * @returns {boolean}\r\n */\r\n lessThan(pt) {\r\n if (Flatten.Utils.LT(this.y, pt.y))\r\n return true;\r\n if (Flatten.Utils.EQ(this.y, pt.y) && Flatten.Utils.LT(this.x, pt.x))\r\n return true;\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns new point rotated by given angle around given center point.\r\n * If center point is omitted, rotates around zero point (0,0).\r\n * Positive value of angle defines rotation in counter clockwise direction,\r\n * negative angle defines rotation in clockwise clockwise direction\r\n * @param {number} angle - angle in radians\r\n * @param {Point} [center=(0,0)] center\r\n * @returns {Point}\r\n */\r\n rotate(angle, center = {x: 0, y: 0}) {\r\n var x_rot = center.x + (this.x - center.x) * Math.cos(angle) - (this.y - center.y) * Math.sin(angle);\r\n var y_rot = center.y + (this.x - center.x) * Math.sin(angle) + (this.y - center.y) * Math.cos(angle);\r\n\r\n return new Flatten.Point(x_rot, y_rot);\r\n }\r\n\r\n /**\r\n * Returns new point translated by given vector.\r\n * Translation vector may by also defined by a pair of numbers.\r\n * @param {Vector} vector - Translation vector defined as Flatten.Vector or\r\n * @param {number|number} - Translation vector defined as pair of numbers\r\n * @returns {Point}\r\n */\r\n translate(...args) {\r\n if (args.length == 1 &&\r\n (args[0] instanceof Flatten.Vector || !isNaN(args[0].x) && !isNaN(args[0].y))) {\r\n return new Flatten.Point(this.x + args[0].x, this.y + args[0].y);\r\n }\r\n\r\n if (args.length == 2 && typeof (args[0]) == \"number\" && typeof (args[1]) == \"number\") {\r\n return new Flatten.Point(this.x + args[0], this.y + args[1]);\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Return new point transformed by affine transformation matrix m\r\n * @param {Matrix} m - affine transformation matrix (a,b,c,d,tx,ty)\r\n * @returns {Point}\r\n */\r\n transform(m) {\r\n // let [x,y] = m.transform([this.x,this.y]);\r\n return new Flatten.Point(m.transform([this.x, this.y]))\r\n }\r\n\r\n /**\r\n * Returns projection point on given line\r\n * @param {Line} line Line this point be projected on\r\n * @returns {Point}\r\n */\r\n projectionOn(line) {\r\n if (this.equalTo(line.pt)) // this point equal to line anchor point\r\n return this.clone();\r\n\r\n let vec = new Flatten.Vector(this, line.pt);\r\n if (Flatten.Utils.EQ_0(vec.cross(line.norm))) // vector to point from anchor point collinear to normal vector\r\n return line.pt.clone();\r\n\r\n let dist = vec.dot(line.norm); // signed distance\r\n let proj_vec = line.norm.multiply(dist);\r\n return this.translate(proj_vec);\r\n }\r\n\r\n /**\r\n * Returns true if point belongs to the \"left\" semi-plane, which means, point belongs to the same semi plane where line normal vector points to\r\n * Return false if point belongs to the \"right\" semi-plane or to the line itself\r\n * @param {Line} line Query line\r\n * @returns {boolean}\r\n */\r\n leftTo(line) {\r\n let vec = new Flatten.Vector(line.pt, this);\r\n let onLeftSemiPlane = Flatten.Utils.GT(vec.dot(line.norm), 0);\r\n return onLeftSemiPlane;\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment from point to shape and return as array [distance, shortest segment]\r\n * @param {Shape} shape Shape of the one of supported types Point, Line, Circle, Segment, Arc, Polygon or Planar Set\r\n * @returns {number} distance from point to shape\r\n * @returns {Segment} shortest segment between point and shape (started at point, ended at shape)\r\n */\r\n distanceTo(shape) {\r\n if (shape instanceof Point) {\r\n let dx = shape.x - this.x;\r\n let dy = shape.y - this.y;\r\n return [Math.sqrt(dx * dx + dy * dy), new Flatten.Segment(this, shape)];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n return Flatten.Distance.point2line(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return Flatten.Distance.point2circle(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return Flatten.Distance.point2segment(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n // let [dist, ...rest] = Distance.point2arc(this, shape);\r\n // return dist;\r\n return Flatten.Distance.point2arc(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n // let [dist, ...rest] = Distance.point2polygon(this, shape);\r\n // return dist;\r\n return Flatten.Distance.point2polygon(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.PlanarSet) {\r\n return Flatten.Distance.shape2planarSet(this, shape);\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if point is on a shape, false otherwise\r\n * @param {Shape} shape Shape of the one of supported types Point, Line, Circle, Segment, Arc, Polygon\r\n * @returns {boolean}\r\n */\r\n on(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.equalTo(shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n return shape.contains(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return shape.contains(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return shape.contains(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n return shape.contains(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n return shape.contains(this);\r\n }\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({}, this, {name: \"point\"});\r\n }\r\n\r\n /**\r\n * Return string to draw point in svg as circle with radius \"r\"
\r\n * Accept any valid attributes of svg elements as svg object\r\n * Defaults attribues are:
\r\n * {\r\n * r:\"3\",\r\n * stroke:\"black\",\r\n * strokeWidth:\"1\",\r\n * fill:\"red\"\r\n * }\r\n * @param {Object} attrs - Any valid attributes of svg circle element, like \"r\", \"stroke\", \"strokeWidth\", \"fill\"\r\n * @returns {String}\r\n */\r\n svg(attrs = {}) {\r\n let {r, stroke, strokeWidth, fill, id, className} = attrs;\r\n // let rest_str = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n return `\\n`;\r\n }\r\n\r\n}\r\nFlatten.Point = Point;\r\n/**\r\n * Function to create point equivalent to \"new\" constructor\r\n * @param args\r\n */\r\nconst point = (...args) => new Flatten.Point(...args);\r\nFlatten.point = point;\r\n\r\n// export {Point};\r\n\r\n/**\r\n * Created by Alex Bol on 2/19/2017.\r\n */\r\n\r\n/**\r\n * Class representing a vector\r\n * @type {Vector}\r\n */\r\nclass Vector {\r\n /**\r\n * Vector may be constructed by two points, or by two float numbers,\r\n * or by array of two numbers\r\n * @param {Point} ps - start point\r\n * @param {Point} pe - end point\r\n */\r\n constructor(...args) {\r\n /**\r\n * x-coordinate of a vector (float number)\r\n * @type {number}\r\n */\r\n this.x = 0;\r\n /**\r\n * y-coordinate of a vector (float number)\r\n * @type {number}\r\n */\r\n this.y = 0;\r\n\r\n /* return zero vector */\r\n if (args.length === 0) {\r\n return;\r\n }\r\n\r\n if (args.length === 1 && args[0] instanceof Array && args[0].length === 2) {\r\n let arr = args[0];\r\n if (typeof (arr[0]) == \"number\" && typeof (arr[1]) == \"number\") {\r\n this.x = arr[0];\r\n this.y = arr[1];\r\n return;\r\n }\r\n }\r\n\r\n if (args.length === 1 && args[0] instanceof Object && args[0].name === \"vector\") {\r\n let {x, y} = args[0];\r\n this.x = x;\r\n this.y = y;\r\n return;\r\n }\r\n\r\n if (args.length === 2) {\r\n let a1 = args[0];\r\n let a2 = args[1];\r\n\r\n if (typeof (a1) == \"number\" && typeof (a2) == \"number\") {\r\n this.x = a1;\r\n this.y = a2;\r\n return;\r\n }\r\n\r\n if (a1 instanceof Flatten.Point && a2 instanceof Flatten.Point) {\r\n this.x = a2.x - a1.x;\r\n this.y = a2.y - a1.y;\r\n return;\r\n }\r\n\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Method clone returns new instance of Vector\r\n * @returns {Vector}\r\n */\r\n clone() {\r\n return new Flatten.Vector(this.x, this.y);\r\n }\r\n\r\n /**\r\n * Slope of the vector in radians from 0 to 2PI\r\n * @returns {number}\r\n */\r\n get slope() {\r\n let angle = Math.atan2(this.y, this.x);\r\n if (angle < 0) angle = 2 * Math.PI + angle;\r\n return angle;\r\n }\r\n\r\n /**\r\n * Length of vector\r\n * @returns {number}\r\n */\r\n get length() {\r\n return Math.sqrt(this.dot(this));\r\n }\r\n\r\n /**\r\n * Returns true if vectors are equal up to [DP_TOL]{@link http://localhost:63342/flatten-js/docs/global.html#DP_TOL}\r\n * tolerance\r\n * @param {Vector} v\r\n * @returns {boolean}\r\n */\r\n equalTo(v) {\r\n return Flatten.Utils.EQ(this.x, v.x) && Flatten.Utils.EQ(this.y, v.y);\r\n }\r\n\r\n /**\r\n * Returns new vector multiplied by scalar\r\n * @param {number} scalar\r\n * @returns {Vector}\r\n */\r\n multiply(scalar) {\r\n return (new Flatten.Vector(scalar * this.x, scalar * this.y));\r\n }\r\n\r\n /**\r\n * Returns scalar product (dot product) of two vectors
\r\n * dot_product = (this * v)
\r\n * @param {Vector} v Other vector\r\n * @returns {number}\r\n */\r\n dot(v) {\r\n return (this.x * v.x + this.y * v.y);\r\n }\r\n\r\n /**\r\n * Returns vector product (cross product) of two vectors
\r\n * cross_product = (this x v)
\r\n * @param {Vector} v Other vector\r\n * @returns {number}\r\n */\r\n cross(v) {\r\n return (this.x * v.y - this.y * v.x);\r\n }\r\n\r\n /**\r\n * Returns unit vector.
\r\n * Throw error if given vector has zero length\r\n * @returns {Vector}\r\n */\r\n normalize() {\r\n if (!Flatten.Utils.EQ_0(this.length)) {\r\n return (new Flatten.Vector(this.x / this.length, this.y / this.length));\r\n }\r\n throw Flatten.Errors.ZERO_DIVISION;\r\n }\r\n\r\n /**\r\n * Returns new vector rotated by given angle,\r\n * positive angle defines rotation in counter clockwise direction,\r\n * negative - in clockwise direction\r\n * @param {number} angle - Angle in radians\r\n * @returns {Vector}\r\n */\r\n rotate(angle) {\r\n let point = new Flatten.Point(this.x, this.y);\r\n let rpoint = point.rotate(angle);\r\n return new Flatten.Vector(rpoint.x, rpoint.y);\r\n }\r\n\r\n /**\r\n * Returns vector rotated 90 degrees counter clockwise\r\n * @returns {Vector}\r\n */\r\n rotate90CCW() {\r\n return new Flatten.Vector(-this.y, this.x);\r\n };\r\n\r\n /**\r\n * Returns vector rotated 90 degrees clockwise\r\n * @returns {Vector}\r\n */\r\n rotate90CW() {\r\n return new Flatten.Vector(this.y, -this.x);\r\n };\r\n\r\n /**\r\n * Return inverted vector\r\n * @returns {Vector}\r\n */\r\n invert() {\r\n return new Flatten.Vector(-this.x, -this.y);\r\n }\r\n\r\n /**\r\n * Return result of addition of other vector to this vector as a new vector\r\n * @param {Vector} v Other vector\r\n * @returns {Vector}\r\n */\r\n add(v) {\r\n return new Flatten.Vector(this.x + v.x, this.y + v.y);\r\n }\r\n\r\n /**\r\n * Return result of subtraction of other vector from current vector as a new vector\r\n * @param {Vector} v Another vector\r\n * @returns {Vector}\r\n */\r\n subtract(v) {\r\n return new Flatten.Vector(this.x - v.x, this.y - v.y);\r\n }\r\n\r\n /**\r\n * Return angle between this vector and other vector.
\r\n * Angle is measured from 0 to 2*PI in the counter clockwise direction\r\n * from current vector to other.\r\n * @param {Vector} v Another vector\r\n * @returns {number}\r\n */\r\n angleTo(v) {\r\n let norm1 = this.normalize();\r\n let norm2 = v.normalize();\r\n let angle = Math.atan2(norm1.cross(norm2), norm1.dot(norm2));\r\n if (angle < 0) angle += 2 * Math.PI;\r\n return angle;\r\n }\r\n\r\n /**\r\n * Return vector projection of the current vector on another vector\r\n * @param {Vector} v Another vector\r\n * @returns {Vector}\r\n */\r\n projectionOn(v) {\r\n let n = v.normalize();\r\n let d = this.dot(n);\r\n return n.multiply(d);\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({}, this, {name: \"vector\"});\r\n }\r\n}\r\nFlatten.Vector = Vector;\r\n\r\n/**\r\n * Function to create vector equivalent to \"new\" constructor\r\n * @param args\r\n */\r\nconst vector = (...args) => new Flatten.Vector(...args);\r\nFlatten.vector = vector;\r\n\r\n/**\r\n * Created by Alex Bol on 3/10/2017.\r\n */\r\n\r\n/**\r\n * Class representing a segment\r\n * @type {Segment}\r\n */\r\nclass Segment {\r\n /**\r\n *\r\n * @param {Point} ps - start point\r\n * @param {Point} pe - end point\r\n */\r\n constructor(...args) {\r\n /**\r\n * Start point\r\n * @type {Point}\r\n */\r\n this.ps = new Flatten.Point();\r\n /**\r\n * End Point\r\n * @type {Point}\r\n */\r\n this.pe = new Flatten.Point();\r\n\r\n if (args.length === 0) {\r\n return;\r\n }\r\n\r\n if (args.length === 1 && args[0] instanceof Array && args[0].length === 4) {\r\n let coords = args[0];\r\n this.ps = new Flatten.Point(coords[0], coords[1]);\r\n this.pe = new Flatten.Point(coords[2], coords[3]);\r\n return;\r\n }\r\n\r\n if (args.length === 1 && args[0] instanceof Object && args[0].name === \"segment\") {\r\n let {ps, pe} = args[0];\r\n this.ps = new Flatten.Point(ps.x, ps.y);\r\n this.pe = new Flatten.Point(pe.x, pe.y);\r\n return;\r\n }\r\n\r\n // second point omitted issue #84\r\n if (args.length === 1 && args[0] instanceof Flatten.Point) {\r\n this.ps = args[0].clone();\r\n return;\r\n }\r\n\r\n if (args.length === 2 && args[0] instanceof Flatten.Point && args[1] instanceof Flatten.Point) {\r\n this.ps = args[0].clone();\r\n this.pe = args[1].clone();\r\n return;\r\n }\r\n\r\n if (args.length === 4) {\r\n this.ps = new Flatten.Point(args[0], args[1]);\r\n this.pe = new Flatten.Point(args[2], args[3]);\r\n return;\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Return new cloned instance of segment\r\n * @returns {Segment}\r\n */\r\n clone() {\r\n return new Flatten.Segment(this.start, this.end);\r\n }\r\n\r\n /**\r\n * Start point\r\n * @returns {Point}\r\n */\r\n get start() {\r\n return this.ps;\r\n }\r\n\r\n /**\r\n * End point\r\n * @returns {Point}\r\n */\r\n get end() {\r\n return this.pe;\r\n }\r\n\r\n\r\n /**\r\n * Returns array of start and end point\r\n * @returns [Point,Point]\r\n */\r\n get vertices() {\r\n return [this.ps.clone(), this.pe.clone()];\r\n }\r\n\r\n /**\r\n * Length of a segment\r\n * @returns {number}\r\n */\r\n get length() {\r\n return this.start.distanceTo(this.end)[0];\r\n }\r\n\r\n /**\r\n * Slope of the line - angle to axe x in radians from 0 to 2PI\r\n * @returns {number}\r\n */\r\n get slope() {\r\n let vec = new Flatten.Vector(this.start, this.end);\r\n return vec.slope;\r\n }\r\n\r\n /**\r\n * Bounding box\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return new Flatten.Box(\r\n Math.min(this.start.x, this.end.x),\r\n Math.min(this.start.y, this.end.y),\r\n Math.max(this.start.x, this.end.x),\r\n Math.max(this.start.y, this.end.y)\r\n )\r\n }\r\n\r\n /**\r\n * Returns true if equals to query segment, false otherwise\r\n * @param {Seg} seg - query segment\r\n * @returns {boolean}\r\n */\r\n equalTo(seg) {\r\n return this.ps.equalTo(seg.ps) && this.pe.equalTo(seg.pe);\r\n }\r\n\r\n /**\r\n * Returns true if segment contains point\r\n * @param {Point} pt Query point\r\n * @returns {boolean}\r\n */\r\n contains(pt) {\r\n return Flatten.Utils.EQ_0(this.distanceToPoint(pt));\r\n }\r\n\r\n /**\r\n * Returns array of intersection points between segment and other shape\r\n * @param {Shape} shape - Shape of the one of supported types
\r\n * @returns {Point[]}\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.contains(shape) ? [shape] : [];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n return intersectSegment2Line(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return intersectSegment2Segment(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return intersectSegment2Circle(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Box) {\r\n return intersectSegment2Box(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n return intersectSegment2Arc(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n return intersectSegment2Polygon(this, shape);\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment from segment to shape and return as array [distance, shortest segment]\r\n * @param {Shape} shape Shape of the one of supported types Point, Line, Circle, Segment, Arc, Polygon or Planar Set\r\n * @returns {number} distance from segment to shape\r\n * @returns {Segment} shortest segment between segment and shape (started at segment, ended at shape)\r\n */\r\n distanceTo(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n let [dist, shortest_segment] = Flatten.Distance.point2segment(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n let [dist, shortest_segment] = Flatten.Distance.segment2circle(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n let [dist, shortest_segment] = Flatten.Distance.segment2line(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n let [dist, shortest_segment] = Flatten.Distance.segment2segment(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n let [dist, shortest_segment] = Flatten.Distance.segment2arc(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n let [dist, shortest_segment] = Flatten.Distance.shape2polygon(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.PlanarSet) {\r\n let [dist, shortest_segment] = Flatten.Distance.shape2planarSet(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n }\r\n\r\n /**\r\n * Returns unit vector in the direction from start to end\r\n * @returns {Vector}\r\n */\r\n tangentInStart() {\r\n let vec = new Flatten.Vector(this.start, this.end);\r\n return vec.normalize();\r\n }\r\n\r\n /**\r\n * Return unit vector in the direction from end to start\r\n * @returns {Vector}\r\n */\r\n tangentInEnd() {\r\n let vec = new Flatten.Vector(this.end, this.start);\r\n return vec.normalize();\r\n }\r\n\r\n /**\r\n * Returns new segment with swapped start and end points\r\n * @returns {Segment}\r\n */\r\n reverse() {\r\n return new Segment(this.end, this.start);\r\n }\r\n\r\n /**\r\n * When point belongs to segment, return array of two segments split by given point,\r\n * if point is inside segment. Returns clone of this segment if query point is incident\r\n * to start or end point of the segment. Returns empty array if point does not belong to segment\r\n * @param {Point} pt Query point\r\n * @returns {Segment[]}\r\n */\r\n split(pt) {\r\n if (this.start.equalTo(pt))\r\n return [null, this.clone()];\r\n\r\n if (this.end.equalTo(pt))\r\n return [this.clone(), null];\r\n\r\n return [\r\n new Flatten.Segment(this.start, pt),\r\n new Flatten.Segment(pt, this.end)\r\n ]\r\n }\r\n\r\n /**\r\n * Return middle point of the segment\r\n * @returns {Point}\r\n */\r\n middle() {\r\n return new Flatten.Point((this.start.x + this.end.x) / 2, (this.start.y + this.end.y) / 2);\r\n }\r\n\r\n /**\r\n * Get point at given length\r\n * @param {number} length - The length along the segment\r\n * @returns {Point}\r\n */\r\n pointAtLength(length) {\r\n if (length > this.length || length < 0) return null;\r\n if (length == 0) return this.start;\r\n if (length == this.length) return this.end;\r\n let factor = length / this.length;\r\n return new Flatten.Point(\r\n (this.end.x - this.start.x) * factor + this.start.x,\r\n (this.end.y - this.start.y) * factor + this.start.y\r\n );\r\n }\r\n\r\n distanceToPoint(pt) {\r\n let [dist, ...rest] = Flatten.Distance.point2segment(pt, this);\r\n return dist;\r\n };\r\n\r\n definiteIntegral(ymin = 0.0) {\r\n let dx = this.end.x - this.start.x;\r\n let dy1 = this.start.y - ymin;\r\n let dy2 = this.end.y - ymin;\r\n return (dx * (dy1 + dy2) / 2);\r\n }\r\n\r\n /**\r\n * Returns new segment translated by vector vec\r\n * @param {Vector} vec\r\n * @returns {Segment}\r\n */\r\n translate(...args) {\r\n return new Segment(this.ps.translate(...args), this.pe.translate(...args));\r\n }\r\n\r\n /**\r\n * Return new segment rotated by given angle around given point\r\n * If point omitted, rotate around origin (0,0)\r\n * Positive value of angle defines rotation counter clockwise, negative - clockwise\r\n * @param {number} angle - rotation angle in radians\r\n * @param {Point} center - center point, default is (0,0)\r\n * @returns {Segment}\r\n */\r\n rotate(angle = 0, center = new Flatten.Point()) {\r\n let m = new Flatten.Matrix();\r\n m = m.translate(center.x, center.y).rotate(angle).translate(-center.x, -center.y);\r\n return this.transform(m);\r\n }\r\n\r\n /**\r\n * Return new segment transformed using affine transformation matrix\r\n * @param {Matrix} matrix - affine transformation matrix\r\n * @returns {Segment} - transformed segment\r\n */\r\n transform(matrix = new Flatten.Matrix()) {\r\n return new Segment(this.ps.transform(matrix), this.pe.transform(matrix))\r\n }\r\n\r\n /**\r\n * Returns true if segment start is equal to segment end up to DP_TOL\r\n * @returns {boolean}\r\n */\r\n isZeroLength() {\r\n return this.ps.equalTo(this.pe)\r\n }\r\n\r\n /**\r\n * Sort given array of points from segment start to end, assuming all points lay on the segment\r\n * @param {Point[]} - array of points\r\n * @returns {Point[]} new array sorted\r\n */\r\n sortPoints(pts) {\r\n let line = new Flatten.Line(this.start, this.end);\r\n return line.sortPoints(pts);\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({}, this, {name: \"segment\"});\r\n }\r\n\r\n /**\r\n * Return string to draw segment in svg\r\n * @param {Object} attrs - an object with attributes for svg path element,\r\n * like \"stroke\", \"strokeWidth\"
\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\"\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let {stroke, strokeWidth, id, className} = attrs;\r\n // let rest_str = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n\r\n return `\\n`;\r\n\r\n }\r\n\r\n}\r\nFlatten.Segment = Segment;\r\n/**\r\n * Shortcut method to create new segment\r\n */\r\nconst segment = (...args) => new Flatten.Segment(...args);\r\nFlatten.segment = segment;\r\n\r\n/**\r\n * Created by Alex Bol on 2/20/2017.\r\n */\r\n\r\nlet {vector: vector$1} = Flatten;\r\n\r\n/**\r\n * Class representing a line\r\n * @type {Line}\r\n */\r\nclass Line {\r\n /**\r\n * Line may be constructed by point and normal vector or by two points that a line passes through\r\n * @param {Point} pt - point that a line passes through\r\n * @param {Vector|Point} norm - normal vector to a line or second point a line passes through\r\n */\r\n constructor(...args) {\r\n /**\r\n * Point a line passes through\r\n * @type {Point}\r\n */\r\n this.pt = new Flatten.Point();\r\n /**\r\n * Normal vector to a line
\r\n * Vector is normalized (length == 1)
\r\n * Direction of the vector is chosen to satisfy inequality norm * p >= 0\r\n * @type {Vector}\r\n */\r\n this.norm = new Flatten.Vector(0, 1);\r\n\r\n if (args.length == 0) {\r\n return;\r\n }\r\n\r\n if (args.length == 1 && args[0] instanceof Object && args[0].name === \"line\") {\r\n let {pt, norm} = args[0];\r\n this.pt = new Flatten.Point(pt);\r\n this.norm = new Flatten.Vector(norm);\r\n return;\r\n }\r\n\r\n if (args.length == 2) {\r\n let a1 = args[0];\r\n let a2 = args[1];\r\n\r\n if (a1 instanceof Flatten.Point && a2 instanceof Flatten.Point) {\r\n this.pt = a1;\r\n this.norm = Line.points2norm(a1, a2);\r\n if (this.norm.dot(vector$1(this.pt.x,this.pt.y)) >= 0) {\r\n this.norm.invert();\r\n }\r\n return;\r\n }\r\n\r\n if (a1 instanceof Flatten.Point && a2 instanceof Flatten.Vector) {\r\n if (Flatten.Utils.EQ_0(a2.x) && Flatten.Utils.EQ_0(a2.y)) {\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n this.pt = a1.clone();\r\n this.norm = a2.clone();\r\n this.norm = this.norm.normalize();\r\n if (this.norm.dot(vector$1(this.pt.x,this.pt.y)) >= 0) {\r\n this.norm.invert();\r\n }\r\n return;\r\n }\r\n\r\n if (a1 instanceof Flatten.Vector && a2 instanceof Flatten.Point) {\r\n if (Flatten.Utils.EQ_0(a1.x) && Flatten.Utils.EQ_0(a1.y)) {\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n this.pt = a2.clone();\r\n this.norm = a1.clone();\r\n this.norm = this.norm.normalize();\r\n if (this.norm.dot(vector$1(this.pt.x,this.pt.y)) >= 0) {\r\n this.norm.invert();\r\n }\r\n return;\r\n }\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Return new cloned instance of line\r\n * @returns {Line}\r\n */\r\n clone() {\r\n return new Flatten.Line(this.pt, this.norm);\r\n }\r\n\r\n /* The following methods need for implementation of Edge interface\r\n /**\r\n * Line has no start point\r\n * @returns {undefined}\r\n */\r\n get start() {return undefined;}\r\n\r\n /**\r\n * Line has no end point\r\n */\r\n get end() {return undefined;}\r\n\r\n /**\r\n * Return positive infinity number as length\r\n * @returns {number}\r\n */\r\n get length() {return Number.POSITIVE_INFINITY;}\r\n\r\n /**\r\n * Returns infinite box\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return new Flatten.Box(\r\n Number.NEGATIVE_INFINITY,\r\n Number.NEGATIVE_INFINITY,\r\n Number.POSITIVE_INFINITY,\r\n Number.POSITIVE_INFINITY\r\n )\r\n }\r\n\r\n /**\r\n * Middle point is undefined\r\n * @returns {undefined}\r\n */\r\n get middle() {return undefined}\r\n\r\n /**\r\n * Slope of the line - angle in radians between line and axe x from 0 to 2PI\r\n * @returns {number} - slope of the line\r\n */\r\n get slope() {\r\n let vec = new Flatten.Vector(this.norm.y, -this.norm.x);\r\n return vec.slope;\r\n }\r\n\r\n /**\r\n * Get coefficients [A,B,C] of a standard line equation in the form Ax + By = C\r\n * @code [A, B, C] = line.standard\r\n * @returns {number[]} - array of coefficients\r\n */\r\n get standard() {\r\n let A = this.norm.x;\r\n let B = this.norm.y;\r\n let C = this.norm.dot(this.pt);\r\n\r\n return [A, B, C];\r\n }\r\n\r\n /**\r\n * Return true if parallel or incident to other line\r\n * @param {Line} other_line - line to check\r\n * @returns {boolean}\r\n */\r\n parallelTo(other_line) {\r\n return Flatten.Utils.EQ_0(this.norm.cross(other_line.norm));\r\n }\r\n\r\n /**\r\n * Returns true if incident to other line\r\n * @param {Line} other_line - line to check\r\n * @returns {boolean}\r\n */\r\n incidentTo(other_line) {\r\n return this.parallelTo(other_line) && this.pt.on(other_line);\r\n }\r\n\r\n /**\r\n * Returns true if point belongs to line\r\n * @param {Point} pt Query point\r\n * @returns {boolean}\r\n */\r\n contains(pt) {\r\n if (this.pt.equalTo(pt)) {\r\n return true;\r\n }\r\n /* Line contains point if vector to point is orthogonal to the line normal vector */\r\n let vec = new Flatten.Vector(this.pt, pt);\r\n return Flatten.Utils.EQ_0(this.norm.dot(vec));\r\n }\r\n\r\n /**\r\n * Return coordinate of the point that lays on the line in the transformed\r\n * coordinate system where center is the projection of the point(0,0) to\r\n * the line and axe y is collinear to the normal vector.
\r\n * This method assumes that point lays on the line and does not check it\r\n * @param {Point} pt - point on line\r\n * @returns {number}\r\n */\r\n coord(pt) {\r\n return vector$1(pt.x, pt.y).cross(this.norm);\r\n }\r\n\r\n /**\r\n * Returns array of intersection points\r\n * @param {Shape} shape - shape to intersect with\r\n * @returns {Point[]}\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.contains(shape) ? [shape] : [];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n return intersectLine2Line(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return intersectLine2Circle(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Box) {\r\n return intersectLine2Box(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return intersectSegment2Line(shape, this);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n return intersectLine2Arc(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n return intersectLine2Polygon(this, shape);\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment from line to shape and returns array [distance, shortest_segment]\r\n * @param {Shape} shape Shape of the one of the types Point, Circle, Segment, Arc, Polygon\r\n * @returns {Number}\r\n * @returns {Segment}\r\n */\r\n distanceTo(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n let [distance, shortest_segment] = Flatten.Distance.point2line(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n let [distance, shortest_segment] = Flatten.Distance.circle2line(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n let [distance, shortest_segment] = Flatten.Distance.segment2line(shape, this);\r\n return [distance, shortest_segment.reverse()];\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n let [distance, shortest_segment] = Flatten.Distance.arc2line(shape, this);\r\n return [distance, shortest_segment.reverse()];\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n let [distance, shortest_segment] = Flatten.Distance.shape2polygon(this, shape);\r\n return [distance, shortest_segment];\r\n }\r\n }\r\n\r\n /**\r\n * Split line with array of points and return array of shapes\r\n * Assumed that all points lay on the line\r\n * @param {Point[]}\r\n * @returns {Shape[]}\r\n */\r\n split(pt) {\r\n if (pt instanceof Flatten.Point) {\r\n return [new Flatten.Ray(pt, this.norm.invert()), new Flatten.Ray(pt, this.norm)]\r\n }\r\n else {\r\n let multiline = new Flatten.Multiline([this]);\r\n let sorted_points = this.sortPoints(pt);\r\n multiline.split(sorted_points);\r\n return multiline.toShapes();\r\n }\r\n }\r\n\r\n /**\r\n * Sort given array of points that lay on line with respect to coordinate on a line\r\n * The method assumes that points lay on the line and does not check this\r\n * @param {Point[]} pts - array of points\r\n * @returns {Point[]} new array sorted\r\n */\r\n sortPoints(pts) {\r\n return pts.slice().sort( (pt1, pt2) => {\r\n if (this.coord(pt1) < this.coord(pt2)) {\r\n return -1;\r\n }\r\n if (this.coord(pt1) > this.coord(pt2)) {\r\n return 1;\r\n }\r\n return 0;\r\n })\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({}, this, {name: \"line\"});\r\n }\r\n\r\n /**\r\n * Return string to draw svg segment representing line inside given box\r\n * @param {Box} box Box representing drawing area\r\n * @param {Object} attrs - an object with attributes of svg circle element\r\n */\r\n svg(box, attrs = {}) {\r\n let ip = intersectLine2Box(this, box);\r\n if (ip.length === 0)\r\n return \"\";\r\n let ps = ip[0];\r\n let pe = ip.length == 2 ? ip[1] : ip.find(pt => !pt.equalTo(ps));\r\n if (pe === undefined) pe = ps;\r\n let segment = new Flatten.Segment(ps, pe);\r\n return segment.svg(attrs);\r\n }\r\n\r\n static points2norm(pt1, pt2) {\r\n if (pt1.equalTo(pt2)) {\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n let vec = new Flatten.Vector(pt1, pt2);\r\n let unit = vec.normalize();\r\n return unit.rotate90CCW();\r\n }\r\n}\r\nFlatten.Line = Line;\r\n/**\r\n * Function to create line equivalent to \"new\" constructor\r\n * @param args\r\n */\r\nconst line = (...args) => new Flatten.Line(...args);\r\nFlatten.line = line;\r\n\r\n/**\r\n * Created by Alex Bol on 3/6/2017.\r\n */\r\n\r\n/**\r\n * Class representing a circle\r\n * @type {Circle}\r\n */\r\nclass Circle {\r\n /**\r\n *\r\n * @param {Point} pc - circle center point\r\n * @param {number} r - circle radius\r\n */\r\n constructor(...args) {\r\n /**\r\n * Circle center\r\n * @type {Point}\r\n */\r\n this.pc = new Flatten.Point();\r\n /**\r\n * Circle radius\r\n * @type {number}\r\n */\r\n this.r = 1;\r\n\r\n if (args.length == 1 && args[0] instanceof Object && args[0].name === \"circle\") {\r\n let {pc, r} = args[0];\r\n this.pc = new Flatten.Point(pc);\r\n this.r = r;\r\n return;\r\n } else {\r\n let [pc, r] = [...args];\r\n if (pc && pc instanceof Flatten.Point) this.pc = pc.clone();\r\n if (r !== undefined) this.r = r;\r\n return;\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Return new cloned instance of circle\r\n * @returns {Circle}\r\n */\r\n clone() {\r\n return new Flatten.Circle(this.pc.clone(), this.r);\r\n }\r\n\r\n /**\r\n * Circle center\r\n * @returns {Point}\r\n */\r\n get center() {\r\n return this.pc;\r\n }\r\n\r\n /**\r\n * Circle bounding box\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return new Flatten.Box(\r\n this.pc.x - this.r,\r\n this.pc.y - this.r,\r\n this.pc.x + this.r,\r\n this.pc.y + this.r\r\n );\r\n }\r\n\r\n /**\r\n * Return true if circle contains shape: no point of shape lies outside of the circle\r\n * @param {Shape} shape - test shape\r\n * @returns {boolean}\r\n */\r\n contains(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return Flatten.Utils.LE(shape.distanceTo(this.center)[0], this.r);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return Flatten.Utils.LE(shape.start.distanceTo(this.center)[0], this.r) &&\r\n Flatten.Utils.LE(shape.end.distanceTo(this.center)[0], this.r);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n return this.intersect(shape).length === 0 &&\r\n Flatten.Utils.LE(shape.start.distanceTo(this.center)[0], this.r) &&\r\n Flatten.Utils.LE(shape.end.distanceTo(this.center)[0], this.r);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return this.intersect(shape).length === 0 &&\r\n Flatten.Utils.LE(shape.r, this.r) &&\r\n Flatten.Utils.LE(shape.center.distanceTo(this.center)[0], this.r);\r\n }\r\n\r\n /* TODO: box, polygon */\r\n }\r\n\r\n /**\r\n * Transform circle to closed arc\r\n * @param {boolean} counterclockwise\r\n * @returns {Arc}\r\n */\r\n toArc(counterclockwise = true) {\r\n return new Flatten.Arc(this.center, this.r, Math.PI, -Math.PI, counterclockwise);\r\n }\r\n\r\n /**\r\n * Returns array of intersection points between circle and other shape\r\n * @param {Shape} shape Shape of the one of supported types\r\n * @returns {Point[]}\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.contains(shape) ? [shape] : [];\r\n }\r\n if (shape instanceof Flatten.Line) {\r\n return intersectLine2Circle(shape, this);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return intersectSegment2Circle(shape, this);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return intersectCircle2Circle(shape, this);\r\n }\r\n\r\n if (shape instanceof Flatten.Box) {\r\n return intersectCircle2Box(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n return intersectArc2Circle(shape, this);\r\n }\r\n if (shape instanceof Flatten.Polygon) {\r\n return intersectCircle2Polygon(this, shape);\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment from circle to shape and return array [distance, shortest segment]\r\n * @param {Shape} shape Shape of the one of supported types Point, Line, Circle, Segment, Arc, Polygon or Planar Set\r\n * @returns {number} distance from circle to shape\r\n * @returns {Segment} shortest segment between circle and shape (started at circle, ended at shape)\r\n\r\n */\r\n distanceTo(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n let [distance, shortest_segment] = Flatten.Distance.point2circle(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n let [distance, shortest_segment] = Flatten.Distance.circle2circle(this, shape);\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n let [distance, shortest_segment] = Flatten.Distance.circle2line(this, shape);\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n let [distance, shortest_segment] = Flatten.Distance.segment2circle(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n let [distance, shortest_segment] = Flatten.Distance.arc2circle(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n let [distance, shortest_segment] = Flatten.Distance.shape2polygon(this, shape);\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.PlanarSet) {\r\n let [dist, shortest_segment] = Flatten.Distance.shape2planarSet(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({}, this, {name: \"circle\"});\r\n }\r\n\r\n /**\r\n * Return string to draw circle in svg\r\n * @param {Object} attrs - an object with attributes of svg circle element,\r\n * like \"stroke\", \"strokeWidth\", \"fill\"
\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\", fill:\"none\"\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let {stroke, strokeWidth, fill, fillOpacity, id, className} = attrs;\r\n // let rest_str = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n\r\n return `\\n`;\r\n }\r\n\r\n}\r\nFlatten.Circle = Circle;\r\n/**\r\n * Shortcut to create new circle\r\n * @param args\r\n */\r\nconst circle = (...args) => new Flatten.Circle(...args);\r\nFlatten.circle = circle;\r\n\r\n/**\r\n * Created by Alex Bol on 3/10/2017.\r\n */\r\n\r\n/**\r\n * Class representing a circular arc\r\n * @type {Arc}\r\n */\r\nclass Arc {\r\n /**\r\n *\r\n * @param {Point} pc - arc center\r\n * @param {number} r - arc radius\r\n * @param {number} startAngle - start angle in radians from 0 to 2*PI\r\n * @param {number} endAngle - end angle in radians from 0 to 2*PI\r\n * @param {boolean} counterClockwise - arc direction, true - clockwise, false - counter clockwise\r\n */\r\n constructor(...args) {\r\n /**\r\n * Arc center\r\n * @type {Point}\r\n */\r\n this.pc = new Flatten.Point();\r\n /**\r\n * Arc radius\r\n * @type {number}\r\n */\r\n this.r = 1;\r\n /**\r\n * Arc start angle in radians\r\n * @type {number}\r\n */\r\n this.startAngle = 0;\r\n /**\r\n * Arc end angle in radians\r\n * @type {number}\r\n */\r\n this.endAngle = 2 * Math.PI;\r\n /**\r\n * Arc orientation\r\n * @type {boolean}\r\n */\r\n this.counterClockwise = Flatten.CCW;\r\n\r\n if (args.length == 0)\r\n return;\r\n\r\n if (args.length == 1 && args[0] instanceof Object && args[0].name === \"arc\") {\r\n let {pc, r, startAngle, endAngle, counterClockwise} = args[0];\r\n this.pc = new Flatten.Point(pc.x, pc.y);\r\n this.r = r;\r\n this.startAngle = startAngle;\r\n this.endAngle = endAngle;\r\n this.counterClockwise = counterClockwise;\r\n return;\r\n } else {\r\n let [pc, r, startAngle, endAngle, counterClockwise] = [...args];\r\n if (pc && pc instanceof Flatten.Point) this.pc = pc.clone();\r\n if (r !== undefined) this.r = r;\r\n if (startAngle !== undefined) this.startAngle = startAngle;\r\n if (endAngle !== undefined) this.endAngle = endAngle;\r\n if (counterClockwise !== undefined) this.counterClockwise = counterClockwise;\r\n return;\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Return new cloned instance of arc\r\n * @returns {Arc}\r\n */\r\n clone() {\r\n return new Flatten.Arc(this.pc.clone(), this.r, this.startAngle, this.endAngle, this.counterClockwise);\r\n }\r\n\r\n /**\r\n * Get sweep angle in radians. Sweep angle is non-negative number from 0 to 2*PI\r\n * @returns {number}\r\n */\r\n get sweep() {\r\n if (Flatten.Utils.EQ(this.startAngle, this.endAngle))\r\n return 0.0;\r\n if (Flatten.Utils.EQ(Math.abs(this.startAngle - this.endAngle), Flatten.PIx2)) {\r\n return Flatten.PIx2;\r\n }\r\n let sweep;\r\n if (this.counterClockwise) {\r\n sweep = Flatten.Utils.GT(this.endAngle, this.startAngle) ?\r\n this.endAngle - this.startAngle : this.endAngle - this.startAngle + Flatten.PIx2;\r\n } else {\r\n sweep = Flatten.Utils.GT(this.startAngle, this.endAngle) ?\r\n this.startAngle - this.endAngle : this.startAngle - this.endAngle + Flatten.PIx2;\r\n }\r\n\r\n if (Flatten.Utils.GT(sweep, Flatten.PIx2)) {\r\n sweep -= Flatten.PIx2;\r\n }\r\n if (Flatten.Utils.LT(sweep, 0)) {\r\n sweep += Flatten.PIx2;\r\n }\r\n return sweep;\r\n }\r\n\r\n /**\r\n * Get start point of arc\r\n * @returns {Point}\r\n */\r\n get start() {\r\n let p0 = new Flatten.Point(this.pc.x + this.r, this.pc.y);\r\n return p0.rotate(this.startAngle, this.pc);\r\n }\r\n\r\n /**\r\n * Get end point of arc\r\n * @returns {Point}\r\n */\r\n get end() {\r\n let p0 = new Flatten.Point(this.pc.x + this.r, this.pc.y);\r\n return p0.rotate(this.endAngle, this.pc);\r\n }\r\n\r\n /**\r\n * Get center of arc\r\n * @returns {Point}\r\n */\r\n get center() {\r\n return this.pc.clone();\r\n }\r\n\r\n get vertices() {\r\n return [this.start.clone(), this.end.clone()];\r\n }\r\n\r\n /**\r\n * Get arc length\r\n * @returns {number}\r\n */\r\n get length() {\r\n return Math.abs(this.sweep * this.r);\r\n }\r\n\r\n /**\r\n * Get bounding box of the arc\r\n * @returns {Box}\r\n */\r\n get box() {\r\n let func_arcs = this.breakToFunctional();\r\n let box = func_arcs.reduce((acc, arc) => acc.merge(arc.start.box), new Flatten.Box());\r\n box = box.merge(this.end.box);\r\n return box;\r\n }\r\n\r\n /**\r\n * Returns true if arc contains point, false otherwise\r\n * @param {Point} pt - point to test\r\n * @returns {boolean}\r\n */\r\n contains(pt) {\r\n // first check if point on circle (pc,r)\r\n if (!Flatten.Utils.EQ(this.pc.distanceTo(pt)[0], this.r))\r\n return false;\r\n\r\n // point on circle\r\n\r\n if (pt.equalTo(this.start))\r\n return true;\r\n\r\n let angle = new Flatten.Vector(this.pc, pt).slope;\r\n let test_arc = new Flatten.Arc(this.pc, this.r, this.startAngle, angle, this.counterClockwise);\r\n return Flatten.Utils.LE(test_arc.length, this.length);\r\n }\r\n\r\n /**\r\n * When given point belongs to arc, return array of two arcs split by this point. If points is incident\r\n * to start or end point of the arc, return clone of the arc. If point does not belong to the arcs, return\r\n * empty array.\r\n * @param {Point} pt Query point\r\n * @returns {Arc[]}\r\n */\r\n split(pt) {\r\n if (this.start.equalTo(pt))\r\n return [null, this.clone()];\r\n\r\n if (this.end.equalTo(pt))\r\n return [this.clone(), null];\r\n\r\n let angle = new Flatten.Vector(this.pc, pt).slope;\r\n\r\n return [\r\n new Flatten.Arc(this.pc, this.r, this.startAngle, angle, this.counterClockwise),\r\n new Flatten.Arc(this.pc, this.r, angle, this.endAngle, this.counterClockwise)\r\n ]\r\n }\r\n\r\n /**\r\n * Return middle point of the arc\r\n * @returns {Point}\r\n */\r\n middle() {\r\n let endAngle = this.counterClockwise ? this.startAngle + this.sweep / 2 : this.startAngle - this.sweep / 2;\r\n let arc = new Flatten.Arc(this.pc, this.r, this.startAngle, endAngle, this.counterClockwise);\r\n return arc.end;\r\n }\r\n\r\n /**\r\n * Get point at given length\r\n * @param {number} length - The length along the arc\r\n * @returns {Point}\r\n */\r\n pointAtLength(length) {\r\n if (length > this.length || length < 0) return null;\r\n if (length == 0) return this.start;\r\n if (length == this.length) return this.end;\r\n let factor = length / this.length;\r\n let endAngle = this.counterClockwise ? this.startAngle + this.sweep * factor : this.startAngle - this.sweep * factor;\r\n let arc = new Flatten.Arc(this.pc, this.r, this.startAngle, endAngle, this.counterClockwise);\r\n return arc.end;\r\n }\r\n\r\n /**\r\n * Returns chord height (\"sagitta\") of the arc\r\n * @returns {number}\r\n */\r\n chordHeight() {\r\n return (1.0 - Math.cos(Math.abs(this.sweep / 2.0))) * this.r;\r\n }\r\n\r\n /**\r\n * Returns array of intersection points between arc and other shape\r\n * @param {Shape} shape Shape of the one of supported types
\r\n * @returns {Points[]}\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.contains(shape) ? [shape] : [];\r\n }\r\n if (shape instanceof Flatten.Line) {\r\n return intersectLine2Arc(shape, this);\r\n }\r\n if (shape instanceof Flatten.Circle) {\r\n return intersectArc2Circle(this, shape);\r\n }\r\n if (shape instanceof Flatten.Segment) {\r\n return intersectSegment2Arc(shape, this);\r\n }\r\n if (shape instanceof Flatten.Box) {\r\n return intersectArc2Box(this, shape);\r\n }\r\n if (shape instanceof Flatten.Arc) {\r\n return intersectArc2Arc(this, shape);\r\n }\r\n if (shape instanceof Flatten.Polygon) {\r\n return intersectArc2Polygon(this, shape);\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment from arc to shape and return array [distance, shortest segment]\r\n * @param {Shape} shape Shape of the one of supported types Point, Line, Circle, Segment, Arc, Polygon or Planar Set\r\n * @returns {number} distance from arc to shape\r\n * @returns {Segment} shortest segment between arc and shape (started at arc, ended at shape)\r\n\r\n */\r\n distanceTo(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n let [dist, shortest_segment] = Flatten.Distance.point2arc(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n let [dist, shortest_segment] = Flatten.Distance.arc2circle(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n let [dist, shortest_segment] = Flatten.Distance.arc2line(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n let [dist, shortest_segment] = Flatten.Distance.segment2arc(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n let [dist, shortest_segment] = Flatten.Distance.arc2arc(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n let [dist, shortest_segment] = Flatten.Distance.shape2polygon(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.PlanarSet) {\r\n let [dist, shortest_segment] = Flatten.Distance.shape2planarSet(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n }\r\n\r\n /**\r\n * Breaks arc in extreme point 0, pi/2, pi, 3*pi/2 and returns array of sub-arcs\r\n * @returns {Arcs[]}\r\n */\r\n breakToFunctional() {\r\n let func_arcs_array = [];\r\n let angles = [0, Math.PI / 2, 2 * Math.PI / 2, 3 * Math.PI / 2];\r\n let pts = [\r\n this.pc.translate(this.r, 0),\r\n this.pc.translate(0, this.r),\r\n this.pc.translate(-this.r, 0),\r\n this.pc.translate(0, -this.r)\r\n ];\r\n\r\n // If arc contains extreme point,\r\n // create test arc started at start point and ended at this extreme point\r\n let test_arcs = [];\r\n for (let i = 0; i < 4; i++) {\r\n if (pts[i].on(this)) {\r\n test_arcs.push(new Flatten.Arc(this.pc, this.r, this.startAngle, angles[i], this.counterClockwise));\r\n }\r\n }\r\n\r\n if (test_arcs.length == 0) { // arc does contain any extreme point\r\n func_arcs_array.push(this.clone());\r\n } else { // arc passes extreme point\r\n // sort these arcs by length\r\n test_arcs.sort((arc1, arc2) => arc1.length - arc2.length);\r\n\r\n for (let i = 0; i < test_arcs.length; i++) {\r\n let prev_arc = func_arcs_array.length > 0 ? func_arcs_array[func_arcs_array.length - 1] : undefined;\r\n let new_arc;\r\n if (prev_arc) {\r\n new_arc = new Flatten.Arc(this.pc, this.r, prev_arc.endAngle, test_arcs[i].endAngle, this.counterClockwise);\r\n } else {\r\n new_arc = new Flatten.Arc(this.pc, this.r, this.startAngle, test_arcs[i].endAngle, this.counterClockwise);\r\n }\r\n if (!Flatten.Utils.EQ_0(new_arc.length)) {\r\n func_arcs_array.push(new_arc.clone());\r\n }\r\n }\r\n\r\n // add last sub arc\r\n let prev_arc = func_arcs_array.length > 0 ? func_arcs_array[func_arcs_array.length - 1] : undefined;\r\n let new_arc;\r\n if (prev_arc) {\r\n new_arc = new Flatten.Arc(this.pc, this.r, prev_arc.endAngle, this.endAngle, this.counterClockwise);\r\n } else {\r\n new_arc = new Flatten.Arc(this.pc, this.r, this.startAngle, this.endAngle, this.counterClockwise);\r\n }\r\n // It could be 2*PI when occasionally start = 0 and end = 2*PI but this is not valid for breakToFunctional\r\n if (!Flatten.Utils.EQ_0(new_arc.length) && !Flatten.Utils.EQ(new_arc.sweep, 2*Math.PI)) {\r\n func_arcs_array.push(new_arc.clone());\r\n }\r\n }\r\n return func_arcs_array;\r\n }\r\n\r\n /**\r\n * Return tangent unit vector in the start point in the direction from start to end\r\n * @returns {Vector}\r\n */\r\n tangentInStart() {\r\n let vec = new Flatten.Vector(this.pc, this.start);\r\n let angle = this.counterClockwise ? Math.PI / 2. : -Math.PI / 2.;\r\n let tangent = vec.rotate(angle).normalize();\r\n return tangent;\r\n }\r\n\r\n /**\r\n * Return tangent unit vector in the end point in the direction from end to start\r\n * @returns {Vector}\r\n */\r\n tangentInEnd() {\r\n let vec = new Flatten.Vector(this.pc, this.end);\r\n let angle = this.counterClockwise ? -Math.PI / 2. : Math.PI / 2.;\r\n let tangent = vec.rotate(angle).normalize();\r\n return tangent;\r\n }\r\n\r\n /**\r\n * Returns new arc with swapped start and end angles and reversed direction\r\n * @returns {Arc}\r\n */\r\n reverse() {\r\n return new Flatten.Arc(this.pc, this.r, this.endAngle, this.startAngle, !this.counterClockwise);\r\n }\r\n\r\n /**\r\n * Returns new arc translated by vector vec\r\n * @param {Vector} vec\r\n * @returns {Segment}\r\n */\r\n translate(...args) {\r\n let arc = this.clone();\r\n arc.pc = this.pc.translate(...args);\r\n return arc;\r\n }\r\n\r\n /**\r\n * Return new segment rotated by given angle around given point\r\n * If point omitted, rotate around origin (0,0)\r\n * Positive value of angle defines rotation counter clockwise, negative - clockwise\r\n * @param {number} angle - rotation angle in radians\r\n * @param {Point} center - center point, default is (0,0)\r\n * @returns {Arc}\r\n */\r\n rotate(angle = 0, center = new Flatten.Point()) {\r\n let m = new Flatten.Matrix();\r\n m = m.translate(center.x, center.y).rotate(angle).translate(-center.x, -center.y);\r\n return this.transform(m);\r\n }\r\n\r\n /**\r\n * Return new arc scaled by scaleX, scaleY.\r\n * @param {number} scaleX - scale value by X\r\n * @param {number} scaleY - scale value by Y\r\n * @returns {Arc}\r\n */\r\n scale(scaleX = 1, scaleY = 1) {\r\n let m = new Flatten.Matrix();\r\n m = m.scale(scaleX, scaleY);\r\n return this.transform(m);\r\n }\r\n\r\n /**\r\n * Return new arc transformed using affine transformation matrix
\r\n * Note 1. Non-equal scaling by x and y (abs(matrix[0]) != abs(matrix[3])) produce illegal result because\r\n * it should create elliptic arc but this package does not support ellipses\r\n * Note 2. Mirror transformation (matrix[0] * matrix[3] < 0) change direction of the arc to the opposite\r\n * TODO: support non-equal scaling arc to ellipse or throw exception ?\r\n * @param {Matrix} matrix - affine transformation matrix\r\n * @returns {Arc}\r\n */\r\n transform(matrix = new Flatten.Matrix()) {\r\n let newStart = this.start.transform(matrix);\r\n let newEnd = this.end.transform(matrix);\r\n let newCenter = this.pc.transform(matrix);\r\n let newDirection = this.counterClockwise;\r\n if (matrix.a * matrix.d < 0) {\r\n newDirection = !newDirection;\r\n }\r\n let arc = Flatten.Arc.arcSE(newCenter, newStart, newEnd, newDirection);\r\n return arc;\r\n }\r\n\r\n static arcSE(center, start, end, counterClockwise) {\r\n let {vector} = Flatten;\r\n let startAngle = vector(center, start).slope;\r\n let endAngle = vector(center, end).slope;\r\n if (Flatten.Utils.EQ(startAngle, endAngle)) {\r\n endAngle += 2 * Math.PI;\r\n counterClockwise = true;\r\n }\r\n let r = vector(center, start).length;\r\n\r\n return new Flatten.Arc(center, r, startAngle, endAngle, counterClockwise);\r\n }\r\n\r\n definiteIntegral(ymin = 0) {\r\n let f_arcs = this.breakToFunctional();\r\n let area = f_arcs.reduce((acc, arc) => acc + arc.circularSegmentDefiniteIntegral(ymin), 0.0);\r\n return area;\r\n }\r\n\r\n circularSegmentDefiniteIntegral(ymin) {\r\n let line = new Flatten.Line(this.start, this.end);\r\n let onLeftSide = this.pc.leftTo(line);\r\n let segment = new Flatten.Segment(this.start, this.end);\r\n let areaTrapez = segment.definiteIntegral(ymin);\r\n let areaCircularSegment = this.circularSegmentArea();\r\n let area = onLeftSide ? areaTrapez - areaCircularSegment : areaTrapez + areaCircularSegment;\r\n return area;\r\n }\r\n\r\n circularSegmentArea() {\r\n return (0.5 * this.r * this.r * (this.sweep - Math.sin(this.sweep)))\r\n }\r\n\r\n /**\r\n * Sort given array of points from arc start to end, assuming all points lay on the arc\r\n * @param {Point[]} array of points\r\n * @returns {Point[]} new array sorted\r\n */\r\n sortPoints(pts) {\r\n let {vector} = Flatten;\r\n return pts.slice().sort( (pt1, pt2) => {\r\n let slope1 = vector(this.pc, pt1).slope;\r\n let slope2 = vector(this.pc, pt2).slope;\r\n if (slope1 < slope2) {\r\n return -1;\r\n }\r\n if (slope1 > slope2) {\r\n return 1;\r\n }\r\n return 0;\r\n })\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({}, this, {name: \"arc\"});\r\n }\r\n\r\n /**\r\n * Return string to draw arc in svg\r\n * @param {Object} attrs - an object with attributes of svg path element,\r\n * like \"stroke\", \"strokeWidth\", \"fill\"
\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\", fill:\"none\"\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let largeArcFlag = this.sweep <= Math.PI ? \"0\" : \"1\";\r\n let sweepFlag = this.counterClockwise ? \"1\" : \"0\";\r\n let {stroke, strokeWidth, fill, id, className} = attrs;\r\n // let rest_str = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n\r\n if (Flatten.Utils.EQ(this.sweep, 2 * Math.PI)) {\r\n let circle = new Flatten.Circle(this.pc, this.r);\r\n return circle.svg(attrs);\r\n } else {\r\n return `\\n`\r\n }\r\n }\r\n\r\n}\r\nFlatten.Arc = Arc;\r\n/**\r\n * Function to create arc equivalent to \"new\" constructor\r\n * @param args\r\n */\r\nconst arc = (...args) => new Flatten.Arc(...args);\r\nFlatten.arc = arc;\r\n\r\n/**\r\n * Created by Alex Bol on 3/7/2017.\r\n */\r\n\r\n/**\r\n * Class Box represent bounding box of the shape\r\n * @type {Box}\r\n */\r\nclass Box {\r\n /**\r\n *\r\n * @param {number} xmin - minimal x coordinate\r\n * @param {number} ymin - minimal y coordinate\r\n * @param {number} xmax - maximal x coordinate\r\n * @param {number} ymax - maximal y coordinate\r\n */\r\n constructor(xmin = undefined, ymin = undefined, xmax = undefined, ymax = undefined) {\r\n /**\r\n * Minimal x coordinate\r\n * @type {number}\r\n */\r\n this.xmin = xmin;\r\n /**\r\n * Minimal y coordinate\r\n * @type {number}\r\n */\r\n this.ymin = ymin;\r\n /**\r\n * Maximal x coordinate\r\n * @type {number}\r\n */\r\n this.xmax = xmax;\r\n /**\r\n * Maximal y coordinate\r\n * @type {number}\r\n */\r\n this.ymax = ymax;\r\n }\r\n\r\n /**\r\n * Return new cloned instance of box\r\n * @returns {Box}\r\n */\r\n clone() {\r\n return new Box(this.xmin, this.ymin, this.xmax, this.ymax);\r\n }\r\n\r\n /**\r\n * Property low need for interval tree interface\r\n * @returns {Point}\r\n */\r\n get low() {\r\n return new Flatten.Point(this.xmin, this.ymin);\r\n }\r\n\r\n /**\r\n * Property high need for interval tree interface\r\n * @returns {Point}\r\n */\r\n get high() {\r\n return new Flatten.Point(this.xmax, this.ymax);\r\n }\r\n\r\n /**\r\n * Property max returns the box itself !\r\n * @returns {Box}\r\n */\r\n get max() {\r\n return this.clone();\r\n }\r\n \r\n /**\r\n * Return center of the box\r\n * @returns {Point}\r\n */\r\n get center() {\r\n return new Flatten.Point((this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2);\r\n }\r\n\r\n /**\r\n * Return the width of the box\r\n * @returns {number}\r\n */\r\n get width() {\r\n return Math.abs(this.xmax - this.xmin);\r\n }\r\n\r\n /**\r\n * Return the height of the box\r\n * @returns {number}\r\n */\r\n get height() {\r\n return Math.abs(this.ymax - this.ymin);\r\n }\r\n \r\n /**\r\n * Return property box like all other shapes\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return this.clone();\r\n }\r\n\r\n /**\r\n * Returns true if not intersected with other box\r\n * @param {Box} other_box - other box to test\r\n * @returns {boolean}\r\n */\r\n not_intersect(other_box) {\r\n return (\r\n this.xmax < other_box.xmin ||\r\n this.xmin > other_box.xmax ||\r\n this.ymax < other_box.ymin ||\r\n this.ymin > other_box.ymax\r\n );\r\n }\r\n\r\n /**\r\n * Returns true if intersected with other box\r\n * @param {Box} other_box - Query box\r\n * @returns {boolean}\r\n */\r\n intersect(other_box) {\r\n return !this.not_intersect(other_box);\r\n }\r\n\r\n /**\r\n * Returns new box merged with other box\r\n * @param {Box} other_box - Other box to merge with\r\n * @returns {Box}\r\n */\r\n merge(other_box) {\r\n return new Box(\r\n this.xmin === undefined ? other_box.xmin : Math.min(this.xmin, other_box.xmin),\r\n this.ymin === undefined ? other_box.ymin : Math.min(this.ymin, other_box.ymin),\r\n this.xmax === undefined ? other_box.xmax : Math.max(this.xmax, other_box.xmax),\r\n this.ymax === undefined ? other_box.ymax : Math.max(this.ymax, other_box.ymax)\r\n );\r\n }\r\n\r\n /**\r\n * Defines predicate \"less than\" between two boxes. Need for interval index\r\n * @param {Box} other_box - other box\r\n * @returns {boolean} - true if this box less than other box, false otherwise\r\n */\r\n less_than(other_box) {\r\n if (this.low.lessThan(other_box.low))\r\n return true;\r\n if (this.low.equalTo(other_box.low) && this.high.lessThan(other_box.high))\r\n return true;\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns true if this box is equal to other box, false otherwise\r\n * @param {Box} other_box - query box\r\n * @returns {boolean}\r\n */\r\n equal_to(other_box) {\r\n return (this.low.equalTo(other_box.low) && this.high.equalTo(other_box.high));\r\n }\r\n\r\n output() {\r\n return this.clone();\r\n }\r\n\r\n static comparable_max(box1, box2) {\r\n // return pt1.lessThan(pt2) ? pt2.clone() : pt1.clone();\r\n return box1.merge(box2);\r\n }\r\n\r\n static comparable_less_than(pt1, pt2) {\r\n return pt1.lessThan(pt2);\r\n }\r\n\r\n /**\r\n * Set new values to the box object\r\n * @param {number} xmin - miminal x coordinate\r\n * @param {number} ymin - minimal y coordinate\r\n * @param {number} xmax - maximal x coordinate\r\n * @param {number} ymax - maximal y coordinate\r\n */\r\n set(xmin, ymin, xmax, ymax) {\r\n this.xmin = xmin;\r\n this.ymin = ymin;\r\n this.xmax = xmax;\r\n this.ymax = ymax;\r\n }\r\n\r\n /**\r\n * Transform box into array of points from low left corner in counter clockwise\r\n * @returns {Point[]}\r\n */\r\n toPoints() {\r\n return [\r\n new Flatten.Point(this.xmin, this.ymin),\r\n new Flatten.Point(this.xmax, this.ymin),\r\n new Flatten.Point(this.xmax, this.ymax),\r\n new Flatten.Point(this.xmin, this.ymax)\r\n ];\r\n }\r\n\r\n /**\r\n * Transform box into array of segments from low left corner in counter clockwise\r\n * @returns {Segment[]}\r\n */\r\n toSegments() {\r\n let pts = this.toPoints();\r\n return [\r\n new Flatten.Segment(pts[0], pts[1]),\r\n new Flatten.Segment(pts[1], pts[2]),\r\n new Flatten.Segment(pts[2], pts[3]),\r\n new Flatten.Segment(pts[3], pts[0])\r\n ];\r\n }\r\n\r\n /**\r\n * Return string to draw circle in svg\r\n * @param {Object} attrs - an object with attributes of svg rectangle element,\r\n * like \"stroke\", \"strokeWidth\", \"fill\"
\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\", fill:\"none\"\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let {stroke, strokeWidth, fill, id, className} = attrs;\r\n // let rest_str = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n let width = this.xmax - this.xmin;\r\n let height = this.ymax - this.ymin;\r\n\r\n return `\\n`;\r\n };\r\n}\r\nFlatten.Box = Box;\r\n/**\r\n * Shortcut to create new box\r\n * @param args\r\n * @returns {Box}\r\n */\r\nconst box = (...args) => new Flatten.Box(...args);\r\nFlatten.box = box;\r\n\r\n/**\r\n * Created by Alex Bol on 3/17/2017.\r\n */\r\n\r\n/**\r\n * Class representing an edge of polygon. Edge shape may be Segment or Arc.\r\n * Each edge contains references to the next and previous edges in the face of the polygon.\r\n *\r\n * @type {Edge}\r\n */\r\nclass Edge {\r\n /**\r\n * Construct new instance of edge\r\n * @param {Shape} shape Shape of type Segment or Arc\r\n */\r\n constructor(shape) {\r\n /**\r\n * Shape of the edge: Segment or Arc\r\n * @type {Segment|Arc}\r\n */\r\n this.shape = shape;\r\n /**\r\n * Pointer to the next edge in the face\r\n * @type {Edge}\r\n */\r\n this.next = undefined;\r\n /**\r\n * Pointer to the previous edge in the face\r\n * @type {Edge}\r\n */\r\n this.prev = undefined;\r\n /**\r\n * Pointer to the face containing this edge\r\n * @type {Face}\r\n */\r\n this.face = undefined;\r\n /**\r\n * \"Arc distance\" from the face start\r\n * @type {number}\r\n */\r\n this.arc_length = 0;\r\n /**\r\n * Start inclusion flag (inside/outside/boundary)\r\n * @type {*}\r\n */\r\n this.bvStart = undefined;\r\n /**\r\n * End inclusion flag (inside/outside/boundary)\r\n * @type {*}\r\n */\r\n this.bvEnd = undefined;\r\n /**\r\n * Edge inclusion flag (Flatten.INSIDE, Flatten.OUTSIDE, Flatten.BOUNDARY)\r\n * @type {*}\r\n */\r\n this.bv = undefined;\r\n /**\r\n * Overlap flag for boundary edge (Flatten.OVERLAP_SAME/Flatten.OVERLAP_OPPOSITE)\r\n * @type {*}\r\n */\r\n this.overlap = undefined;\r\n }\r\n\r\n /**\r\n * Get edge start point\r\n */\r\n get start() {\r\n return this.shape.start;\r\n }\r\n\r\n /**\r\n * Get edge end point\r\n */\r\n get end() {\r\n return this.shape.end;\r\n }\r\n\r\n /**\r\n * Get edge length\r\n */\r\n get length() {\r\n return this.shape.length;\r\n }\r\n\r\n /**\r\n * Get bounding box of the edge\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return this.shape.box;\r\n }\r\n\r\n isSegment() {\r\n return this.shape instanceof Flatten.Segment;\r\n }\r\n\r\n isArc() {\r\n return this.shape instanceof Flatten.Arc;\r\n }\r\n\r\n /**\r\n * Get middle point of the edge\r\n * @returns {Point}\r\n */\r\n middle() {\r\n return this.shape.middle();\r\n }\r\n\r\n /**\r\n * Get point at given length\r\n * @param {number} length - The length along the edge\r\n * @returns {Point}\r\n */\r\n pointAtLength(length) {\r\n return this.shape.pointAtLength(length);\r\n }\r\n\r\n /**\r\n * Returns true if point belongs to the edge, false otherwise\r\n * @param {Point} pt - test point\r\n */\r\n contains(pt) {\r\n return this.shape.contains(pt);\r\n }\r\n\r\n /**\r\n * Set inclusion flag of the edge with respect to another polygon\r\n * Inclusion flag is one of Flatten.INSIDE, Flatten.OUTSIDE, Flatten.BOUNDARY\r\n * @param polygon\r\n */\r\n setInclusion(polygon) {\r\n if (this.bv !== undefined) return this.bv;\r\n\r\n if (this.shape instanceof Flatten.Line || this.shape instanceof Flatten.Ray) {\r\n this.bv = Flatten.OUTSIDE;\r\n return this.bv;\r\n }\r\n\r\n if (this.bvStart === undefined) {\r\n this.bvStart = ray_shoot(polygon, this.start);\r\n }\r\n if (this.bvEnd === undefined) {\r\n this.bvEnd = ray_shoot(polygon, this.end);\r\n }\r\n /* At least one end outside - the whole edge outside */\r\n if (this.bvStart === Flatten.OUTSIDE || this.bvEnd == Flatten.OUTSIDE) {\r\n this.bv = Flatten.OUTSIDE;\r\n }\r\n /* At least one end inside - the whole edge inside */\r\n else if (this.bvStart === Flatten.INSIDE || this.bvEnd == Flatten.INSIDE) {\r\n this.bv = Flatten.INSIDE;\r\n }\r\n /* Both are boundary - check the middle point */\r\n else {\r\n let bvMiddle = ray_shoot(polygon, this.middle());\r\n // let boundary = this.middle().distanceTo(polygon)[0] < 10*Flatten.DP_TOL;\r\n // let bvMiddle = boundary ? Flatten.BOUNDARY : ray_shoot(polygon, this.middle());\r\n this.bv = bvMiddle;\r\n }\r\n return this.bv;\r\n }\r\n\r\n /**\r\n * Set overlapping between two coincident boundary edges\r\n * Overlapping flag is one of Flatten.OVERLAP_SAME or Flatten.OVERLAP_OPPOSITE\r\n * @param edge\r\n */\r\n setOverlap(edge) {\r\n let flag = undefined;\r\n let shape1 = this.shape;\r\n let shape2 = edge.shape;\r\n\r\n if (shape1 instanceof Flatten.Segment && shape2 instanceof Flatten.Segment) {\r\n if (shape1.start.equalTo(shape2.start) && shape1.end.equalTo(shape2.end)) {\r\n flag = Flatten.OVERLAP_SAME;\r\n } else if (shape1.start.equalTo(shape2.end) && shape1.end.equalTo(shape2.start)) {\r\n flag = Flatten.OVERLAP_OPPOSITE;\r\n }\r\n } else if (shape1 instanceof Flatten.Arc && shape2 instanceof Flatten.Arc) {\r\n if (shape1.start.equalTo(shape2.start) && shape1.end.equalTo(shape2.end) && /*shape1.counterClockwise === shape2.counterClockwise &&*/\r\n shape1.middle().equalTo(shape2.middle())) {\r\n flag = Flatten.OVERLAP_SAME;\r\n } else if (shape1.start.equalTo(shape2.end) && shape1.end.equalTo(shape2.start) && /*shape1.counterClockwise !== shape2.counterClockwise &&*/\r\n shape1.middle().equalTo(shape2.middle())) {\r\n flag = Flatten.OVERLAP_OPPOSITE;\r\n }\r\n } else if (shape1 instanceof Flatten.Segment && shape2 instanceof Flatten.Arc ||\r\n shape1 instanceof Flatten.Arc && shape2 instanceof Flatten.Segment) {\r\n if (shape1.start.equalTo(shape2.start) && shape1.end.equalTo(shape2.end) && shape1.middle().equalTo(shape2.middle())) {\r\n flag = Flatten.OVERLAP_SAME;\r\n } else if (shape1.start.equalTo(shape2.end) && shape1.end.equalTo(shape2.start) && shape1.middle().equalTo(shape2.middle())) {\r\n flag = Flatten.OVERLAP_OPPOSITE;\r\n }\r\n }\r\n\r\n /* Do not update overlap flag if already set on previous chain */\r\n if (this.overlap === undefined) this.overlap = flag;\r\n if (edge.overlap === undefined) edge.overlap = flag;\r\n }\r\n\r\n svg() {\r\n if (this.shape instanceof Flatten.Segment) {\r\n return ` L${this.shape.end.x},${this.shape.end.y}`;\r\n } else if (this.shape instanceof Flatten.Arc) {\r\n let arc = this.shape;\r\n let largeArcFlag;\r\n let sweepFlag = arc.counterClockwise ? \"1\" : \"0\";\r\n\r\n // Draw full circe arc as special case: split it into two half-circles\r\n if (Flatten.Utils.EQ(arc.sweep, 2 * Math.PI)) {\r\n let sign = arc.counterClockwise ? 1 : -1;\r\n let halfArc1 = new Flatten.Arc(arc.pc, arc.r, arc.startAngle, arc.startAngle + sign * Math.PI, arc.counterClockwise);\r\n let halfArc2 = new Flatten.Arc(arc.pc, arc.r, arc.startAngle + sign * Math.PI, arc.endAngle, arc.counterClockwise);\r\n\r\n largeArcFlag = \"0\";\r\n\r\n return ` A${halfArc1.r},${halfArc1.r} 0 ${largeArcFlag},${sweepFlag} ${halfArc1.end.x},${halfArc1.end.y}\r\n A${halfArc2.r},${halfArc2.r} 0 ${largeArcFlag},${sweepFlag} ${halfArc2.end.x},${halfArc2.end.y}`\r\n } else {\r\n largeArcFlag = arc.sweep <= Math.PI ? \"0\" : \"1\";\r\n\r\n return ` A${arc.r},${arc.r} 0 ${largeArcFlag},${sweepFlag} ${arc.end.x},${arc.end.y}`;\r\n }\r\n }\r\n }\r\n\r\n toJSON() {\r\n return this.shape.toJSON();\r\n }\r\n}\r\nFlatten.Edge = Edge;\r\n\r\n/**\r\n * Class implements circular bidirectional linked list
\r\n * LinkedListElement - object of any type that has properties next and prev.\r\n */\r\nclass CircularLinkedList extends LinkedList {\r\n constructor(first, last) {\r\n super(first, last);\r\n this.setCircularLinks();\r\n }\r\n\r\n setCircularLinks() {\r\n if (this.isEmpty()) return;\r\n this.last.next = this.first;\r\n this.first.prev = this.last;\r\n }\r\n\r\n [Symbol.iterator]() {\r\n let element = undefined;\r\n return {\r\n next: () => {\r\n let value = element ? element : this.first;\r\n let done = this.first ? (element ? element === this.first : false) : true;\r\n element = value ? value.next : undefined;\r\n return {value: value, done: done};\r\n }\r\n };\r\n };\r\n\r\n /**\r\n * Append new element to the end of the list\r\n * @param {LinkedListElement} element - new element to be appended\r\n * @returns {CircularLinkedList}\r\n */\r\n append(element) {\r\n super.append(element);\r\n this.setCircularLinks();\r\n return this;\r\n }\r\n\r\n /**\r\n * Insert new element to the list after elementBefore\r\n * @param {LinkedListElement} newElement - new element to be inserted\r\n * @param {LinkedListElement} elementBefore - element in the list to insert after it\r\n * @returns {CircularLinkedList}\r\n */\r\n insert(newElement, elementBefore) {\r\n super.insert(newElement, elementBefore);\r\n this.setCircularLinks();\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove element from the list\r\n * @param {LinkedListElement} element - element to be removed from the list\r\n * @returns {CircularLinkedList}\r\n */\r\n remove(element) {\r\n super.remove(element);\r\n // this.setCircularLinks();\r\n return this;\r\n }\r\n}\r\n\r\n/**\r\n * Created by Alex Bol on 3/17/2017.\r\n */\r\n\r\n/**\r\n * Class representing a face (closed loop) in a [polygon]{@link Flatten.Polygon} object.\r\n * Face is a circular bidirectional linked list of [edges]{@link Flatten.Edge}.\r\n * Face object cannot be instantiated with a constructor.\r\n * Instead, use [polygon.addFace()]{@link Flatten.Polygon#addFace} method.\r\n *
\r\n * Note, that face only set entry point to the linked list of edges but does not contain edges by itself.\r\n * Container of edges is a property of the polygon object.
\r\n *\r\n * @example\r\n * // Face implements \"next\" iterator which enables to iterate edges in for loop:\r\n * for (let edge of face) {\r\n * console.log(edge.shape.length) // do something\r\n * }\r\n *\r\n * // Instead, it is possible to iterate edges as linked list, starting from face.first:\r\n * let edge = face.first;\r\n * do {\r\n * console.log(edge.shape.length); // do something\r\n * edge = edge.next;\r\n * } while (edge != face.first)\r\n */\r\nclass Face extends CircularLinkedList {\r\n constructor(polygon, ...args) {\r\n super(); // construct empty list of edges\r\n /**\r\n * Reference to the first edge in face\r\n */\r\n // this.first;\r\n /**\r\n * Reference to the last edge in face\r\n */\r\n // this.last;\r\n\r\n this._box = undefined; // new Box();\r\n this._orientation = undefined;\r\n\r\n if (args.length == 0) {\r\n return;\r\n }\r\n\r\n /* If passed an array it supposed to be:\r\n 1) array of shapes that performs close loop or\r\n 2) array of points that performs set of vertices\r\n */\r\n if (args.length == 1) {\r\n if (args[0] instanceof Array) {\r\n // let argsArray = args[0];\r\n let shapes = args[0]; // argsArray[0];\r\n if (shapes.length == 0)\r\n return;\r\n\r\n /* array of Flatten.Points */\r\n if (shapes.every((shape) => {return shape instanceof Flatten.Point})) {\r\n let segments = Face.points2segments(shapes);\r\n this.shapes2face(polygon.edges, segments);\r\n }\r\n /* array of points as pairs of numbers */\r\n else if (shapes.every((shape) => {return shape instanceof Array && shape.length === 2})) {\r\n let points = shapes.map((shape) => new Flatten.Point(shape[0],shape[1]));\r\n let segments = Face.points2segments(points);\r\n this.shapes2face(polygon.edges, segments);\r\n }\r\n /* array of segments ot arcs */\r\n else if (shapes.every((shape) => {\r\n return (shape instanceof Flatten.Segment || shape instanceof Flatten.Arc)\r\n })) {\r\n this.shapes2face(polygon.edges, shapes);\r\n }\r\n // this is from JSON.parse object\r\n else if (shapes.every((shape) => {\r\n return (shape.name === \"segment\" || shape.name === \"arc\")\r\n })) {\r\n let flattenShapes = [];\r\n for (let shape of shapes) {\r\n let flattenShape;\r\n if (shape.name === \"segment\") {\r\n flattenShape = new Flatten.Segment(shape);\r\n } else {\r\n flattenShape = new Flatten.Arc(shape);\r\n }\r\n flattenShapes.push(flattenShape);\r\n }\r\n this.shapes2face(polygon.edges, flattenShapes);\r\n }\r\n }\r\n /* Create new face and copy edges into polygon.edges set */\r\n else if (args[0] instanceof Face) {\r\n let face = args[0];\r\n this.first = face.first;\r\n this.last = face.last;\r\n for (let edge of face) {\r\n polygon.edges.add(edge);\r\n }\r\n }\r\n /* Instantiate face from a circle in CCW orientation */\r\n else if (args[0] instanceof Flatten.Circle) {\r\n this.shapes2face(polygon.edges, [args[0].toArc(Flatten.CCW)]);\r\n }\r\n /* Instantiate face from a box in CCW orientation */\r\n else if (args[0] instanceof Flatten.Box) {\r\n let box = args[0];\r\n this.shapes2face(polygon.edges, [\r\n new Flatten.Segment(new Flatten.Point(box.xmin, box.ymin), new Flatten.Point(box.xmax, box.ymin)),\r\n new Flatten.Segment(new Flatten.Point(box.xmax, box.ymin), new Flatten.Point(box.xmax, box.ymax)),\r\n new Flatten.Segment(new Flatten.Point(box.xmax, box.ymax), new Flatten.Point(box.xmin, box.ymax)),\r\n new Flatten.Segment(new Flatten.Point(box.xmin, box.ymax), new Flatten.Point(box.xmin, box.ymin))\r\n ]);\r\n }\r\n }\r\n /* If passed two edges, consider them as start and end of the face loop */\r\n /* THIS METHOD WILL BE USED BY BOOLEAN OPERATIONS */\r\n /* Assume that edges already copied to polygon.edges set in the clip algorithm !!! */\r\n if (args.length == 2 && args[0] instanceof Flatten.Edge && args[1] instanceof Flatten.Edge) {\r\n this.first = args[0]; // first edge in face or undefined\r\n this.last = args[1]; // last edge in face or undefined\r\n this.last.next = this.first;\r\n this.first.prev = this.last;\r\n\r\n // set arc length\r\n this.setArcLength();\r\n\r\n // this.box = this.getBox();\r\n // this.orientation = this.getOrientation(); // face direction cw or ccw\r\n }\r\n }\r\n\r\n /**\r\n * Return array of edges from first to last\r\n * @returns {Array}\r\n */\r\n get edges() {\r\n return this.toArray();\r\n }\r\n\r\n /**\r\n * Return array of shapes which comprise face\r\n * @returns {Array}\r\n */\r\n get shapes() {\r\n return this.edges.map(edge => edge.shape.clone());\r\n }\r\n\r\n /**\r\n * Return bounding box of the face\r\n * @returns {Box}\r\n */\r\n get box() {\r\n if (this._box === undefined) {\r\n let box = new Flatten.Box();\r\n for (let edge of this) {\r\n box = box.merge(edge.box);\r\n }\r\n this._box = box;\r\n }\r\n return this._box;\r\n }\r\n\r\n /**\r\n * Get all edges length\r\n * @returns {number}\r\n */\r\n get perimeter() {\r\n return this.last.arc_length + this.last.length\r\n }\r\n\r\n /**\r\n * Get point on face boundary at given length\r\n * @param {number} length - The length along the face boundary\r\n * @returns {Point}\r\n */\r\n pointAtLength(length) {\r\n if (length > this.perimeter || length < 0) return null;\r\n let point = null;\r\n for (let edge of this) {\r\n if (length >= edge.arc_length &&\r\n (edge === this.last || length < edge.next.arc_length)) {\r\n point = edge.pointAtLength(length - edge.arc_length);\r\n break;\r\n }\r\n }\r\n return point;\r\n }\r\n\r\n static points2segments(points) {\r\n let segments = [];\r\n for (let i = 0; i < points.length; i++) {\r\n // skip zero length segment\r\n if (points[i].equalTo(points[(i + 1) % points.length]))\r\n continue;\r\n segments.push(new Flatten.Segment(points[i], points[(i + 1) % points.length]));\r\n }\r\n return segments;\r\n }\r\n\r\n shapes2face(edges, shapes) {\r\n for (let shape of shapes) {\r\n let edge = new Flatten.Edge(shape);\r\n this.append(edge);\r\n // this.box = this.box.merge(shape.box);\r\n edges.add(edge);\r\n }\r\n // this.orientation = this.getOrientation(); // face direction cw or ccw\r\n }\r\n\r\n /**\r\n * Append edge after the last edge of the face (and before the first edge).
\r\n * @param {Edge} edge - Edge to be appended to the linked list\r\n * @returns {Face}\r\n */\r\n append(edge) {\r\n super.append(edge);\r\n // set arc length\r\n this.setOneEdgeArcLength(edge);\r\n edge.face = this;\r\n // edges.add(edge); // Add new edges into edges container\r\n return this;\r\n }\r\n\r\n /**\r\n * Insert edge newEdge into the linked list after the edge edgeBefore
\r\n * @param {Edge} newEdge - Edge to be inserted into linked list\r\n * @param {Edge} edgeBefore - Edge to insert newEdge after it\r\n * @returns {Face}\r\n */\r\n insert(newEdge, edgeBefore) {\r\n super.insert(newEdge, edgeBefore);\r\n // set arc length\r\n this.setOneEdgeArcLength(newEdge);\r\n newEdge.face = this;\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove the given edge from the linked list of the face
\r\n * @param {Edge} edge - Edge to be removed\r\n * @returns {Face}\r\n */\r\n remove(edge) {\r\n super.remove(edge);\r\n // Recalculate arc length\r\n this.setArcLength();\r\n return this;\r\n }\r\n\r\n /**\r\n * Reverse orientation of the face: first edge become last and vice a verse,\r\n * all edges starts and ends swapped, direction of arcs inverted. If face was oriented\r\n * clockwise, it becomes counter clockwise and vice versa\r\n */\r\n reverse() {\r\n // collect edges in revert order with reverted shapes\r\n let edges = [];\r\n let edge_tmp = this.last;\r\n do {\r\n // reverse shape\r\n edge_tmp.shape = edge_tmp.shape.reverse();\r\n edges.push(edge_tmp);\r\n edge_tmp = edge_tmp.prev;\r\n } while (edge_tmp !== this.last);\r\n\r\n // restore linked list\r\n this.first = undefined;\r\n this.last = undefined;\r\n for (let edge of edges) {\r\n if (this.first === undefined) {\r\n edge.prev = edge;\r\n edge.next = edge;\r\n this.first = edge;\r\n this.last = edge;\r\n } else {\r\n // append to end\r\n edge.prev = this.last;\r\n this.last.next = edge;\r\n\r\n // update edge to be last\r\n this.last = edge;\r\n\r\n // restore circular links\r\n this.last.next = this.first;\r\n this.first.prev = this.last;\r\n\r\n }\r\n // set arc length\r\n this.setOneEdgeArcLength(edge);\r\n }\r\n\r\n // Recalculate orientation, if set\r\n if (this._orientation !== undefined) {\r\n this._orientation = undefined;\r\n this._orientation = this.orientation();\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Set arc_length property for each of the edges in the face.\r\n * Arc_length of the edge it the arc length from the first edge of the face\r\n */\r\n setArcLength() {\r\n for (let edge of this) {\r\n this.setOneEdgeArcLength(edge);\r\n edge.face = this;\r\n }\r\n }\r\n\r\n setOneEdgeArcLength(edge) {\r\n if (edge === this.first) {\r\n edge.arc_length = 0.0;\r\n } else {\r\n edge.arc_length = edge.prev.arc_length + edge.prev.length;\r\n }\r\n }\r\n\r\n /**\r\n * Returns the absolute value of the area of the face\r\n * @returns {number}\r\n */\r\n area() {\r\n return Math.abs(this.signedArea());\r\n }\r\n\r\n /**\r\n * Returns signed area of the simple face.\r\n * Face is simple if it has no self intersections that change its orientation.\r\n * Then the area will be positive if the orientation of the face is clockwise,\r\n * and negative if orientation is counterclockwise.\r\n * It may be zero if polygon is degenerated.\r\n * @returns {number}\r\n */\r\n signedArea() {\r\n let sArea = 0;\r\n let ymin = this.box.ymin;\r\n for (let edge of this) {\r\n sArea += edge.shape.definiteIntegral(ymin);\r\n }\r\n return sArea;\r\n }\r\n\r\n /**\r\n * Return face orientation: one of Flatten.ORIENTATION.CCW, Flatten.ORIENTATION.CW, Flatten.ORIENTATION.NOT_ORIENTABLE
\r\n * According to Green theorem the area of a closed curve may be calculated as double integral,\r\n * and the sign of the integral will be defined by the direction of the curve.\r\n * When the integral (\"signed area\") will be negative, direction is counter clockwise,\r\n * when positive - clockwise and when it is zero, polygon is not orientable.\r\n * See {@link https://mathinsight.org/greens_theorem_find_area}\r\n * @returns {number}\r\n */\r\n orientation() {\r\n if (this._orientation === undefined) {\r\n let area = this.signedArea();\r\n if (Flatten.Utils.EQ_0(area)) {\r\n this._orientation = Flatten.ORIENTATION.NOT_ORIENTABLE;\r\n } else if (Flatten.Utils.LT(area, 0)) {\r\n this._orientation = Flatten.ORIENTATION.CCW;\r\n } else {\r\n this._orientation = Flatten.ORIENTATION.CW;\r\n }\r\n }\r\n return this._orientation;\r\n }\r\n\r\n /**\r\n * Returns true if face of the polygon is simple (no self-intersection points found)\r\n * NOTE: this method is incomplete because it does not exclude touching points.\r\n * Self intersection test should check if polygon change orientation in the test point.\r\n * @param {Edges} edges - reference to polygon.edges to provide search index\r\n * @returns {boolean}\r\n */\r\n isSimple(edges) {\r\n let ip = Face.getSelfIntersections(this, edges, true);\r\n return ip.length == 0;\r\n }\r\n\r\n static getSelfIntersections(face, edges, exitOnFirst = false) {\r\n let int_points = [];\r\n\r\n // calculate intersections\r\n for (let edge1 of face) {\r\n\r\n // request edges of polygon in the box of edge1\r\n let resp = edges.search(edge1.box);\r\n\r\n // for each edge2 in response\r\n for (let edge2 of resp) {\r\n\r\n // Skip itself\r\n if (edge1 === edge2)\r\n continue;\r\n\r\n // Skip is edge2 belongs to another face\r\n if (edge2.face !== face)\r\n continue;\r\n\r\n // Skip next and previous edge if both are segment (if one of them arc - calc intersection)\r\n if (edge1.shape instanceof Flatten.Segment && edge2.shape instanceof Flatten.Segment &&\r\n (edge1.next === edge2 || edge1.prev === edge2))\r\n continue;\r\n\r\n // calculate intersections between edge1 and edge2\r\n let ip = edge1.shape.intersect(edge2.shape);\r\n\r\n // for each intersection point\r\n for (let pt of ip) {\r\n\r\n // skip start-end connections\r\n if (pt.equalTo(edge1.start) && pt.equalTo(edge2.end) && edge2 === edge1.prev)\r\n continue;\r\n if (pt.equalTo(edge1.end) && pt.equalTo(edge2.start) && edge2 === edge1.next)\r\n continue;\r\n\r\n int_points.push(pt);\r\n\r\n if (exitOnFirst)\r\n break;\r\n }\r\n\r\n if (int_points.length > 0 && exitOnFirst)\r\n break;\r\n }\r\n\r\n if (int_points.length > 0 && exitOnFirst)\r\n break;\r\n\r\n }\r\n return int_points;\r\n }\r\n\r\n /**\r\n * Returns edge which contains given point\r\n * @param {Point} pt - test point\r\n * @returns {Edge}\r\n */\r\n findEdgeByPoint(pt) {\r\n let edgeFound;\r\n for (let edge of this) {\r\n if (edge.shape.contains(pt)) {\r\n edgeFound = edge;\r\n break;\r\n }\r\n }\r\n return edgeFound;\r\n }\r\n\r\n /**\r\n * Returns new polygon created from one face\r\n * @returns {Polygon}\r\n */\r\n toPolygon() {\r\n return new Flatten.Polygon(this.shapes);\r\n }\r\n\r\n toJSON() {\r\n return this.edges.map(edge => edge.toJSON());\r\n }\r\n\r\n /**\r\n * Returns string to be assigned to \"d\" attribute inside defined \"path\"\r\n * @returns {string}\r\n */\r\n svg() {\r\n let svgStr = `\\nM${this.first.start.x},${this.first.start.y}`;\r\n for (let edge of this) {\r\n svgStr += edge.svg();\r\n }\r\n svgStr += ` z`;\r\n return svgStr;\r\n }\r\n\r\n}\r\nFlatten.Face = Face;\r\n\r\n/**\r\n * Class representing a ray (a half-infinite line).\r\n * @type {Ray}\r\n */\r\nclass Ray {\r\n /**\r\n * Ray may be constructed by setting an origin point and a normal vector, so that any point x\r\n * on a ray fit an equation:
\r\n * (x - origin) * vector = 0
\r\n * Ray defined by constructor is a right semi-infinite line with respect to the normal vector
\r\n * If normal vector is omitted ray is considered horizontal (normal vector is (0,1)).
\r\n * Don't be confused: direction of the normal vector is orthogonal to the ray
\r\n * @param {Point} pt - start point\r\n * @param {Vector} norm - normal vector\r\n */\r\n constructor(...args) {\r\n this.pt = new Flatten.Point();\r\n this.norm = new Flatten.Vector(0,1);\r\n\r\n if (args.length == 0) {\r\n return;\r\n }\r\n\r\n if (args.length >= 1 && args[0] instanceof Flatten.Point) {\r\n this.pt = args[0].clone();\r\n }\r\n\r\n if (args.length === 1) {\r\n return;\r\n }\r\n\r\n if (args.length === 2 && args[1] instanceof Flatten.Vector) {\r\n this.norm = args[1].clone();\r\n return;\r\n }\r\n\r\n // if (args.length == 2 && typeof (args[0]) == \"number\" && typeof (args[1]) == \"number\") {\r\n // this.pt = new Flatten.Point(args[0], args[1]);\r\n // return;\r\n // }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Return new cloned instance of ray\r\n * @returns {Ray}\r\n */\r\n clone() {\r\n return new Ray(this.pt, this.norm);\r\n }\r\n\r\n /**\r\n * Slope of the ray - angle in radians between ray and axe x from 0 to 2PI\r\n * @returns {number} - slope of the line\r\n */\r\n get slope() {\r\n let vec = new Flatten.Vector(this.norm.y, -this.norm.x);\r\n return vec.slope;\r\n }\r\n\r\n /**\r\n * Returns half-infinite bounding box of the ray\r\n * @returns {Box} - bounding box\r\n */\r\n get box() {\r\n let slope = this.slope;\r\n return new Flatten.Box(\r\n slope > Math.PI/2 && slope < 3*Math.PI/2 ? Number.NEGATIVE_INFINITY : this.pt.x,\r\n slope >= 0 && slope <= Math.PI ? this.pt.y : Number.NEGATIVE_INFINITY,\r\n slope >= Math.PI/2 && slope <= 3*Math.PI/2 ? this.pt.x : Number.POSITIVE_INFINITY,\r\n slope >= Math.PI && slope <= 2*Math.PI || slope == 0 ? this.pt.y : Number.POSITIVE_INFINITY\r\n )\r\n }\r\n\r\n /**\r\n * Return ray start point\r\n * @returns {Point} - ray start point\r\n */\r\n get start() {\r\n return this.pt;\r\n }\r\n\r\n /**\r\n * Ray has no end point?\r\n * @returns {undefined}\r\n */\r\n get end() {return undefined;}\r\n\r\n /**\r\n * Return positive infinity number as length\r\n * @returns {number}\r\n */\r\n get length() {return Number.POSITIVE_INFINITY;}\r\n\r\n /**\r\n * Returns true if point belongs to ray\r\n * @param {Point} pt Query point\r\n * @returns {boolean}\r\n */\r\n contains(pt) {\r\n if (this.pt.equalTo(pt)) {\r\n return true;\r\n }\r\n /* Ray contains point if vector to point is orthogonal to the ray normal vector\r\n and cross product from vector to point is positive */\r\n let vec = new Flatten.Vector(this.pt, pt);\r\n return Flatten.Utils.EQ_0(this.norm.dot(vec)) && Flatten.Utils.GE(vec.cross(this.norm),0);\r\n }\r\n\r\n /**\r\n * Split ray with point and return array of segment and new ray\r\n * @param {Point} pt\r\n * @returns [Segment,Ray]\r\n */\r\n split(pt) {\r\n if (!this.contains(pt))\r\n return [];\r\n\r\n if (this.pt.equalTo(pt)) {\r\n return [this]\r\n }\r\n\r\n return [\r\n new Flatten.Segment(this.pt, pt),\r\n new Flatten.Ray(pt, this.norm)\r\n ]\r\n }\r\n\r\n /**\r\n * Returns array of intersection points between ray and segment or arc\r\n * @param {Segment|Arc} - Shape to intersect with ray\r\n * @returns {Array} array of intersection points\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Segment) {\r\n return this.intersectRay2Segment(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n return this.intersectRay2Arc(this, shape);\r\n }\r\n }\r\n\r\n intersectRay2Segment(ray, segment) {\r\n let ip = [];\r\n\r\n // if (ray.box.not_intersect(segment.box)) {\r\n // return ip;\r\n // }\r\n\r\n let line = new Flatten.Line(ray.start, ray.norm);\r\n let ip_tmp = line.intersect(segment);\r\n\r\n for (let pt of ip_tmp) {\r\n // if (Flatten.Utils.GE(pt.x, ray.start.x)) {\r\n if (ray.contains(pt)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n /* If there were two intersection points between line and ray,\r\n and now there is exactly one left, it means ray starts between these points\r\n and there is another intersection point - start of the ray */\r\n if (ip_tmp.length == 2 && ip.length == 1 && ray.start.on(line)) {\r\n ip.push(ray.start);\r\n }\r\n\r\n return ip;\r\n }\r\n\r\n intersectRay2Arc(ray, arc) {\r\n let ip = [];\r\n\r\n // if (ray.box.not_intersect(arc.box)) {\r\n // return ip;\r\n // }\r\n\r\n let line = new Flatten.Line(ray.start, ray.norm);\r\n let ip_tmp = line.intersect(arc);\r\n\r\n for (let pt of ip_tmp) {\r\n // if (Flatten.Utils.GE(pt.x, ray.start.x)) {\r\n if (ray.contains(pt)) {\r\n ip.push(pt);\r\n }\r\n }\r\n return ip;\r\n }\r\n\r\n /**\r\n * Return string to draw svg segment representing ray inside given box\r\n * @param {Box} box Box representing drawing area\r\n * @param {Object} attrs - an object with attributes of svg segment element\r\n */\r\n svg(box, attrs = {}) {\r\n let line = new Flatten.Line(this.pt, this.norm);\r\n let ip = intersectLine2Box(line, box);\r\n ip = ip.filter( pt => this.contains(pt) );\r\n if (ip.length === 0 || ip.length === 2)\r\n return \"\";\r\n let segment = new Flatten.Segment(this.pt, ip[0]);\r\n return segment.svg(attrs);\r\n }\r\n\r\n}\r\nFlatten.Ray = Ray;\r\n\r\nconst ray = (...args) => new Flatten.Ray(...args);\r\nFlatten.ray = ray;\r\n\r\n/**\r\n * Created by Alex Bol on 3/15/2017.\r\n */\r\n\r\n/**\r\n * Class representing a polygon.
\r\n * Polygon in FlattenJS is a multipolygon comprised from a set of [faces]{@link Flatten.Face}.
\r\n * Face, in turn, is a closed loop of [edges]{@link Flatten.Edge}, where edge may be segment or circular arc
\r\n * @type {Polygon}\r\n */\r\nclass Polygon {\r\n /**\r\n * Constructor creates new instance of polygon. With no arguments new polygon is empty.
\r\n * Constructor accepts as argument array that define loop of shapes\r\n * or array of arrays in case of multi polygon
\r\n * Loop may be defined in different ways:
\r\n * - array of shapes of type Segment or Arc
\r\n * - array of points (Flatten.Point)
\r\n * - array of numeric pairs which represent points
\r\n * - box or circle object
\r\n * Alternatively, it is possible to use polygon.addFace method\r\n * @param {args} - array of shapes or array of arrays\r\n */\r\n constructor() {\r\n /**\r\n * Container of faces (closed loops), may be empty\r\n * @type {PlanarSet}\r\n */\r\n this.faces = new Flatten.PlanarSet();\r\n /**\r\n * Container of edges\r\n * @type {PlanarSet}\r\n */\r\n this.edges = new Flatten.PlanarSet();\r\n\r\n /* It may be array of something that may represent one loop (face) or\r\n array of arrays that represent multiple loops\r\n */\r\n let args = [...arguments];\r\n if (args.length === 1 &&\r\n ((args[0] instanceof Array && args[0].length > 0) ||\r\n args[0] instanceof Flatten.Circle || args[0] instanceof Flatten.Box)) {\r\n let argsArray = args[0];\r\n if (args[0] instanceof Array && args[0].every((loop) => {\r\n return loop instanceof Array\r\n })) {\r\n if (argsArray.every(el => {\r\n return el instanceof Array && el.length === 2 && typeof (el[0]) === \"number\" && typeof (el[1]) === \"number\"\r\n })) {\r\n this.faces.add(new Flatten.Face(this, argsArray)); // one-loop polygon as array of pairs of numbers\r\n } else {\r\n for (let loop of argsArray) { // multi-loop polygon\r\n /* Check extra level of nesting for GeoJSON-style multi polygons */\r\n if (loop instanceof Array && loop[0] instanceof Array &&\r\n loop[0].every(el => {\r\n return el instanceof Array && el.length === 2 && typeof (el[0]) === \"number\" && typeof (el[1]) === \"number\"\r\n })) {\r\n for (let loop1 of loop) {\r\n this.faces.add(new Flatten.Face(this, loop1));\r\n }\r\n } else {\r\n this.faces.add(new Flatten.Face(this, loop));\r\n }\r\n }\r\n }\r\n } else {\r\n this.faces.add(new Flatten.Face(this, argsArray)); // one-loop polygon\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * (Getter) Returns bounding box of the polygon\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return [...this.faces].reduce((acc, face) => acc.merge(face.box), new Flatten.Box());\r\n }\r\n\r\n /**\r\n * (Getter) Returns array of vertices\r\n * @returns {Array}\r\n */\r\n get vertices() {\r\n return [...this.edges].map(edge => edge.start);\r\n }\r\n\r\n /**\r\n * Create new cloned instance of the polygon\r\n * @returns {Polygon}\r\n */\r\n clone() {\r\n let polygon = new Polygon();\r\n for (let face of this.faces) {\r\n polygon.addFace(face.shapes);\r\n }\r\n return polygon;\r\n }\r\n\r\n /**\r\n * Return true is polygon has no edges\r\n * @returns {boolean}\r\n */\r\n isEmpty() {\r\n return this.edges.size === 0;\r\n }\r\n\r\n /**\r\n * Return true if polygon is valid for boolean operations\r\n * Polygon is valid if
\r\n * 1. All faces are simple polygons (there are no self-intersected polygons)
\r\n * 2. All faces are orientable and there is no island inside island or hole inside hole - TODO
\r\n * 3. There is no intersections between faces (excluding touching) - TODO
\r\n * @returns {boolean}\r\n */\r\n isValid() {\r\n let valid = true;\r\n // 1. Polygon is invalid if at least one face is not simple\r\n for (let face of this.faces) {\r\n if (!face.isSimple(this.edges)) {\r\n valid = false;\r\n break;\r\n }\r\n }\r\n // 2. TODO: check if no island inside island and no hole inside hole\r\n // 3. TODO: check the there is no intersection between faces\r\n return valid;\r\n }\r\n\r\n /**\r\n * Returns area of the polygon. Area of an island will be added, area of a hole will be subtracted\r\n * @returns {number}\r\n */\r\n area() {\r\n let signedArea = [...this.faces].reduce((acc, face) => acc + face.signedArea(), 0);\r\n return Math.abs(signedArea);\r\n }\r\n\r\n /**\r\n * Add new face to polygon. Returns added face\r\n * @param {Points[]|Segments[]|Arcs[]|Circle|Box} args - new face may be create with one of the following ways:
\r\n * 1) array of points that describe closed path (edges are segments)
\r\n * 2) array of shapes (segments and arcs) which describe closed path
\r\n * 3) circle - will be added as counterclockwise arc
\r\n * 4) box - will be added as counterclockwise rectangle
\r\n * You can chain method face.reverse() is you need to change direction of the creates face\r\n * @returns {Face}\r\n */\r\n addFace(...args) {\r\n let face = new Flatten.Face(this, ...args);\r\n this.faces.add(face);\r\n return face;\r\n }\r\n\r\n /**\r\n * Delete existing face from polygon\r\n * @param {Face} face Face to be deleted\r\n * @returns {boolean}\r\n */\r\n deleteFace(face) {\r\n for (let edge of face) {\r\n this.edges.delete(edge);\r\n }\r\n return this.faces.delete(face);\r\n }\r\n\r\n /**\r\n * Clear all faces and create new faces from edges\r\n */\r\n recreateFaces() {\r\n // Remove all faces\r\n this.faces.clear();\r\n for (let edge of this.edges) {\r\n edge.face = null;\r\n }\r\n\r\n // Restore faces\r\n let first;\r\n let unassignedEdgeFound = true;\r\n while (unassignedEdgeFound) {\r\n unassignedEdgeFound = false;\r\n for (let edge of this.edges) {\r\n if (edge.face === null) {\r\n first = edge;\r\n unassignedEdgeFound = true;\r\n break;\r\n }\r\n }\r\n\r\n if (unassignedEdgeFound) {\r\n let last = first;\r\n do {\r\n last = last.next;\r\n } while (last.next !== first)\r\n\r\n this.addFace(first, last);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Delete chain of edges from the face.\r\n * @param {Face} face Face to remove chain\r\n * @param {Edge} edgeFrom Start of the chain of edges to be removed\r\n * @param {Edge} edgeTo End of the chain of edges to be removed\r\n */\r\n removeChain(face, edgeFrom, edgeTo) {\r\n // Special case: all edges removed\r\n if (edgeTo.next === edgeFrom) {\r\n this.deleteFace(face);\r\n return;\r\n }\r\n for (let edge = edgeFrom; edge !== edgeTo.next; edge = edge.next) {\r\n face.remove(edge);\r\n this.edges.delete(edge); // delete from PlanarSet of edges and update index\r\n if (face.isEmpty()) {\r\n this.deleteFace(face); // delete from PlanarSet of faces and update index\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add point as a new vertex and split edge. Point supposed to belong to an edge.\r\n * When edge is split, new edge created from the start of the edge to the new vertex\r\n * and inserted before current edge.\r\n * Current edge is trimmed and updated.\r\n * Method returns new edge added. If no edge added, it returns edge before vertex\r\n * @param {Point} pt Point to be added as a new vertex\r\n * @param {Edge} edge Edge to be split with new vertex and then trimmed from start\r\n * @returns {Edge}\r\n */\r\n addVertex(pt, edge) {\r\n let shapes = edge.shape.split(pt);\r\n // if (shapes.length < 2) return;\r\n\r\n if (shapes[0] === null) // point incident to edge start vertex, return previous edge\r\n return edge.prev;\r\n\r\n if (shapes[1] === null) // point incident to edge end vertex, return edge itself\r\n return edge;\r\n\r\n let newEdge = new Flatten.Edge(shapes[0]);\r\n let edgeBefore = edge.prev;\r\n\r\n /* Insert first split edge into linked list after edgeBefore */\r\n edge.face.insert(newEdge, edgeBefore);\r\n\r\n // Remove old edge from edges container and 2d index\r\n this.edges.delete(edge);\r\n\r\n // Insert new edge to the edges container and 2d index\r\n this.edges.add(newEdge);\r\n\r\n // Update edge shape with second split edge keeping links\r\n edge.shape = shapes[1];\r\n\r\n // Add updated edge to the edges container and 2d index\r\n this.edges.add(edge);\r\n\r\n return newEdge;\r\n }\r\n\r\n /**\r\n * Cut polygon with multiline and return array of new polygons\r\n * Multiline should be constructed from a line with intersection point, see notebook:\r\n * https://next.observablehq.com/@alexbol99/cut-polygon-with-line\r\n * @param {Multiline} multiline\r\n * @returns {Polygon[]}\r\n */\r\n cut(multiline) {\r\n let cutPolygons = [this.clone()];\r\n for (let edge of multiline) {\r\n if (edge.setInclusion(this) !== INSIDE)\r\n continue;\r\n\r\n let cut_edge_start = edge.shape.start;\r\n let cut_edge_end = edge.shape.end;\r\n\r\n let newCutPolygons = [];\r\n for (let polygon of cutPolygons) {\r\n if (polygon.findEdgeByPoint(cut_edge_start) === undefined) {\r\n newCutPolygons.push(polygon);\r\n } else {\r\n let [cutPoly1, cutPoly2] = polygon.cutFace(cut_edge_start, cut_edge_end);\r\n newCutPolygons.push(cutPoly1, cutPoly2);\r\n }\r\n }\r\n cutPolygons = newCutPolygons;\r\n }\r\n return cutPolygons;\r\n }\r\n\r\n /**\r\n * Cut face of polygon with a segment between two points and create two new polygons\r\n * Supposed that a segments between points does not intersect any other edge\r\n * @param {Point} pt1\r\n * @param {Point} pt2\r\n * @returns {Polygon[]}\r\n */\r\n cutFace(pt1, pt2) {\r\n let edge1 = this.findEdgeByPoint(pt1);\r\n let edge2 = this.findEdgeByPoint(pt2);\r\n if (edge1.face !== edge2.face)\r\n return [];\r\n\r\n // Cut face into two and create new polygon with two faces\r\n let edgeBefore1 = this.addVertex(pt1, edge1);\r\n edge2 = this.findEdgeByPoint(pt2);\r\n let edgeBefore2 = this.addVertex(pt2, edge2);\r\n\r\n let face = edgeBefore1.face;\r\n let newEdge1 = new Flatten.Edge(\r\n new Flatten.Segment(edgeBefore1.end, edgeBefore2.end)\r\n );\r\n let newEdge2 = new Flatten.Edge(\r\n new Flatten.Segment(edgeBefore2.end, edgeBefore1.end)\r\n );\r\n\r\n // Swap links\r\n edgeBefore1.next.prev = newEdge2;\r\n newEdge2.next = edgeBefore1.next;\r\n\r\n edgeBefore1.next = newEdge1;\r\n newEdge1.prev = edgeBefore1;\r\n\r\n edgeBefore2.next.prev = newEdge1;\r\n newEdge1.next = edgeBefore2.next;\r\n\r\n edgeBefore2.next = newEdge2;\r\n newEdge2.prev = edgeBefore2;\r\n\r\n // Insert new edge to the edges container and 2d index\r\n this.edges.add(newEdge1);\r\n this.edges.add(newEdge2);\r\n\r\n // Add two new faces\r\n let face1 = this.addFace(newEdge1, edgeBefore1);\r\n let face2 = this.addFace(newEdge2, edgeBefore2);\r\n\r\n // Remove old face\r\n this.faces.delete(face);\r\n\r\n return [face1.toPolygon(), face2.toPolygon()];\r\n }\r\n\r\n /**\r\n * Return a result of cutting polygon with line\r\n * @param {Line} line - cutting line\r\n * @returns {Polygon} newPoly - resulted polygon\r\n */\r\n cutWithLine(line) {\r\n let newPoly = this.clone();\r\n\r\n let multiline = new Multiline([line]);\r\n\r\n // smart intersections\r\n let intersections = {\r\n int_points1: [],\r\n int_points2: [],\r\n int_points1_sorted: [],\r\n int_points2_sorted: []\r\n };\r\n\r\n // intersect line with each edge of the polygon\r\n // and create smart intersections\r\n for (let edge of newPoly.edges) {\r\n let ip = intersectEdge2Line(edge, line);\r\n // for each intersection point\r\n for (let pt of ip) {\r\n addToIntPoints(multiline.first, pt, intersections.int_points1);\r\n addToIntPoints(edge, pt, intersections.int_points2);\r\n }\r\n }\r\n\r\n // No intersections - return a copy of the original polygon\r\n if (intersections.int_points1.length === 0)\r\n return newPoly;\r\n\r\n // sort smart intersections\r\n intersections.int_points1_sorted = getSortedArrayOnLine(line, intersections.int_points1);\r\n intersections.int_points2_sorted = getSortedArray(intersections.int_points2);\r\n\r\n // split by intersection points\r\n splitByIntersections(multiline, intersections.int_points1_sorted);\r\n splitByIntersections(newPoly, intersections.int_points2_sorted);\r\n\r\n // filter duplicated intersection points\r\n filterDuplicatedIntersections(intersections);\r\n\r\n // sort intersection points again after filtering\r\n intersections.int_points1_sorted = getSortedArrayOnLine(line, intersections.int_points1);\r\n intersections.int_points2_sorted = getSortedArray(intersections.int_points2);\r\n\r\n // initialize inclusion flags for edges of multiline incident to intersections\r\n initializeInclusionFlags(intersections.int_points1);\r\n\r\n // calculate inclusion flag for edges of multiline incident to intersections\r\n calculateInclusionFlags(intersections.int_points1, newPoly);\r\n\r\n // filter intersections between two edges that got same inclusion flag\r\n for (let int_point1 of intersections.int_points1_sorted) {\r\n if (int_point1.edge_before.bv === int_point1.edge_after.bv) {\r\n intersections.int_points2[int_point1.id] = -1; // to be filtered out\r\n int_point1.id = -1; // to be filtered out\r\n }\r\n }\r\n intersections.int_points1 = intersections.int_points1.filter( int_point => int_point.id >= 0);\r\n intersections.int_points2 = intersections.int_points2.filter( int_point => int_point.id >= 0);\r\n\r\n // No intersections left after filtering - return a copy of the original polygon\r\n if (intersections.int_points1.length === 0)\r\n return newPoly;\r\n\r\n // sort intersection points 3d time after filtering\r\n intersections.int_points1_sorted = getSortedArrayOnLine(line, intersections.int_points1);\r\n intersections.int_points2_sorted = getSortedArray(intersections.int_points2);\r\n\r\n // Add 2 new inner edges between intersection points\r\n let int_point1_prev = intersections.int_points1[0];\r\n let new_edge;\r\n for (let int_point1_curr of intersections.int_points1_sorted) {\r\n if (int_point1_curr.edge_before.bv === INSIDE) {\r\n new_edge = new Flatten.Edge(new Flatten.Segment(int_point1_prev.pt, int_point1_curr.pt)); // (int_point1_curr.edge_before.shape);\r\n insertBetweenIntPoints(intersections.int_points2[int_point1_prev.id], intersections.int_points2[int_point1_curr.id], new_edge);\r\n newPoly.edges.add(new_edge);\r\n\r\n new_edge = new Flatten.Edge(new Flatten.Segment(int_point1_curr.pt, int_point1_prev.pt)); // (int_point1_curr.edge_before.shape.reverse());\r\n insertBetweenIntPoints(intersections.int_points2[int_point1_curr.id], intersections.int_points2[int_point1_prev.id], new_edge);\r\n newPoly.edges.add(new_edge);\r\n }\r\n int_point1_prev = int_point1_curr;\r\n }\r\n\r\n // Recreate faces\r\n newPoly.recreateFaces();\r\n return newPoly;\r\n }\r\n\r\n /**\r\n * Returns the first founded edge of polygon that contains given point\r\n * @param {Point} pt\r\n * @returns {Edge}\r\n */\r\n findEdgeByPoint(pt) {\r\n let edge;\r\n for (let face of this.faces) {\r\n edge = face.findEdgeByPoint(pt);\r\n if (edge !== undefined)\r\n break;\r\n }\r\n return edge;\r\n }\r\n\r\n /**\r\n * Split polygon into array of polygons, where each polygon is an island with all\r\n * hole that it contains\r\n * @returns {Flatten.Polygon[]}\r\n */\r\n splitToIslands() {\r\n if (this.isEmpty()) return []; // return empty array if polygon is empty\r\n let polygons = this.toArray(); // split into array of one-loop polygons\r\n /* Sort polygons by area in descending order */\r\n polygons.sort((polygon1, polygon2) => polygon2.area() - polygon1.area());\r\n /* define orientation of the island by orientation of the first polygon in array */\r\n let orientation = [...polygons[0].faces][0].orientation();\r\n /* Create output array from polygons with same orientation as a first polygon (array of islands) */\r\n let newPolygons = polygons.filter(polygon => [...polygon.faces][0].orientation() === orientation);\r\n for (let polygon of polygons) {\r\n let face = [...polygon.faces][0];\r\n if (face.orientation() === orientation) continue; // skip same orientation\r\n /* Proceed with opposite orientation */\r\n /* Look if any of island polygons contains tested polygon as a hole */\r\n for (let islandPolygon of newPolygons) {\r\n if (face.shapes.every(shape => islandPolygon.contains(shape))) {\r\n islandPolygon.addFace(face.shapes); // add polygon as a hole in islandPolygon\r\n break;\r\n }\r\n }\r\n }\r\n // TODO: assert if not all polygons added into output\r\n return newPolygons;\r\n }\r\n\r\n /**\r\n * Reverse orientation of all faces to opposite\r\n * @returns {Polygon}\r\n */\r\n reverse() {\r\n for (let face of this.faces) {\r\n face.reverse();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns true if polygon contains shape: no point of shape lay outside of the polygon,\r\n * false otherwise\r\n * @param {Shape} shape - test shape\r\n * @returns {boolean}\r\n */\r\n contains(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n let rel = ray_shoot(this, shape);\r\n return rel === INSIDE || rel === BOUNDARY;\r\n } else {\r\n return cover(this, shape);\r\n }\r\n }\r\n\r\n /**\r\n * Return distance and shortest segment between polygon and other shape as array [distance, shortest_segment]\r\n * @param {Shape} shape Shape of one of the types Point, Circle, Line, Segment, Arc or Polygon\r\n * @returns {Number | Segment}\r\n */\r\n distanceTo(shape) {\r\n // let {Distance} = Flatten;\r\n\r\n if (shape instanceof Flatten.Point) {\r\n let [dist, shortest_segment] = Flatten.Distance.point2polygon(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Circle ||\r\n shape instanceof Flatten.Line ||\r\n shape instanceof Flatten.Segment ||\r\n shape instanceof Flatten.Arc) {\r\n let [dist, shortest_segment] = Flatten.Distance.shape2polygon(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n /* this method is bit faster */\r\n if (shape instanceof Flatten.Polygon) {\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Flatten.Segment()];\r\n let dist, shortest_segment;\r\n\r\n for (let edge of this.edges) {\r\n // let [dist, shortest_segment] = Distance.shape2polygon(edge.shape, shape);\r\n let min_stop = min_dist_and_segment[0];\r\n [dist, shortest_segment] = Flatten.Distance.shape2planarSet(edge.shape, shape.edges, min_stop);\r\n if (Flatten.Utils.LT(dist, min_stop)) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n }\r\n\r\n /**\r\n * Return array of intersection points between polygon and other shape\r\n * @param shape Shape of the one of supported types
\r\n * @returns {Point[]}\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.contains(shape) ? [shape] : [];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n return intersectLine2Polygon(shape, this);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return intersectCircle2Polygon(shape, this);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return intersectSegment2Polygon(shape, this);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n return intersectArc2Polygon(shape, this);\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n return intersectPolygon2Polygon(shape, this);\r\n }\r\n }\r\n\r\n /**\r\n * Returns new polygon translated by vector vec\r\n * @param {Vector} vec\r\n * @returns {Polygon}\r\n */\r\n translate(vec) {\r\n let newPolygon = new Polygon();\r\n for (let face of this.faces) {\r\n newPolygon.addFace(face.shapes.map(shape => shape.translate(vec)));\r\n }\r\n return newPolygon;\r\n }\r\n\r\n /**\r\n * Return new polygon rotated by given angle around given point\r\n * If point omitted, rotate around origin (0,0)\r\n * Positive value of angle defines rotation counter clockwise, negative - clockwise\r\n * @param {number} angle - rotation angle in radians\r\n * @param {Point} center - rotation center, default is (0,0)\r\n * @returns {Polygon} - new rotated polygon\r\n */\r\n rotate(angle = 0, center = new Flatten.Point()) {\r\n let newPolygon = new Polygon();\r\n for (let face of this.faces) {\r\n newPolygon.addFace(face.shapes.map(shape => shape.rotate(angle, center)));\r\n }\r\n return newPolygon;\r\n }\r\n\r\n /**\r\n * Return new polygon transformed using affine transformation matrix\r\n * @param {Matrix} matrix - affine transformation matrix\r\n * @returns {Polygon} - new polygon\r\n */\r\n transform(matrix = new Flatten.Matrix()) {\r\n let newPolygon = new Polygon();\r\n for (let face of this.faces) {\r\n newPolygon.addFace(face.shapes.map(shape => shape.transform(matrix)));\r\n }\r\n return newPolygon;\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return [...this.faces].map(face => face.toJSON());\r\n }\r\n\r\n /**\r\n * Transform all faces into array of polygons\r\n * @returns {Flatten.Polygon[]}\r\n */\r\n toArray() {\r\n return [...this.faces].map(face => face.toPolygon());\r\n }\r\n\r\n /**\r\n * Return string to draw polygon in svg\r\n * @param attrs - an object with attributes for svg path element,\r\n * like \"stroke\", \"strokeWidth\", \"fill\", \"fillRule\", \"fillOpacity\"\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\", fill:\"lightcyan\", fillRule:\"evenodd\", fillOpacity: \"1\"\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let {stroke, strokeWidth, fill, fillRule, fillOpacity, id, className} = attrs;\r\n // let restStr = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n\r\n let svgStr = `\\n\\n`;\r\n return svgStr;\r\n }\r\n}\r\n\r\nFlatten.Polygon = Polygon;\r\n\r\n/**\r\n * Shortcut method to create new polygon\r\n */\r\nconst polygon = (...args) => new Flatten.Polygon(...args);\r\nFlatten.polygon = polygon;\r\n\r\nconst {Circle: Circle$1, Line: Line$1, Point: Point$1, Vector: Vector$1, Utils: Utils$1} = Flatten;\r\n/**\r\n * Class Inversion represent operator of inversion in circle\r\n * Inversion is a transformation of the Euclidean plane that maps generalized circles\r\n * (where line is considered as a circle with infinite radius) into generalized circles\r\n * See also https://en.wikipedia.org/wiki/Inversive_geometry and\r\n * http://mathworld.wolfram.com/Inversion.html
\r\n * @type {Inversion}\r\n */\r\nclass Inversion {\r\n /**\r\n * Inversion constructor\r\n * @param {Circle} inversion_circle inversion circle\r\n */\r\n constructor(inversion_circle) {\r\n this.circle = inversion_circle;\r\n }\r\n\r\n\r\n get inversion_circle() {\r\n return this.circle;\r\n }\r\n\r\n static inversePoint(inversion_circle, point) {\r\n const v = new Vector$1(inversion_circle.pc, point);\r\n const k2 = inversion_circle.r * inversion_circle.r;\r\n const len2 = v.dot(v);\r\n const reflected_point = Utils$1.EQ_0(len2) ?\r\n new Point$1(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY) :\r\n inversion_circle.pc.translate(v.multiply(k2 / len2));\r\n return reflected_point;\r\n }\r\n\r\n static inverseCircle(inversion_circle, circle) {\r\n const dist = inversion_circle.pc.distanceTo(circle.pc)[0];\r\n if (Utils$1.EQ(dist, circle.r)) { // Circle passing through inversion center mapped into line\r\n let d = (inversion_circle.r * inversion_circle.r) / (2 * circle.r);\r\n let v = new Vector$1(inversion_circle.pc, circle.pc);\r\n v = v.normalize();\r\n let pt = inversion_circle.pc.translate(v.multiply(d));\r\n\r\n return new Line$1(pt, v);\r\n } else { // Circle not passing through inversion center - map into another circle */\r\n /* Taken from http://mathworld.wolfram.com */\r\n let v = new Vector$1(inversion_circle.pc, circle.pc);\r\n let s = inversion_circle.r * inversion_circle.r / (v.dot(v) - circle.r * circle.r);\r\n let pc = inversion_circle.pc.translate(v.multiply(s));\r\n let r = Math.abs(s) * circle.r;\r\n\r\n return new Circle$1(pc, r);\r\n }\r\n }\r\n\r\n static inverseLine(inversion_circle, line) {\r\n const [dist, shortest_segment] = inversion_circle.pc.distanceTo(line);\r\n if (Utils$1.EQ_0(dist)) { // Line passing through inversion center, is mapping to itself\r\n return line.clone();\r\n } else { // Line not passing through inversion center is mapping into circle\r\n let r = inversion_circle.r * inversion_circle.r / (2 * dist);\r\n let v = new Vector$1(inversion_circle.pc, shortest_segment.end);\r\n v = v.multiply(r / dist);\r\n return new Circle$1(inversion_circle.pc.translate(v), r);\r\n }\r\n }\r\n\r\n inverse(shape) {\r\n if (shape instanceof Point$1) {\r\n return Inversion.inversePoint(this.circle, shape);\r\n }\r\n else if (shape instanceof Circle$1) {\r\n return Inversion.inverseCircle(this.circle, shape);\r\n }\r\n else if (shape instanceof Line$1) {\r\n return Inversion.inverseLine(this.circle, shape);\r\n }\r\n }\r\n}\r\nFlatten.Inversion = Inversion;\r\n\r\n/**\r\n * Shortcut to create inversion operator\r\n * @param circle\r\n * @returns {Inversion}\r\n */\r\nconst inversion = (circle) => new Flatten.Inversion(circle);\r\nFlatten.inversion = inversion;\r\n\r\nclass Distance {\r\n /**\r\n * Calculate distance and shortest segment between points\r\n * @param pt1\r\n * @param pt2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2point(pt1, pt2) {\r\n return pt1.distanceTo(pt2);\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between point and line\r\n * @param pt\r\n * @param line\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2line(pt, line) {\r\n let closest_point = pt.projectionOn(line);\r\n let vec = new Flatten.Vector(pt, closest_point);\r\n return [vec.length, new Flatten.Segment(pt, closest_point)];\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between point and circle\r\n * @param pt\r\n * @param circle\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2circle(pt, circle) {\r\n let [dist2center, shortest_dist] = pt.distanceTo(circle.center);\r\n if (Flatten.Utils.EQ_0(dist2center)) {\r\n return [circle.r, new Flatten.Segment(pt, circle.toArc().start)];\r\n } else {\r\n let dist = Math.abs(dist2center - circle.r);\r\n let v = new Flatten.Vector(circle.pc, pt).normalize().multiply(circle.r);\r\n let closest_point = circle.pc.translate(v);\r\n return [dist, new Flatten.Segment(pt, closest_point)];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between point and segment\r\n * @param pt\r\n * @param segment\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2segment(pt, segment) {\r\n /* Degenerated case of zero-length segment */\r\n if (segment.start.equalTo(segment.end)) {\r\n return Distance.point2point(pt, segment.start);\r\n }\r\n\r\n let v_seg = new Flatten.Vector(segment.start, segment.end);\r\n let v_ps2pt = new Flatten.Vector(segment.start, pt);\r\n let v_pe2pt = new Flatten.Vector(segment.end, pt);\r\n let start_sp = v_seg.dot(v_ps2pt);\r\n /* dot product v_seg * v_ps2pt */\r\n let end_sp = -v_seg.dot(v_pe2pt);\r\n /* minus dot product v_seg * v_pe2pt */\r\n\r\n let dist;\r\n let closest_point;\r\n if (Flatten.Utils.GE(start_sp, 0) && Flatten.Utils.GE(end_sp, 0)) { /* point inside segment scope */\r\n let v_unit = segment.tangentInStart(); // new Flatten.Vector(v_seg.x / this.length, v_seg.y / this.length);\r\n /* unit vector ||v_unit|| = 1 */\r\n dist = Math.abs(v_unit.cross(v_ps2pt));\r\n /* dist = abs(v_unit x v_ps2pt) */\r\n closest_point = segment.start.translate(v_unit.multiply(v_unit.dot(v_ps2pt)));\r\n return [dist, new Flatten.Segment(pt, closest_point)];\r\n } else if (start_sp < 0) { /* point is out of scope closer to ps */\r\n return pt.distanceTo(segment.start);\r\n } else { /* point is out of scope closer to pe */\r\n return pt.distanceTo(segment.end);\r\n }\r\n };\r\n\r\n /**\r\n * Calculate distance and shortest segment between point and arc\r\n * @param pt\r\n * @param arc\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2arc(pt, arc) {\r\n let circle = new Flatten.Circle(arc.pc, arc.r);\r\n let dist_and_segment = [];\r\n let dist, shortest_segment;\r\n [dist, shortest_segment] = Distance.point2circle(pt, circle);\r\n if (shortest_segment.end.on(arc)) {\r\n dist_and_segment.push(Distance.point2circle(pt, circle));\r\n }\r\n dist_and_segment.push(Distance.point2point(pt, arc.start));\r\n dist_and_segment.push(Distance.point2point(pt, arc.end));\r\n\r\n Distance.sort(dist_and_segment);\r\n\r\n return dist_and_segment[0];\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between segment and line\r\n * @param seg\r\n * @param line\r\n * @returns {Number | Segment}\r\n */\r\n static segment2line(seg, line) {\r\n let ip = seg.intersect(line);\r\n if (ip.length > 0) {\r\n return [0, new Flatten.Segment(ip[0], ip[0])]; // distance = 0, closest point is the first point\r\n }\r\n let dist_and_segment = [];\r\n dist_and_segment.push(Distance.point2line(seg.start, line));\r\n dist_and_segment.push(Distance.point2line(seg.end, line));\r\n\r\n Distance.sort(dist_and_segment);\r\n return dist_and_segment[0];\r\n\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between two segments\r\n * @param seg1\r\n * @param seg2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static segment2segment(seg1, seg2) {\r\n let ip = intersectSegment2Segment(seg1, seg2);\r\n if (ip.length > 0) {\r\n return [0, new Flatten.Segment(ip[0], ip[0])]; // distance = 0, closest point is the first point\r\n }\r\n\r\n // Seg1 and seg2 not intersected\r\n let dist_and_segment = [];\r\n let dist_tmp, shortest_segment_tmp;\r\n [dist_tmp, shortest_segment_tmp] = Distance.point2segment(seg2.start, seg1);\r\n dist_and_segment.push([dist_tmp, shortest_segment_tmp.reverse()]);\r\n [dist_tmp, shortest_segment_tmp] = Distance.point2segment(seg2.end, seg1);\r\n dist_and_segment.push([dist_tmp, shortest_segment_tmp.reverse()]);\r\n dist_and_segment.push(Distance.point2segment(seg1.start, seg2));\r\n dist_and_segment.push(Distance.point2segment(seg1.end, seg2));\r\n\r\n Distance.sort(dist_and_segment);\r\n return dist_and_segment[0];\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between segment and circle\r\n * @param seg\r\n * @param circle\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static segment2circle(seg, circle) {\r\n /* Case 1 Segment and circle intersected. Return the first point and zero distance */\r\n let ip = seg.intersect(circle);\r\n if (ip.length > 0) {\r\n return [0, new Flatten.Segment(ip[0], ip[0])];\r\n }\r\n\r\n // No intersection between segment and circle\r\n\r\n /* Case 2. Distance to projection of center point to line bigger than radius\r\n * And projection point belong to segment\r\n * Then measure again distance from projection to circle and return it */\r\n let line = new Flatten.Line(seg.ps, seg.pe);\r\n let [dist, shortest_segment] = Distance.point2line(circle.center, line);\r\n if (Flatten.Utils.GE(dist, circle.r) && shortest_segment.end.on(seg)) {\r\n return Distance.point2circle(shortest_segment.end, circle);\r\n }\r\n /* Case 3. Otherwise closest point is one of the end points of the segment */\r\n else {\r\n let [dist_from_start, shortest_segment_from_start] = Distance.point2circle(seg.start, circle);\r\n let [dist_from_end, shortest_segment_from_end] = Distance.point2circle(seg.end, circle);\r\n return Flatten.Utils.LT(dist_from_start, dist_from_end) ?\r\n [dist_from_start, shortest_segment_from_start] :\r\n [dist_from_end, shortest_segment_from_end];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between segment and arc\r\n * @param seg\r\n * @param arc\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static segment2arc(seg, arc) {\r\n /* Case 1 Segment and arc intersected. Return the first point and zero distance */\r\n let ip = seg.intersect(arc);\r\n if (ip.length > 0) {\r\n return [0, new Flatten.Segment(ip[0], ip[0])];\r\n }\r\n\r\n // No intersection between segment and arc\r\n let line = new Flatten.Line(seg.ps, seg.pe);\r\n let circle = new Flatten.Circle(arc.pc, arc.r);\r\n\r\n /* Case 2. Distance to projection of center point to line bigger than radius AND\r\n * projection point belongs to segment AND\r\n * distance from projection point to circle belongs to arc =>\r\n * return this distance from projection to circle */\r\n let [dist_from_center, shortest_segment_from_center] = Distance.point2line(circle.center, line);\r\n if (Flatten.Utils.GE(dist_from_center, circle.r) && shortest_segment_from_center.end.on(seg)) {\r\n let [dist_from_projection, shortest_segment_from_projection] =\r\n Distance.point2circle(shortest_segment_from_center.end, circle);\r\n if (shortest_segment_from_projection.end.on(arc)) {\r\n return [dist_from_projection, shortest_segment_from_projection];\r\n }\r\n }\r\n /* Case 3. Otherwise closest point is one of the end points of the segment */\r\n let dist_and_segment = [];\r\n dist_and_segment.push(Distance.point2arc(seg.start, arc));\r\n dist_and_segment.push(Distance.point2arc(seg.end, arc));\r\n\r\n let dist_tmp, segment_tmp;\r\n [dist_tmp, segment_tmp] = Distance.point2segment(arc.start, seg);\r\n dist_and_segment.push([dist_tmp, segment_tmp.reverse()]);\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2segment(arc.end, seg);\r\n dist_and_segment.push([dist_tmp, segment_tmp.reverse()]);\r\n\r\n Distance.sort(dist_and_segment);\r\n return dist_and_segment[0];\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between two circles\r\n * @param circle1\r\n * @param circle2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static circle2circle(circle1, circle2) {\r\n let ip = circle1.intersect(circle2);\r\n if (ip.length > 0) {\r\n return [0, new Flatten.Segment(ip[0], ip[0])];\r\n }\r\n\r\n // Case 1. Concentric circles. Convert to arcs and take distance between two arc starts\r\n if (circle1.center.equalTo(circle2.center)) {\r\n let arc1 = circle1.toArc();\r\n let arc2 = circle2.toArc();\r\n return Distance.point2point(arc1.start, arc2.start);\r\n } else {\r\n // Case 2. Not concentric circles\r\n let line = new Flatten.Line(circle1.center, circle2.center);\r\n let ip1 = line.intersect(circle1);\r\n let ip2 = line.intersect(circle2);\r\n\r\n let dist_and_segment = [];\r\n\r\n dist_and_segment.push(Distance.point2point(ip1[0], ip2[0]));\r\n dist_and_segment.push(Distance.point2point(ip1[0], ip2[1]));\r\n dist_and_segment.push(Distance.point2point(ip1[1], ip2[0]));\r\n dist_and_segment.push(Distance.point2point(ip1[1], ip2[1]));\r\n\r\n Distance.sort(dist_and_segment);\r\n return dist_and_segment[0];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between two circles\r\n * @param circle\r\n * @param line\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static circle2line(circle, line) {\r\n let ip = circle.intersect(line);\r\n if (ip.length > 0) {\r\n return [0, new Flatten.Segment(ip[0], ip[0])];\r\n }\r\n\r\n let [dist_from_center, shortest_segment_from_center] = Distance.point2line(circle.center, line);\r\n let [dist, shortest_segment] = Distance.point2circle(shortest_segment_from_center.end, circle);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between arc and line\r\n * @param arc\r\n * @param line\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static arc2line(arc, line) {\r\n /* Case 1 Line and arc intersected. Return the first point and zero distance */\r\n let ip = line.intersect(arc);\r\n if (ip.length > 0) {\r\n return [0, new Flatten.Segment(ip[0], ip[0])];\r\n }\r\n\r\n let circle = new Flatten.Circle(arc.center, arc.r);\r\n\r\n /* Case 2. Distance to projection of center point to line bigger than radius AND\r\n * projection point belongs to segment AND\r\n * distance from projection point to circle belongs to arc =>\r\n * return this distance from projection to circle */\r\n let [dist_from_center, shortest_segment_from_center] = Distance.point2line(circle.center, line);\r\n if (Flatten.Utils.GE(dist_from_center, circle.r)) {\r\n let [dist_from_projection, shortest_segment_from_projection] =\r\n Distance.point2circle(shortest_segment_from_center.end, circle);\r\n if (shortest_segment_from_projection.end.on(arc)) {\r\n return [dist_from_projection, shortest_segment_from_projection];\r\n }\r\n } else {\r\n let dist_and_segment = [];\r\n dist_and_segment.push(Distance.point2line(arc.start, line));\r\n dist_and_segment.push(Distance.point2line(arc.end, line));\r\n\r\n Distance.sort(dist_and_segment);\r\n return dist_and_segment[0];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between arc and circle\r\n * @param arc\r\n * @param circle2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static arc2circle(arc, circle2) {\r\n let ip = arc.intersect(circle2);\r\n if (ip.length > 0) {\r\n return [0, new Flatten.Segment(ip[0], ip[0])];\r\n }\r\n\r\n let circle1 = new Flatten.Circle(arc.center, arc.r);\r\n\r\n let [dist, shortest_segment] = Distance.circle2circle(circle1, circle2);\r\n if (shortest_segment.start.on(arc)) {\r\n return [dist, shortest_segment];\r\n } else {\r\n let dist_and_segment = [];\r\n\r\n dist_and_segment.push(Distance.point2circle(arc.start, circle2));\r\n dist_and_segment.push(Distance.point2circle(arc.end, circle2));\r\n\r\n Distance.sort(dist_and_segment);\r\n\r\n return dist_and_segment[0];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between two arcs\r\n * @param arc1\r\n * @param arc2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static arc2arc(arc1, arc2) {\r\n let ip = arc1.intersect(arc2);\r\n if (ip.length > 0) {\r\n return [0, new Flatten.Segment(ip[0], ip[0])];\r\n }\r\n\r\n let circle1 = new Flatten.Circle(arc1.center, arc1.r);\r\n let circle2 = new Flatten.Circle(arc2.center, arc2.r);\r\n\r\n let [dist, shortest_segment] = Distance.circle2circle(circle1, circle2);\r\n if (shortest_segment.start.on(arc1) && shortest_segment.end.on(arc2)) {\r\n return [dist, shortest_segment];\r\n } else {\r\n let dist_and_segment = [];\r\n\r\n let dist_tmp, segment_tmp;\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2arc(arc1.start, arc2);\r\n if (segment_tmp.end.on(arc2)) {\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n }\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2arc(arc1.end, arc2);\r\n if (segment_tmp.end.on(arc2)) {\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n }\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2arc(arc2.start, arc1);\r\n if (segment_tmp.end.on(arc1)) {\r\n dist_and_segment.push([dist_tmp, segment_tmp.reverse()]);\r\n }\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2arc(arc2.end, arc1);\r\n if (segment_tmp.end.on(arc1)) {\r\n dist_and_segment.push([dist_tmp, segment_tmp.reverse()]);\r\n }\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2point(arc1.start, arc2.start);\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2point(arc1.start, arc2.end);\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2point(arc1.end, arc2.start);\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2point(arc1.end, arc2.end);\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n\r\n Distance.sort(dist_and_segment);\r\n\r\n return dist_and_segment[0];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between point and polygon\r\n * @param point\r\n * @param polygon\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2polygon(point, polygon) {\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Flatten.Segment()];\r\n for (let edge of polygon.edges) {\r\n let [dist, shortest_segment] = (edge.shape instanceof Flatten.Segment) ?\r\n Distance.point2segment(point, edge.shape) : Distance.point2arc(point, edge.shape);\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment[0])) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n static shape2polygon(shape, polygon) {\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Flatten.Segment()];\r\n for (let edge of polygon.edges) {\r\n let [dist, shortest_segment] = shape.distanceTo(edge.shape);\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment[0])) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between two polygons\r\n * @param polygon1\r\n * @param polygon2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static polygon2polygon(polygon1, polygon2) {\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Flatten.Segment()];\r\n for (let edge1 of polygon1.edges) {\r\n for (let edge2 of polygon2.edges) {\r\n let [dist, shortest_segment] = edge1.shape.distanceTo(edge2.shape);\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment[0])) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n /**\r\n * Returns [mindist, maxdist] array of squared minimal and maximal distance between boxes\r\n * Minimal distance by x is\r\n * (box2.xmin - box1.xmax), if box1 is left to box2\r\n * (box1.xmin - box2.xmax), if box2 is left to box1\r\n * 0, if box1 and box2 are intersected by x\r\n * Minimal distance by y is defined in the same way\r\n *\r\n * Maximal distance is estimated as a sum of squared dimensions of the merged box\r\n *\r\n * @param box1\r\n * @param box2\r\n * @returns {Number | Number} - minimal and maximal distance\r\n */\r\n static box2box_minmax(box1, box2) {\r\n let mindist_x = Math.max(Math.max(box1.xmin - box2.xmax, 0), Math.max(box2.xmin - box1.xmax, 0));\r\n let mindist_y = Math.max(Math.max(box1.ymin - box2.ymax, 0), Math.max(box2.ymin - box1.ymax, 0));\r\n let mindist = mindist_x * mindist_x + mindist_y * mindist_y;\r\n\r\n let box = box1.merge(box2);\r\n let dx = box.xmax - box.xmin;\r\n let dy = box.ymax - box.ymin;\r\n let maxdist = dx * dx + dy * dy;\r\n\r\n return [mindist, maxdist];\r\n }\r\n\r\n static minmax_tree_process_level(shape, level, min_stop, tree) {\r\n // Calculate minmax distance to each shape in current level\r\n // Insert result into the interval tree for further processing\r\n // update min_stop with maxdist, it will be the new stop distance\r\n let mindist, maxdist;\r\n for (let node of level) {\r\n\r\n // [mindist, maxdist] = Distance.box2box_minmax(shape.box, node.max);\r\n // if (Flatten.Utils.GT(mindist, min_stop))\r\n // continue;\r\n\r\n // Estimate min-max dist to the shape stored in the node.item, using node.item.key which is shape's box\r\n [mindist, maxdist] = Distance.box2box_minmax(shape.box, node.item.key);\r\n if (node.item.value instanceof Flatten.Edge) {\r\n tree.insert([mindist, maxdist], node.item.value.shape);\r\n } else {\r\n tree.insert([mindist, maxdist], node.item.value);\r\n }\r\n if (Flatten.Utils.LT(maxdist, min_stop)) {\r\n min_stop = maxdist; // this will be the new distance estimation\r\n }\r\n }\r\n\r\n if (level.length === 0)\r\n return min_stop;\r\n\r\n // Calculate new level from left and right children of the current\r\n let new_level_left = level.map(node => node.left.isNil() ? undefined : node.left).filter(node => node !== undefined);\r\n let new_level_right = level.map(node => node.right.isNil() ? undefined : node.right).filter(node => node !== undefined);\r\n // Merge left and right subtrees and leave only relevant subtrees\r\n let new_level = [...new_level_left, ...new_level_right].filter(node => {\r\n // Node subtree quick reject, node.max is a subtree box\r\n let [mindist, maxdist] = Distance.box2box_minmax(shape.box, node.max);\r\n return (Flatten.Utils.LE(mindist, min_stop));\r\n });\r\n\r\n min_stop = Distance.minmax_tree_process_level(shape, new_level, min_stop, tree);\r\n return min_stop;\r\n }\r\n\r\n /**\r\n * Calculates sorted tree of [mindist, maxdist] intervals between query shape\r\n * and shapes of the planar set.\r\n * @param shape\r\n * @param set\r\n */\r\n static minmax_tree(shape, set, min_stop) {\r\n let tree = new IntervalTree();\r\n let level = [set.index.root];\r\n let squared_min_stop = min_stop < Number.POSITIVE_INFINITY ? min_stop * min_stop : Number.POSITIVE_INFINITY;\r\n squared_min_stop = Distance.minmax_tree_process_level(shape, level, squared_min_stop, tree);\r\n return tree;\r\n }\r\n\r\n static minmax_tree_calc_distance(shape, node, min_dist_and_segment) {\r\n let min_dist_and_segment_new, stop;\r\n if (node != null && !node.isNil()) {\r\n [min_dist_and_segment_new, stop] = Distance.minmax_tree_calc_distance(shape, node.left, min_dist_and_segment);\r\n\r\n if (stop) {\r\n return [min_dist_and_segment_new, stop];\r\n }\r\n\r\n if (Flatten.Utils.LT(min_dist_and_segment_new[0], Math.sqrt(node.item.key.low))) {\r\n return [min_dist_and_segment_new, true]; // stop condition\r\n }\r\n\r\n let [dist, shortest_segment] = Distance.distance(shape, node.item.value);\r\n // console.log(dist)\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment_new[0])) {\r\n min_dist_and_segment_new = [dist, shortest_segment];\r\n }\r\n\r\n [min_dist_and_segment_new, stop] = Distance.minmax_tree_calc_distance(shape, node.right, min_dist_and_segment_new);\r\n\r\n return [min_dist_and_segment_new, stop];\r\n }\r\n\r\n return [min_dist_and_segment, false];\r\n }\r\n\r\n /**\r\n * Calculates distance between shape and Planar Set of shapes\r\n * @param shape\r\n * @param {PlanarSet} set\r\n * @param {Number} min_stop\r\n * @returns {*}\r\n */\r\n static shape2planarSet(shape, set, min_stop = Number.POSITIVE_INFINITY) {\r\n let min_dist_and_segment = [min_stop, new Flatten.Segment()];\r\n let stop = false;\r\n if (set instanceof Flatten.PlanarSet) {\r\n let tree = Distance.minmax_tree(shape, set, min_stop);\r\n [min_dist_and_segment, stop] = Distance.minmax_tree_calc_distance(shape, tree.root, min_dist_and_segment);\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n static sort(dist_and_segment) {\r\n dist_and_segment.sort((d1, d2) => {\r\n if (Flatten.Utils.LT(d1[0], d2[0])) {\r\n return -1;\r\n }\r\n if (Flatten.Utils.GT(d1[0], d2[0])) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n static distance(shape1, shape2) {\r\n return shape1.distanceTo(shape2);\r\n }\r\n}\r\n\r\nFlatten.Distance = Distance;\r\n\r\n/**\r\n * Created by Alex Bol on 2/18/2017.\r\n */\r\n\r\nFlatten.BooleanOperations = BooleanOperations;\r\nFlatten.Relations = Relations;\r\n\r\nexport default Flatten;\r\nexport { Arc, BOUNDARY, BooleanOperations, Box, CCW, CW, Circle, Distance, Edge, errors as Errors, Face, INSIDE, Inversion, Line, Matrix, Multiline, ORIENTATION, OUTSIDE, PlanarSet, Point, Polygon, Ray, Relations, Segment, Utils, Vector, arc, box, circle, inversion, line, matrix, multiline, point, polygon, ray, ray_shoot, segment, vector };\r\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.ELK = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$defaultLayoutOpt = _ref.defaultLayoutOptions,\n defaultLayoutOptions = _ref$defaultLayoutOpt === undefined ? {} : _ref$defaultLayoutOpt,\n _ref$algorithms = _ref.algorithms,\n algorithms = _ref$algorithms === undefined ? ['layered', 'stress', 'mrtree', 'radial', 'force', 'disco', 'sporeOverlap', 'sporeCompaction', 'rectpacking'] : _ref$algorithms,\n workerFactory = _ref.workerFactory,\n workerUrl = _ref.workerUrl;\n\n _classCallCheck(this, ELK);\n\n this.defaultLayoutOptions = defaultLayoutOptions;\n this.initialized = false;\n\n // check valid worker construction possible\n if (typeof workerUrl === 'undefined' && typeof workerFactory === 'undefined') {\n throw new Error(\"Cannot construct an ELK without both 'workerUrl' and 'workerFactory'.\");\n }\n var factory = workerFactory;\n if (typeof workerUrl !== 'undefined' && typeof workerFactory === 'undefined') {\n // use default Web Worker\n factory = function factory(url) {\n return new Worker(url);\n };\n }\n\n // create the worker\n var worker = factory(workerUrl);\n if (typeof worker.postMessage !== 'function') {\n throw new TypeError(\"Created worker does not provide\" + \" the required 'postMessage' function.\");\n }\n\n // wrap the worker to return promises\n this.worker = new PromisedWorker(worker);\n\n // initially register algorithms\n this.worker.postMessage({\n cmd: 'register',\n algorithms: algorithms\n }).then(function (r) {\n return _this.initialized = true;\n }).catch(console.err);\n }\n\n _createClass(ELK, [{\n key: 'layout',\n value: function layout(graph) {\n var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref2$layoutOptions = _ref2.layoutOptions,\n layoutOptions = _ref2$layoutOptions === undefined ? this.defaultLayoutOptions : _ref2$layoutOptions,\n _ref2$logging = _ref2.logging,\n logging = _ref2$logging === undefined ? false : _ref2$logging,\n _ref2$measureExecutio = _ref2.measureExecutionTime,\n measureExecutionTime = _ref2$measureExecutio === undefined ? false : _ref2$measureExecutio;\n\n if (!graph) {\n return Promise.reject(new Error(\"Missing mandatory parameter 'graph'.\"));\n }\n return this.worker.postMessage({\n cmd: 'layout',\n graph: graph,\n layoutOptions: layoutOptions,\n options: {\n logging: logging,\n measureExecutionTime: measureExecutionTime\n }\n });\n }\n }, {\n key: 'knownLayoutAlgorithms',\n value: function knownLayoutAlgorithms() {\n return this.worker.postMessage({ cmd: 'algorithms' });\n }\n }, {\n key: 'knownLayoutOptions',\n value: function knownLayoutOptions() {\n return this.worker.postMessage({ cmd: 'options' });\n }\n }, {\n key: 'knownLayoutCategories',\n value: function knownLayoutCategories() {\n return this.worker.postMessage({ cmd: 'categories' });\n }\n }, {\n key: 'terminateWorker',\n value: function terminateWorker() {\n this.worker.terminate();\n }\n }]);\n\n return ELK;\n}();\n\nexports.default = ELK;\n\nvar PromisedWorker = function () {\n function PromisedWorker(worker) {\n var _this2 = this;\n\n _classCallCheck(this, PromisedWorker);\n\n if (worker === undefined) {\n throw new Error(\"Missing mandatory parameter 'worker'.\");\n }\n this.resolvers = {};\n this.worker = worker;\n this.worker.onmessage = function (answer) {\n // why is this necessary?\n setTimeout(function () {\n _this2.receive(_this2, answer);\n }, 0);\n };\n }\n\n _createClass(PromisedWorker, [{\n key: 'postMessage',\n value: function postMessage(msg) {\n var id = this.id || 0;\n this.id = id + 1;\n msg.id = id;\n var self = this;\n return new Promise(function (resolve, reject) {\n // prepare the resolver\n self.resolvers[id] = function (err, res) {\n if (err) {\n self.convertGwtStyleError(err);\n reject(err);\n } else {\n resolve(res);\n }\n };\n // post the message\n self.worker.postMessage(msg);\n });\n }\n }, {\n key: 'receive',\n value: function receive(self, answer) {\n var json = answer.data;\n var resolver = self.resolvers[json.id];\n if (resolver) {\n delete self.resolvers[json.id];\n if (json.error) {\n resolver(json.error);\n } else {\n resolver(null, json.data);\n }\n }\n }\n }, {\n key: 'terminate',\n value: function terminate() {\n if (this.worker.terminate) {\n this.worker.terminate();\n }\n }\n }, {\n key: 'convertGwtStyleError',\n value: function convertGwtStyleError(err) {\n if (!err) {\n return;\n }\n // Somewhat flatten the way GWT stores nested exception(s)\n var javaException = err['__java$exception'];\n if (javaException) {\n // Note that the property name of the nested exception is different\n // in the non-minified ('cause') and the minified (not deterministic) version.\n // Hence, the version below only works for the non-minified version.\n // However, as the minified stack trace is not of much use anyway, one\n // should switch the used version for debugging in such a case.\n if (javaException.cause && javaException.cause.backingJsObject) {\n err.cause = javaException.cause.backingJsObject;\n this.convertGwtStyleError(err.cause);\n }\n delete err['__java$exception'];\n }\n }\n }]);\n\n return PromisedWorker;\n}();\n},{}],2:[function(require,module,exports){\n(function (global){(function (){\n'use strict';\n\n// -------------- FAKE ELEMENTS GWT ASSUMES EXIST -------------- \nvar $wnd;\nif (typeof window !== 'undefined')\n $wnd = window\nelse if (typeof global !== 'undefined')\n $wnd = global // nodejs\nelse if (typeof self !== 'undefined')\n $wnd = self // web worker\n\nvar $moduleName,\n $moduleBase;\n\n// -------------- WORKAROUND STRICT MODE, SEE #127 -------------- \nvar g, i, o;\n\n// -------------- GENERATED CODE -------------- \nfunction nb(){}\nfunction xb(){}\nfunction Fd(){}\nfunction $g(){}\nfunction _p(){}\nfunction yq(){}\nfunction Sq(){}\nfunction Es(){}\nfunction Jw(){}\nfunction Vw(){}\nfunction VA(){}\nfunction dA(){}\nfunction MA(){}\nfunction PA(){}\nfunction PB(){}\nfunction bx(){}\nfunction cx(){}\nfunction vy(){}\nfunction Nz(){}\nfunction Yz(){}\nfunction Ylb(){}\nfunction Ymb(){}\nfunction xmb(){}\nfunction Fmb(){}\nfunction Qmb(){}\nfunction gcb(){}\nfunction ccb(){}\nfunction jcb(){}\nfunction jtb(){}\nfunction otb(){}\nfunction qtb(){}\nfunction _fb(){}\nfunction bpb(){}\nfunction kpb(){}\nfunction ppb(){}\nfunction Gpb(){}\nfunction drb(){}\nfunction dzb(){}\nfunction fzb(){}\nfunction fxb(){}\nfunction Vxb(){}\nfunction Ovb(){}\nfunction byb(){}\nfunction zyb(){}\nfunction Zyb(){}\nfunction _yb(){}\nfunction hzb(){}\nfunction jzb(){}\nfunction lzb(){}\nfunction nzb(){}\nfunction rzb(){}\nfunction zzb(){}\nfunction Czb(){}\nfunction Ezb(){}\nfunction Gzb(){}\nfunction Izb(){}\nfunction Mzb(){}\nfunction bBb(){}\nfunction NBb(){}\nfunction PBb(){}\nfunction RBb(){}\nfunction iCb(){}\nfunction OCb(){}\nfunction SCb(){}\nfunction GDb(){}\nfunction JDb(){}\nfunction fEb(){}\nfunction xEb(){}\nfunction CEb(){}\nfunction GEb(){}\nfunction yFb(){}\nfunction KGb(){}\nfunction tIb(){}\nfunction vIb(){}\nfunction xIb(){}\nfunction zIb(){}\nfunction OIb(){}\nfunction SIb(){}\nfunction TJb(){}\nfunction VJb(){}\nfunction XJb(){}\nfunction XKb(){}\nfunction fKb(){}\nfunction VKb(){}\nfunction VLb(){}\nfunction jLb(){}\nfunction nLb(){}\nfunction GLb(){}\nfunction KLb(){}\nfunction MLb(){}\nfunction OLb(){}\nfunction RLb(){}\nfunction YLb(){}\nfunction bMb(){}\nfunction gMb(){}\nfunction lMb(){}\nfunction pMb(){}\nfunction wMb(){}\nfunction zMb(){}\nfunction CMb(){}\nfunction FMb(){}\nfunction LMb(){}\nfunction zNb(){}\nfunction PNb(){}\nfunction kOb(){}\nfunction pOb(){}\nfunction tOb(){}\nfunction yOb(){}\nfunction FOb(){}\nfunction GPb(){}\nfunction aQb(){}\nfunction cQb(){}\nfunction eQb(){}\nfunction gQb(){}\nfunction iQb(){}\nfunction CQb(){}\nfunction MQb(){}\nfunction OQb(){}\nfunction ASb(){}\nfunction fTb(){}\nfunction kTb(){}\nfunction STb(){}\nfunction fUb(){}\nfunction DUb(){}\nfunction VUb(){}\nfunction YUb(){}\nfunction _Ub(){}\nfunction _Wb(){}\nfunction QWb(){}\nfunction XWb(){}\nfunction jVb(){}\nfunction DVb(){}\nfunction VVb(){}\nfunction $Vb(){}\nfunction dXb(){}\nfunction hXb(){}\nfunction lXb(){}\nfunction gYb(){}\nfunction HYb(){}\nfunction SYb(){}\nfunction VYb(){}\nfunction dZb(){}\nfunction P$b(){}\nfunction T$b(){}\nfunction h1b(){}\nfunction m1b(){}\nfunction q1b(){}\nfunction u1b(){}\nfunction y1b(){}\nfunction C1b(){}\nfunction e2b(){}\nfunction g2b(){}\nfunction m2b(){}\nfunction q2b(){}\nfunction u2b(){}\nfunction S2b(){}\nfunction U2b(){}\nfunction W2b(){}\nfunction _2b(){}\nfunction e3b(){}\nfunction h3b(){}\nfunction p3b(){}\nfunction t3b(){}\nfunction w3b(){}\nfunction y3b(){}\nfunction A3b(){}\nfunction M3b(){}\nfunction Q3b(){}\nfunction U3b(){}\nfunction Y3b(){}\nfunction l4b(){}\nfunction q4b(){}\nfunction s4b(){}\nfunction u4b(){}\nfunction w4b(){}\nfunction y4b(){}\nfunction L4b(){}\nfunction N4b(){}\nfunction P4b(){}\nfunction R4b(){}\nfunction T4b(){}\nfunction X4b(){}\nfunction I5b(){}\nfunction Q5b(){}\nfunction T5b(){}\nfunction Z5b(){}\nfunction l6b(){}\nfunction o6b(){}\nfunction t6b(){}\nfunction z6b(){}\nfunction L6b(){}\nfunction M6b(){}\nfunction P6b(){}\nfunction X6b(){}\nfunction $6b(){}\nfunction a7b(){}\nfunction c7b(){}\nfunction g7b(){}\nfunction j7b(){}\nfunction m7b(){}\nfunction r7b(){}\nfunction x7b(){}\nfunction D7b(){}\nfunction D9b(){}\nfunction b9b(){}\nfunction h9b(){}\nfunction j9b(){}\nfunction l9b(){}\nfunction w9b(){}\nfunction F9b(){}\nfunction hac(){}\nfunction jac(){}\nfunction pac(){}\nfunction uac(){}\nfunction Iac(){}\nfunction Kac(){}\nfunction Sac(){}\nfunction obc(){}\nfunction rbc(){}\nfunction vbc(){}\nfunction Fbc(){}\nfunction Jbc(){}\nfunction Xbc(){}\nfunction ccc(){}\nfunction fcc(){}\nfunction lcc(){}\nfunction occ(){}\nfunction tcc(){}\nfunction ycc(){}\nfunction Acc(){}\nfunction Ccc(){}\nfunction Ecc(){}\nfunction Gcc(){}\nfunction Zcc(){}\nfunction _cc(){}\nfunction bdc(){}\nfunction fdc(){}\nfunction jdc(){}\nfunction pdc(){}\nfunction sdc(){}\nfunction ydc(){}\nfunction Adc(){}\nfunction Cdc(){}\nfunction Edc(){}\nfunction Idc(){}\nfunction Ndc(){}\nfunction Qdc(){}\nfunction Sdc(){}\nfunction Udc(){}\nfunction Wdc(){}\nfunction Ydc(){}\nfunction aec(){}\nfunction hec(){}\nfunction jec(){}\nfunction lec(){}\nfunction nec(){}\nfunction uec(){}\nfunction wec(){}\nfunction yec(){}\nfunction Aec(){}\nfunction Fec(){}\nfunction Jec(){}\nfunction Lec(){}\nfunction Nec(){}\nfunction Rec(){}\nfunction Uec(){}\nfunction Zec(){}\nfunction Zfc(){}\nfunction lfc(){}\nfunction tfc(){}\nfunction xfc(){}\nfunction zfc(){}\nfunction Ffc(){}\nfunction Jfc(){}\nfunction Nfc(){}\nfunction Pfc(){}\nfunction Vfc(){}\nfunction _fc(){}\nfunction fgc(){}\nfunction jgc(){}\nfunction lgc(){}\nfunction Bgc(){}\nfunction ehc(){}\nfunction ghc(){}\nfunction ihc(){}\nfunction khc(){}\nfunction mhc(){}\nfunction ohc(){}\nfunction qhc(){}\nfunction yhc(){}\nfunction Ahc(){}\nfunction Ghc(){}\nfunction Ihc(){}\nfunction Khc(){}\nfunction Mhc(){}\nfunction Shc(){}\nfunction Uhc(){}\nfunction Whc(){}\nfunction dic(){}\nfunction dlc(){}\nfunction blc(){}\nfunction flc(){}\nfunction hlc(){}\nfunction jlc(){}\nfunction Glc(){}\nfunction Ilc(){}\nfunction Klc(){}\nfunction Mlc(){}\nfunction Mjc(){}\nfunction Qjc(){}\nfunction Qlc(){}\nfunction Ulc(){}\nfunction Ylc(){}\nfunction Lkc(){}\nfunction Nkc(){}\nfunction Pkc(){}\nfunction Rkc(){}\nfunction Xkc(){}\nfunction _kc(){}\nfunction gmc(){}\nfunction kmc(){}\nfunction zmc(){}\nfunction Fmc(){}\nfunction Wmc(){}\nfunction $mc(){}\nfunction anc(){}\nfunction mnc(){}\nfunction wnc(){}\nfunction Hnc(){}\nfunction Jnc(){}\nfunction Lnc(){}\nfunction Nnc(){}\nfunction Pnc(){}\nfunction Ync(){}\nfunction eoc(){}\nfunction Aoc(){}\nfunction Coc(){}\nfunction Eoc(){}\nfunction Joc(){}\nfunction Loc(){}\nfunction Zoc(){}\nfunction _oc(){}\nfunction bpc(){}\nfunction hpc(){}\nfunction kpc(){}\nfunction ppc(){}\nfunction pFc(){}\nfunction Ryc(){}\nfunction QCc(){}\nfunction PDc(){}\nfunction xGc(){}\nfunction HGc(){}\nfunction JGc(){}\nfunction NGc(){}\nfunction GIc(){}\nfunction iKc(){}\nfunction mKc(){}\nfunction wKc(){}\nfunction yKc(){}\nfunction AKc(){}\nfunction EKc(){}\nfunction KKc(){}\nfunction OKc(){}\nfunction QKc(){}\nfunction SKc(){}\nfunction UKc(){}\nfunction YKc(){}\nfunction aLc(){}\nfunction fLc(){}\nfunction hLc(){}\nfunction nLc(){}\nfunction pLc(){}\nfunction tLc(){}\nfunction vLc(){}\nfunction zLc(){}\nfunction BLc(){}\nfunction DLc(){}\nfunction FLc(){}\nfunction sMc(){}\nfunction JMc(){}\nfunction hNc(){}\nfunction RNc(){}\nfunction ZNc(){}\nfunction _Nc(){}\nfunction bOc(){}\nfunction dOc(){}\nfunction fOc(){}\nfunction hOc(){}\nfunction hRc(){}\nfunction jRc(){}\nfunction KRc(){}\nfunction NRc(){}\nfunction NQc(){}\nfunction LQc(){}\nfunction _Qc(){}\nfunction cPc(){}\nfunction iPc(){}\nfunction kPc(){}\nfunction mPc(){}\nfunction xPc(){}\nfunction zPc(){}\nfunction zSc(){}\nfunction BSc(){}\nfunction GSc(){}\nfunction ISc(){}\nfunction NSc(){}\nfunction TSc(){}\nfunction NTc(){}\nfunction NVc(){}\nfunction oVc(){}\nfunction SVc(){}\nfunction VVc(){}\nfunction XVc(){}\nfunction ZVc(){}\nfunction bWc(){}\nfunction bXc(){}\nfunction CXc(){}\nfunction FXc(){}\nfunction IXc(){}\nfunction MXc(){}\nfunction UXc(){}\nfunction bYc(){}\nfunction fYc(){}\nfunction oYc(){}\nfunction qYc(){}\nfunction uYc(){}\nfunction pZc(){}\nfunction G$c(){}\nfunction h0c(){}\nfunction N0c(){}\nfunction k1c(){}\nfunction I1c(){}\nfunction Q1c(){}\nfunction f2c(){}\nfunction i2c(){}\nfunction k2c(){}\nfunction w2c(){}\nfunction O2c(){}\nfunction S2c(){}\nfunction Z2c(){}\nfunction v3c(){}\nfunction x3c(){}\nfunction R3c(){}\nfunction U3c(){}\nfunction e4c(){}\nfunction w4c(){}\nfunction x4c(){}\nfunction z4c(){}\nfunction B4c(){}\nfunction D4c(){}\nfunction F4c(){}\nfunction H4c(){}\nfunction J4c(){}\nfunction L4c(){}\nfunction N4c(){}\nfunction P4c(){}\nfunction R4c(){}\nfunction T4c(){}\nfunction V4c(){}\nfunction X4c(){}\nfunction Z4c(){}\nfunction _4c(){}\nfunction _7c(){}\nfunction b5c(){}\nfunction d5c(){}\nfunction f5c(){}\nfunction h5c(){}\nfunction H5c(){}\nfunction Hfd(){}\nfunction Zfd(){}\nfunction Zed(){}\nfunction ged(){}\nfunction Jed(){}\nfunction Ned(){}\nfunction Red(){}\nfunction Ved(){}\nfunction bbd(){}\nfunction mdd(){}\nfunction _fd(){}\nfunction fgd(){}\nfunction kgd(){}\nfunction Mgd(){}\nfunction Ahd(){}\nfunction Ald(){}\nfunction Tld(){}\nfunction xkd(){}\nfunction rmd(){}\nfunction knd(){}\nfunction Jod(){}\nfunction JCd(){}\nfunction Bpd(){}\nfunction BFd(){}\nfunction oFd(){}\nfunction bqd(){}\nfunction bvd(){}\nfunction jvd(){}\nfunction yud(){}\nfunction Hxd(){}\nfunction EBd(){}\nfunction aDd(){}\nfunction MGd(){}\nfunction vHd(){}\nfunction RHd(){}\nfunction wNd(){}\nfunction zNd(){}\nfunction CNd(){}\nfunction KNd(){}\nfunction XNd(){}\nfunction $Nd(){}\nfunction HPd(){}\nfunction lUd(){}\nfunction XUd(){}\nfunction DWd(){}\nfunction GWd(){}\nfunction JWd(){}\nfunction MWd(){}\nfunction PWd(){}\nfunction SWd(){}\nfunction VWd(){}\nfunction YWd(){}\nfunction _Wd(){}\nfunction xYd(){}\nfunction BYd(){}\nfunction mZd(){}\nfunction EZd(){}\nfunction GZd(){}\nfunction JZd(){}\nfunction MZd(){}\nfunction PZd(){}\nfunction SZd(){}\nfunction VZd(){}\nfunction YZd(){}\nfunction _Zd(){}\nfunction c$d(){}\nfunction f$d(){}\nfunction i$d(){}\nfunction l$d(){}\nfunction o$d(){}\nfunction r$d(){}\nfunction u$d(){}\nfunction x$d(){}\nfunction A$d(){}\nfunction D$d(){}\nfunction G$d(){}\nfunction J$d(){}\nfunction M$d(){}\nfunction P$d(){}\nfunction S$d(){}\nfunction V$d(){}\nfunction Y$d(){}\nfunction _$d(){}\nfunction c_d(){}\nfunction f_d(){}\nfunction i_d(){}\nfunction l_d(){}\nfunction o_d(){}\nfunction r_d(){}\nfunction u_d(){}\nfunction x_d(){}\nfunction A_d(){}\nfunction D_d(){}\nfunction G_d(){}\nfunction J_d(){}\nfunction M_d(){}\nfunction P_d(){}\nfunction S_d(){}\nfunction V_d(){}\nfunction Y_d(){}\nfunction h5d(){}\nfunction U6d(){}\nfunction U9d(){}\nfunction _8d(){}\nfunction fae(){}\nfunction hae(){}\nfunction kae(){}\nfunction nae(){}\nfunction qae(){}\nfunction tae(){}\nfunction wae(){}\nfunction zae(){}\nfunction Cae(){}\nfunction Fae(){}\nfunction Iae(){}\nfunction Lae(){}\nfunction Oae(){}\nfunction Rae(){}\nfunction Uae(){}\nfunction Xae(){}\nfunction $ae(){}\nfunction bbe(){}\nfunction ebe(){}\nfunction hbe(){}\nfunction kbe(){}\nfunction nbe(){}\nfunction qbe(){}\nfunction tbe(){}\nfunction wbe(){}\nfunction zbe(){}\nfunction Cbe(){}\nfunction Fbe(){}\nfunction Ibe(){}\nfunction Lbe(){}\nfunction Obe(){}\nfunction Rbe(){}\nfunction Ube(){}\nfunction Xbe(){}\nfunction $be(){}\nfunction bce(){}\nfunction ece(){}\nfunction hce(){}\nfunction kce(){}\nfunction nce(){}\nfunction qce(){}\nfunction tce(){}\nfunction wce(){}\nfunction zce(){}\nfunction Cce(){}\nfunction Fce(){}\nfunction Ice(){}\nfunction Lce(){}\nfunction Oce(){}\nfunction Rce(){}\nfunction Uce(){}\nfunction Xce(){}\nfunction ude(){}\nfunction Vge(){}\nfunction dhe(){}\nfunction s_b(a){}\nfunction jSd(a){}\nfunction ol(){wb()}\nfunction oPb(){nPb()}\nfunction EPb(){CPb()}\nfunction gFb(){fFb()}\nfunction TRb(){SRb()}\nfunction ySb(){wSb()}\nfunction PSb(){OSb()}\nfunction dTb(){bTb()}\nfunction i4b(){b4b()}\nfunction D2b(){x2b()}\nfunction J6b(){D6b()}\nfunction u9b(){q9b()}\nfunction $9b(){I9b()}\nfunction Umc(){Imc()}\nfunction abc(){Vac()}\nfunction ZCc(){VCc()}\nfunction kCc(){hCc()}\nfunction rCc(){oCc()}\nfunction Tcc(){Occ()}\nfunction xkc(){gkc()}\nfunction xDc(){rDc()}\nfunction iDc(){cDc()}\nfunction kwc(){jwc()}\nfunction tJc(){jJc()}\nfunction dJc(){aJc()}\nfunction Pyc(){Nyc()}\nfunction VBc(){SBc()}\nfunction CFc(){yFc()}\nfunction CUc(){wUc()}\nfunction lUc(){fUc()}\nfunction sUc(){pUc()}\nfunction IUc(){GUc()}\nfunction IWc(){HWc()}\nfunction _Wc(){ZWc()}\nfunction fHc(){dHc()}\nfunction f0c(){d0c()}\nfunction B0c(){A0c()}\nfunction L0c(){J0c()}\nfunction LTc(){JTc()}\nfunction sTc(){rTc()}\nfunction KLc(){ILc()}\nfunction wNc(){tNc()}\nfunction PYc(){OYc()}\nfunction nZc(){lZc()}\nfunction q3c(){p3c()}\nfunction Z7c(){X7c()}\nfunction Z9c(){Y9c()}\nfunction _ad(){Zad()}\nfunction kdd(){idd()}\nfunction $md(){Smd()}\nfunction HGd(){tGd()}\nfunction hLd(){NKd()}\nfunction J6d(){Uge()}\nfunction Mvb(a){uCb(a)}\nfunction Yb(a){this.a=a}\nfunction cc(a){this.a=a}\nfunction cj(a){this.a=a}\nfunction ij(a){this.a=a}\nfunction Dj(a){this.a=a}\nfunction df(a){this.a=a}\nfunction kf(a){this.a=a}\nfunction ah(a){this.a=a}\nfunction lh(a){this.a=a}\nfunction th(a){this.a=a}\nfunction Ph(a){this.a=a}\nfunction vi(a){this.a=a}\nfunction Ci(a){this.a=a}\nfunction Fk(a){this.a=a}\nfunction Ln(a){this.a=a}\nfunction ap(a){this.a=a}\nfunction zp(a){this.a=a}\nfunction Yp(a){this.a=a}\nfunction qq(a){this.a=a}\nfunction Dq(a){this.a=a}\nfunction wr(a){this.a=a}\nfunction Ir(a){this.b=a}\nfunction sj(a){this.c=a}\nfunction sw(a){this.a=a}\nfunction fw(a){this.a=a}\nfunction xw(a){this.a=a}\nfunction Cw(a){this.a=a}\nfunction Qw(a){this.a=a}\nfunction Rw(a){this.a=a}\nfunction Xw(a){this.a=a}\nfunction Xv(a){this.a=a}\nfunction Sv(a){this.a=a}\nfunction eu(a){this.a=a}\nfunction Zx(a){this.a=a}\nfunction _x(a){this.a=a}\nfunction xy(a){this.a=a}\nfunction xB(a){this.a=a}\nfunction HB(a){this.a=a}\nfunction TB(a){this.a=a}\nfunction fC(a){this.a=a}\nfunction wB(){this.a=[]}\nfunction MBb(a,b){a.a=b}\nfunction w_b(a,b){a.a=b}\nfunction x_b(a,b){a.b=b}\nfunction YOb(a,b){a.b=b}\nfunction $Ob(a,b){a.b=b}\nfunction ZGb(a,b){a.j=b}\nfunction qNb(a,b){a.g=b}\nfunction rNb(a,b){a.i=b}\nfunction dRb(a,b){a.c=b}\nfunction eRb(a,b){a.d=b}\nfunction z_b(a,b){a.d=b}\nfunction y_b(a,b){a.c=b}\nfunction __b(a,b){a.k=b}\nfunction E0b(a,b){a.c=b}\nfunction njc(a,b){a.c=b}\nfunction mjc(a,b){a.a=b}\nfunction dFc(a,b){a.a=b}\nfunction eFc(a,b){a.f=b}\nfunction nOc(a,b){a.a=b}\nfunction oOc(a,b){a.b=b}\nfunction pOc(a,b){a.d=b}\nfunction qOc(a,b){a.i=b}\nfunction rOc(a,b){a.o=b}\nfunction sOc(a,b){a.r=b}\nfunction $Pc(a,b){a.a=b}\nfunction _Pc(a,b){a.b=b}\nfunction DVc(a,b){a.e=b}\nfunction EVc(a,b){a.f=b}\nfunction FVc(a,b){a.g=b}\nfunction SZc(a,b){a.e=b}\nfunction TZc(a,b){a.f=b}\nfunction c$c(a,b){a.f=b}\nfunction bJd(a,b){a.n=b}\nfunction A1d(a,b){a.a=b}\nfunction J1d(a,b){a.a=b}\nfunction B1d(a,b){a.c=b}\nfunction K1d(a,b){a.c=b}\nfunction L1d(a,b){a.d=b}\nfunction M1d(a,b){a.e=b}\nfunction N1d(a,b){a.g=b}\nfunction d2d(a,b){a.a=b}\nfunction e2d(a,b){a.c=b}\nfunction f2d(a,b){a.d=b}\nfunction g2d(a,b){a.e=b}\nfunction h2d(a,b){a.f=b}\nfunction i2d(a,b){a.j=b}\nfunction Z8d(a,b){a.a=b}\nfunction $8d(a,b){a.b=b}\nfunction g9d(a,b){a.a=b}\nfunction Cic(a){a.b=a.a}\nfunction Dg(a){a.c=a.d.d}\nfunction vib(a){this.d=a}\nfunction eib(a){this.a=a}\nfunction Pib(a){this.a=a}\nfunction Vib(a){this.a=a}\nfunction $ib(a){this.a=a}\nfunction mcb(a){this.a=a}\nfunction Mcb(a){this.a=a}\nfunction Xcb(a){this.a=a}\nfunction Ndb(a){this.a=a}\nfunction _db(a){this.a=a}\nfunction teb(a){this.a=a}\nfunction Qeb(a){this.a=a}\nfunction djb(a){this.a=a}\nfunction Gjb(a){this.a=a}\nfunction Njb(a){this.a=a}\nfunction Bjb(a){this.b=a}\nfunction lnb(a){this.b=a}\nfunction Dnb(a){this.b=a}\nfunction anb(a){this.a=a}\nfunction Mob(a){this.a=a}\nfunction Rob(a){this.a=a}\nfunction iob(a){this.c=a}\nfunction olb(a){this.c=a}\nfunction qub(a){this.c=a}\nfunction Tub(a){this.a=a}\nfunction Vub(a){this.a=a}\nfunction Xub(a){this.a=a}\nfunction Zub(a){this.a=a}\nfunction tpb(a){this.a=a}\nfunction _pb(a){this.a=a}\nfunction Wqb(a){this.a=a}\nfunction nsb(a){this.a=a}\nfunction Rxb(a){this.a=a}\nfunction Txb(a){this.a=a}\nfunction Xxb(a){this.a=a}\nfunction bzb(a){this.a=a}\nfunction tzb(a){this.a=a}\nfunction vzb(a){this.a=a}\nfunction xzb(a){this.a=a}\nfunction Kzb(a){this.a=a}\nfunction Ozb(a){this.a=a}\nfunction iAb(a){this.a=a}\nfunction kAb(a){this.a=a}\nfunction mAb(a){this.a=a}\nfunction BAb(a){this.a=a}\nfunction hBb(a){this.a=a}\nfunction jBb(a){this.a=a}\nfunction nBb(a){this.a=a}\nfunction TBb(a){this.a=a}\nfunction XBb(a){this.a=a}\nfunction QCb(a){this.a=a}\nfunction WCb(a){this.a=a}\nfunction _Cb(a){this.a=a}\nfunction dEb(a){this.a=a}\nfunction QGb(a){this.a=a}\nfunction YGb(a){this.a=a}\nfunction tKb(a){this.a=a}\nfunction CLb(a){this.a=a}\nfunction JMb(a){this.a=a}\nfunction RNb(a){this.a=a}\nfunction kQb(a){this.a=a}\nfunction mQb(a){this.a=a}\nfunction FQb(a){this.a=a}\nfunction ETb(a){this.a=a}\nfunction UTb(a){this.a=a}\nfunction dUb(a){this.a=a}\nfunction hUb(a){this.a=a}\nfunction EZb(a){this.a=a}\nfunction j$b(a){this.a=a}\nfunction v$b(a){this.e=a}\nfunction J0b(a){this.a=a}\nfunction M0b(a){this.a=a}\nfunction R0b(a){this.a=a}\nfunction U0b(a){this.a=a}\nfunction i2b(a){this.a=a}\nfunction k2b(a){this.a=a}\nfunction o2b(a){this.a=a}\nfunction s2b(a){this.a=a}\nfunction G2b(a){this.a=a}\nfunction I2b(a){this.a=a}\nfunction K2b(a){this.a=a}\nfunction M2b(a){this.a=a}\nfunction W3b(a){this.a=a}\nfunction $3b(a){this.a=a}\nfunction V4b(a){this.a=a}\nfunction u5b(a){this.a=a}\nfunction A7b(a){this.a=a}\nfunction G7b(a){this.a=a}\nfunction J7b(a){this.a=a}\nfunction M7b(a){this.a=a}\nfunction Mbc(a){this.a=a}\nfunction Pbc(a){this.a=a}\nfunction lac(a){this.a=a}\nfunction nac(a){this.a=a}\nfunction qcc(a){this.a=a}\nfunction Gdc(a){this.a=a}\nfunction $dc(a){this.a=a}\nfunction cec(a){this.a=a}\nfunction _ec(a){this.a=a}\nfunction pfc(a){this.a=a}\nfunction Bfc(a){this.a=a}\nfunction Lfc(a){this.a=a}\nfunction ygc(a){this.a=a}\nfunction Dgc(a){this.a=a}\nfunction shc(a){this.a=a}\nfunction uhc(a){this.a=a}\nfunction whc(a){this.a=a}\nfunction Chc(a){this.a=a}\nfunction Ehc(a){this.a=a}\nfunction Ohc(a){this.a=a}\nfunction Yhc(a){this.a=a}\nfunction Tkc(a){this.a=a}\nfunction Vkc(a){this.a=a}\nfunction Olc(a){this.a=a}\nfunction pnc(a){this.a=a}\nfunction rnc(a){this.a=a}\nfunction dpc(a){this.a=a}\nfunction fpc(a){this.a=a}\nfunction GCc(a){this.a=a}\nfunction KCc(a){this.a=a}\nfunction mDc(a){this.a=a}\nfunction jEc(a){this.a=a}\nfunction HEc(a){this.a=a}\nfunction FEc(a){this.c=a}\nfunction qoc(a){this.b=a}\nfunction bFc(a){this.a=a}\nfunction GFc(a){this.a=a}\nfunction iGc(a){this.a=a}\nfunction kGc(a){this.a=a}\nfunction mGc(a){this.a=a}\nfunction $Gc(a){this.a=a}\nfunction hIc(a){this.a=a}\nfunction lIc(a){this.a=a}\nfunction pIc(a){this.a=a}\nfunction tIc(a){this.a=a}\nfunction xIc(a){this.a=a}\nfunction zIc(a){this.a=a}\nfunction CIc(a){this.a=a}\nfunction LIc(a){this.a=a}\nfunction CKc(a){this.a=a}\nfunction IKc(a){this.a=a}\nfunction MKc(a){this.a=a}\nfunction $Kc(a){this.a=a}\nfunction cLc(a){this.a=a}\nfunction jLc(a){this.a=a}\nfunction rLc(a){this.a=a}\nfunction xLc(a){this.a=a}\nfunction OMc(a){this.a=a}\nfunction ZOc(a){this.a=a}\nfunction ZRc(a){this.a=a}\nfunction aSc(a){this.a=a}\nfunction I$c(a){this.a=a}\nfunction K$c(a){this.a=a}\nfunction M$c(a){this.a=a}\nfunction O$c(a){this.a=a}\nfunction U$c(a){this.a=a}\nfunction n1c(a){this.a=a}\nfunction z1c(a){this.a=a}\nfunction B1c(a){this.a=a}\nfunction Q2c(a){this.a=a}\nfunction U2c(a){this.a=a}\nfunction z3c(a){this.a=a}\nfunction med(a){this.a=a}\nfunction Xed(a){this.a=a}\nfunction _ed(a){this.a=a}\nfunction Qfd(a){this.a=a}\nfunction Bgd(a){this.a=a}\nfunction $gd(a){this.a=a}\nfunction lrd(a){this.a=a}\nfunction urd(a){this.a=a}\nfunction vrd(a){this.a=a}\nfunction wrd(a){this.a=a}\nfunction xrd(a){this.a=a}\nfunction yrd(a){this.a=a}\nfunction zrd(a){this.a=a}\nfunction Ard(a){this.a=a}\nfunction Brd(a){this.a=a}\nfunction Crd(a){this.a=a}\nfunction Ird(a){this.a=a}\nfunction Krd(a){this.a=a}\nfunction Lrd(a){this.a=a}\nfunction Mrd(a){this.a=a}\nfunction Nrd(a){this.a=a}\nfunction Prd(a){this.a=a}\nfunction Srd(a){this.a=a}\nfunction Yrd(a){this.a=a}\nfunction Zrd(a){this.a=a}\nfunction _rd(a){this.a=a}\nfunction asd(a){this.a=a}\nfunction bsd(a){this.a=a}\nfunction csd(a){this.a=a}\nfunction dsd(a){this.a=a}\nfunction msd(a){this.a=a}\nfunction osd(a){this.a=a}\nfunction qsd(a){this.a=a}\nfunction ssd(a){this.a=a}\nfunction Wsd(a){this.a=a}\nfunction Lsd(a){this.b=a}\nfunction thd(a){this.f=a}\nfunction qtd(a){this.a=a}\nfunction yBd(a){this.a=a}\nfunction GBd(a){this.a=a}\nfunction MBd(a){this.a=a}\nfunction SBd(a){this.a=a}\nfunction iCd(a){this.a=a}\nfunction YMd(a){this.a=a}\nfunction GNd(a){this.a=a}\nfunction EPd(a){this.a=a}\nfunction EQd(a){this.a=a}\nfunction NTd(a){this.a=a}\nfunction qOd(a){this.b=a}\nfunction lVd(a){this.c=a}\nfunction VVd(a){this.e=a}\nfunction iYd(a){this.a=a}\nfunction RYd(a){this.a=a}\nfunction ZYd(a){this.a=a}\nfunction z0d(a){this.a=a}\nfunction O0d(a){this.a=a}\nfunction s0d(a){this.d=a}\nfunction W5d(a){this.a=a}\nfunction cge(a){this.a=a}\nfunction xfe(a){this.e=a}\nfunction Tfd(){this.a=0}\nfunction jkb(){Vjb(this)}\nfunction Rkb(){Ckb(this)}\nfunction Lqb(){Uhb(this)}\nfunction lEb(){kEb(this)}\nfunction A_b(){s_b(this)}\nfunction UQd(){this.c=FQd}\nfunction v6d(a,b){b.Wb(a)}\nfunction moc(a,b){a.b+=b}\nfunction yXb(a){a.b=new Ji}\nfunction vbb(a){return a.e}\nfunction DB(a){return a.a}\nfunction LB(a){return a.a}\nfunction ZB(a){return a.a}\nfunction lC(a){return a.a}\nfunction EC(a){return a.a}\nfunction wC(){return null}\nfunction SB(){return null}\nfunction hcb(){mvd();ovd()}\nfunction zJb(a){a.b.tf(a.e)}\nfunction j5b(a,b){a.b=b-a.b}\nfunction g5b(a,b){a.a=b-a.a}\nfunction PXc(a,b){b.ad(a.a)}\nfunction plc(a,b){G0b(b,a)}\nfunction hp(a,b,c){a.Od(c,b)}\nfunction As(a,b){a.e=b;b.b=a}\nfunction Zl(a){Ql();this.a=a}\nfunction jq(a){Ql();this.a=a}\nfunction sq(a){Ql();this.a=a}\nfunction Fq(a){im();this.a=a}\nfunction Sz(a){Rz();Qz.be(a)}\nfunction gz(){Xy.call(this)}\nfunction xcb(){Xy.call(this)}\nfunction pcb(){gz.call(this)}\nfunction tcb(){gz.call(this)}\nfunction Bdb(){gz.call(this)}\nfunction Vdb(){gz.call(this)}\nfunction Ydb(){gz.call(this)}\nfunction Geb(){gz.call(this)}\nfunction bgb(){gz.call(this)}\nfunction Apb(){gz.call(this)}\nfunction Jpb(){gz.call(this)}\nfunction utb(){gz.call(this)}\nfunction x2c(){gz.call(this)}\nfunction rQd(){this.a=this}\nfunction MPd(){this.Bb|=256}\nfunction tTb(){this.b=new mt}\nfunction fA(){fA=ccb;new Lqb}\nfunction rcb(){pcb.call(this)}\nfunction dCb(a,b){a.length=b}\nfunction Tvb(a,b){Ekb(a.a,b)}\nfunction sKb(a,b){UHb(a.c,b)}\nfunction SMc(a,b){Qqb(a.b,b)}\nfunction vBd(a,b){uAd(a.a,b)}\nfunction wBd(a,b){vAd(a.a,b)}\nfunction GLd(a,b){Uhd(a.e,b)}\nfunction d7d(a){D2d(a.c,a.b)}\nfunction mj(a,b){a.kc().Nb(b)}\nfunction Odb(a){this.a=Tdb(a)}\nfunction Tqb(){this.a=new Lqb}\nfunction gyb(){this.a=new Lqb}\nfunction Wvb(){this.a=new Rkb}\nfunction KFb(){this.a=new Rkb}\nfunction PFb(){this.a=new Rkb}\nfunction FFb(){this.a=new yFb}\nfunction pGb(){this.a=new MFb}\nfunction ZQb(){this.a=new MQb}\nfunction Gxb(){this.a=new Pwb}\nfunction jUb(){this.a=new PTb}\nfunction sDb(){this.a=new oDb}\nfunction zDb(){this.a=new tDb}\nfunction CWb(){this.a=new Rkb}\nfunction HXb(){this.a=new Rkb}\nfunction nYb(){this.a=new Rkb}\nfunction BYb(){this.a=new Rkb}\nfunction fLb(){this.d=new Rkb}\nfunction vYb(){this.a=new Tqb}\nfunction a2b(){this.a=new Lqb}\nfunction wZb(){this.b=new Lqb}\nfunction TCc(){this.b=new Rkb}\nfunction zJc(){this.e=new Rkb}\nfunction uMc(){this.d=new Rkb}\nfunction wdc(){this.a=new xkc}\nfunction vKc(){Rkb.call(this)}\nfunction twb(){Wvb.call(this)}\nfunction oHb(){$Gb.call(this)}\nfunction LXb(){HXb.call(this)}\nfunction L_b(){H_b.call(this)}\nfunction H_b(){A_b.call(this)}\nfunction p0b(){A_b.call(this)}\nfunction s0b(){p0b.call(this)}\nfunction WMc(){VMc.call(this)}\nfunction bNc(){VMc.call(this)}\nfunction EPc(){CPc.call(this)}\nfunction JPc(){CPc.call(this)}\nfunction OPc(){CPc.call(this)}\nfunction w1c(){s1c.call(this)}\nfunction s7c(){Psb.call(this)}\nfunction apd(){Ald.call(this)}\nfunction ppd(){Ald.call(this)}\nfunction lDd(){YCd.call(this)}\nfunction NDd(){YCd.call(this)}\nfunction mFd(){Lqb.call(this)}\nfunction vFd(){Lqb.call(this)}\nfunction GFd(){Lqb.call(this)}\nfunction KPd(){Tqb.call(this)}\nfunction OJd(){hJd.call(this)}\nfunction aQd(){MPd.call(this)}\nfunction SSd(){FId.call(this)}\nfunction rUd(){FId.call(this)}\nfunction oUd(){Lqb.call(this)}\nfunction NYd(){Lqb.call(this)}\nfunction cZd(){Lqb.call(this)}\nfunction R8d(){MGd.call(this)}\nfunction o9d(){MGd.call(this)}\nfunction i9d(){R8d.call(this)}\nfunction hee(){ude.call(this)}\nfunction Dd(a){yd.call(this,a)}\nfunction Hd(a){yd.call(this,a)}\nfunction ph(a){lh.call(this,a)}\nfunction Sh(a){Wc.call(this,a)}\nfunction oi(a){Sh.call(this,a)}\nfunction Ii(a){Wc.call(this,a)}\nfunction Zdd(){this.a=new Psb}\nfunction CPc(){this.a=new Tqb}\nfunction s1c(){this.a=new Lqb}\nfunction QSc(){this.a=new Rkb}\nfunction D2c(){this.j=new Rkb}\nfunction QXc(){this.a=new UXc}\nfunction e_c(){this.a=new d_c}\nfunction YCd(){this.a=new aDd}\nfunction _k(){_k=ccb;$k=new al}\nfunction Lk(){Lk=ccb;Kk=new Mk}\nfunction wb(){wb=ccb;vb=new xb}\nfunction hs(){hs=ccb;gs=new is}\nfunction rs(a){Sh.call(this,a)}\nfunction Gp(a){Sh.call(this,a)}\nfunction xp(a){Lo.call(this,a)}\nfunction Ep(a){Lo.call(this,a)}\nfunction Tp(a){Wn.call(this,a)}\nfunction wx(a){un.call(this,a)}\nfunction ov(a){dv.call(this,a)}\nfunction Mv(a){Br.call(this,a)}\nfunction Ov(a){Br.call(this,a)}\nfunction Lw(a){Br.call(this,a)}\nfunction hz(a){Yy.call(this,a)}\nfunction MB(a){hz.call(this,a)}\nfunction eC(){fC.call(this,{})}\nfunction Ftb(a){Atb();this.a=a}\nfunction zwb(a){a.b=null;a.c=0}\nfunction Vy(a,b){a.e=b;Sy(a,b)}\nfunction LVb(a,b){a.a=b;NVb(a)}\nfunction lIb(a,b,c){a.a[b.g]=c}\nfunction vfd(a,b,c){Dfd(c,a,b)}\nfunction Odc(a,b){rjc(b.i,a.n)}\nfunction Wyc(a,b){Xyc(a).td(b)}\nfunction ERb(a,b){return a*a/b}\nfunction Xr(a,b){return a.g-b.g}\nfunction tC(a){return new TB(a)}\nfunction vC(a){return new yC(a)}\nfunction ocb(a){hz.call(this,a)}\nfunction qcb(a){hz.call(this,a)}\nfunction ucb(a){hz.call(this,a)}\nfunction vcb(a){Yy.call(this,a)}\nfunction fGc(a){LFc();this.a=a}\nfunction c0d(a){kzd();this.a=a}\nfunction bhd(a){Rgd();this.f=a}\nfunction dhd(a){Rgd();this.f=a}\nfunction Cdb(a){hz.call(this,a)}\nfunction Wdb(a){hz.call(this,a)}\nfunction Zdb(a){hz.call(this,a)}\nfunction Feb(a){hz.call(this,a)}\nfunction Heb(a){hz.call(this,a)}\nfunction Ccb(a){return uCb(a),a}\nfunction Edb(a){return uCb(a),a}\nfunction Gdb(a){return uCb(a),a}\nfunction jfb(a){return uCb(a),a}\nfunction tfb(a){return uCb(a),a}\nfunction akb(a){return a.b==a.c}\nfunction Hwb(a){return !!a&&a.b}\nfunction pIb(a){return !!a&&a.k}\nfunction qIb(a){return !!a&&a.j}\nfunction amb(a){uCb(a);this.a=a}\nfunction wVb(a){qVb(a);return a}\nfunction Blb(a){Glb(a,a.length)}\nfunction cgb(a){hz.call(this,a)}\nfunction cqd(a){hz.call(this,a)}\nfunction n8d(a){hz.call(this,a)}\nfunction y2c(a){hz.call(this,a)}\nfunction z2c(a){hz.call(this,a)}\nfunction mde(a){hz.call(this,a)}\nfunction pc(a){qc.call(this,a,0)}\nfunction Ji(){Ki.call(this,12,3)}\nfunction Kz(){Kz=ccb;Jz=new Nz}\nfunction jz(){jz=ccb;iz=new nb}\nfunction KA(){KA=ccb;JA=new MA}\nfunction OB(){OB=ccb;NB=new PB}\nfunction jc(){throw vbb(new bgb)}\nfunction zh(){throw vbb(new bgb)}\nfunction Pi(){throw vbb(new bgb)}\nfunction Pj(){throw vbb(new bgb)}\nfunction Qj(){throw vbb(new bgb)}\nfunction Ym(){throw vbb(new bgb)}\nfunction Gb(){this.a=GD(Qb(She))}\nfunction oy(a){Ql();this.a=Qb(a)}\nfunction Bs(a,b){a.Td(b);b.Sd(a)}\nfunction iw(a,b){a.a.ec().Mc(b)}\nfunction CYb(a,b,c){a.c.lf(b,c)}\nfunction scb(a){qcb.call(this,a)}\nfunction Oeb(a){Wdb.call(this,a)}\nfunction Hfb(){mcb.call(this,'')}\nfunction Ifb(){mcb.call(this,'')}\nfunction Ufb(){mcb.call(this,'')}\nfunction Vfb(){mcb.call(this,'')}\nfunction Xfb(a){qcb.call(this,a)}\nfunction zob(a){lnb.call(this,a)}\nfunction Yob(a){Inb.call(this,a)}\nfunction Gob(a){zob.call(this,a)}\nfunction Mk(){Fk.call(this,null)}\nfunction al(){Fk.call(this,null)}\nfunction Az(){Az=ccb;!!(Rz(),Qz)}\nfunction wrb(){wrb=ccb;vrb=yrb()}\nfunction Mtb(a){return a.a?a.b:0}\nfunction Vtb(a){return a.a?a.b:0}\nfunction Lcb(a,b){return a.a-b.a}\nfunction Wcb(a,b){return a.a-b.a}\nfunction Peb(a,b){return a.a-b.a}\nfunction eCb(a,b){return PC(a,b)}\nfunction GC(a,b){return rdb(a,b)}\nfunction _B(b,a){return a in b.a}\nfunction _Db(a,b){a.f=b;return a}\nfunction ZDb(a,b){a.b=b;return a}\nfunction $Db(a,b){a.c=b;return a}\nfunction aEb(a,b){a.g=b;return a}\nfunction HGb(a,b){a.a=b;return a}\nfunction IGb(a,b){a.f=b;return a}\nfunction JGb(a,b){a.k=b;return a}\nfunction dLb(a,b){a.a=b;return a}\nfunction eLb(a,b){a.e=b;return a}\nfunction zVb(a,b){a.e=b;return a}\nfunction AVb(a,b){a.f=b;return a}\nfunction KOb(a,b){a.b=true;a.d=b}\nfunction DHb(a,b){a.b=new g7c(b)}\nfunction uvb(a,b,c){b.td(a.a[c])}\nfunction zvb(a,b,c){b.we(a.a[c])}\nfunction wJc(a,b){return a.b-b.b}\nfunction kOc(a,b){return a.g-b.g}\nfunction WQc(a,b){return a.s-b.s}\nfunction Lic(a,b){return a?0:b-1}\nfunction SFc(a,b){return a?0:b-1}\nfunction RFc(a,b){return a?b-1:0}\nfunction M2c(a,b){return b.Yf(a)}\nfunction M3c(a,b){a.b=b;return a}\nfunction L3c(a,b){a.a=b;return a}\nfunction N3c(a,b){a.c=b;return a}\nfunction O3c(a,b){a.d=b;return a}\nfunction P3c(a,b){a.e=b;return a}\nfunction Q3c(a,b){a.f=b;return a}\nfunction b4c(a,b){a.a=b;return a}\nfunction c4c(a,b){a.b=b;return a}\nfunction d4c(a,b){a.c=b;return a}\nfunction z5c(a,b){a.c=b;return a}\nfunction y5c(a,b){a.b=b;return a}\nfunction A5c(a,b){a.d=b;return a}\nfunction B5c(a,b){a.e=b;return a}\nfunction C5c(a,b){a.f=b;return a}\nfunction D5c(a,b){a.g=b;return a}\nfunction E5c(a,b){a.a=b;return a}\nfunction F5c(a,b){a.i=b;return a}\nfunction G5c(a,b){a.j=b;return a}\nfunction Vdd(a,b){a.k=b;return a}\nfunction Wdd(a,b){a.j=b;return a}\nfunction ykc(a,b){gkc();F0b(b,a)}\nfunction T$c(a,b,c){R$c(a.a,b,c)}\nfunction RGc(a){cEc.call(this,a)}\nfunction iHc(a){cEc.call(this,a)}\nfunction t7c(a){Qsb.call(this,a)}\nfunction aPb(a){_Ob.call(this,a)}\nfunction Ixd(a){zud.call(this,a)}\nfunction dCd(a){ZBd.call(this,a)}\nfunction fCd(a){ZBd.call(this,a)}\nfunction p_b(){q_b.call(this,'')}\nfunction d7c(){this.a=0;this.b=0}\nfunction aPc(){this.b=0;this.a=0}\nfunction NJd(a,b){a.b=0;DId(a,b)}\nfunction X1d(a,b){a.c=b;a.b=true}\nfunction Oc(a,b){return a.c._b(b)}\nfunction gdb(a){return a.e&&a.e()}\nfunction Vd(a){return !a?null:a.d}\nfunction sn(a,b){return Gv(a.b,b)}\nfunction Fv(a){return !a?null:a.g}\nfunction Kv(a){return !a?null:a.i}\nfunction hdb(a){fdb(a);return a.o}\nfunction Fhd(){Fhd=ccb;Ehd=ond()}\nfunction Hhd(){Hhd=ccb;Ghd=Cod()}\nfunction LFd(){LFd=ccb;KFd=qZd()}\nfunction p8d(){p8d=ccb;o8d=Y9d()}\nfunction r8d(){r8d=ccb;q8d=dae()}\nfunction mvd(){mvd=ccb;lvd=n4c()}\nfunction Srb(){throw vbb(new bgb)}\nfunction enb(){throw vbb(new bgb)}\nfunction fnb(){throw vbb(new bgb)}\nfunction gnb(){throw vbb(new bgb)}\nfunction jnb(){throw vbb(new bgb)}\nfunction Cnb(){throw vbb(new bgb)}\nfunction Uqb(a){this.a=new Mqb(a)}\nfunction tgb(a){lgb();ngb(this,a)}\nfunction Hxb(a){this.a=new Qwb(a)}\nfunction _ub(a,b){while(a.ye(b));}\nfunction Sub(a,b){while(a.sd(b));}\nfunction Bfb(a,b){a.a+=b;return a}\nfunction Cfb(a,b){a.a+=b;return a}\nfunction Ffb(a,b){a.a+=b;return a}\nfunction Lfb(a,b){a.a+=b;return a}\nfunction WAb(a){Tzb(a);return a.a}\nfunction Wsb(a){return a.b!=a.d.c}\nfunction pD(a){return a.l|a.m<<22}\nfunction aIc(a,b){return a.d[b.p]}\nfunction h2c(a,b){return c2c(a,b)}\nfunction cCb(a,b,c){a.splice(b,c)}\nfunction WHb(a){a.c?VHb(a):XHb(a)}\nfunction jVc(a){this.a=0;this.b=a}\nfunction ZUc(){this.a=new L2c(K$)}\nfunction tRc(){this.b=new L2c(h$)}\nfunction Q$c(){this.b=new L2c(J_)}\nfunction d_c(){this.b=new L2c(J_)}\nfunction OCd(){throw vbb(new bgb)}\nfunction PCd(){throw vbb(new bgb)}\nfunction QCd(){throw vbb(new bgb)}\nfunction RCd(){throw vbb(new bgb)}\nfunction SCd(){throw vbb(new bgb)}\nfunction TCd(){throw vbb(new bgb)}\nfunction UCd(){throw vbb(new bgb)}\nfunction VCd(){throw vbb(new bgb)}\nfunction WCd(){throw vbb(new bgb)}\nfunction XCd(){throw vbb(new bgb)}\nfunction ahe(){throw vbb(new utb)}\nfunction bhe(){throw vbb(new utb)}\nfunction Rge(a){this.a=new ege(a)}\nfunction ege(a){dge(this,a,Vee())}\nfunction Fhe(a){return !a||Ehe(a)}\nfunction dde(a){return $ce[a]!=-1}\nfunction Iz(){xz!=0&&(xz=0);zz=-1}\nfunction Ybb(){Wbb==null&&(Wbb=[])}\nfunction ONd(a,b){Rxd(ZKd(a.a),b)}\nfunction TNd(a,b){Rxd(ZKd(a.a),b)}\nfunction Yf(a,b){zf.call(this,a,b)}\nfunction $f(a,b){Yf.call(this,a,b)}\nfunction Hf(a,b){this.b=a;this.c=b}\nfunction rk(a,b){this.b=a;this.a=b}\nfunction ek(a,b){this.a=a;this.b=b}\nfunction gk(a,b){this.a=a;this.b=b}\nfunction pk(a,b){this.a=a;this.b=b}\nfunction yk(a,b){this.a=a;this.b=b}\nfunction Ak(a,b){this.a=a;this.b=b}\nfunction Fj(a,b){this.a=a;this.b=b}\nfunction _j(a,b){this.a=a;this.b=b}\nfunction dr(a,b){this.a=a;this.b=b}\nfunction zr(a,b){this.b=a;this.a=b}\nfunction So(a,b){this.b=a;this.a=b}\nfunction qp(a,b){this.b=a;this.a=b}\nfunction $q(a,b){this.b=a;this.a=b}\nfunction $r(a,b){this.f=a;this.g=b}\nfunction ne(a,b){this.e=a;this.d=b}\nfunction Wo(a,b){this.g=a;this.i=b}\nfunction bu(a,b){this.a=a;this.b=b}\nfunction qu(a,b){this.a=a;this.f=b}\nfunction qv(a,b){this.b=a;this.c=b}\nfunction ox(a,b){this.a=a;this.b=b}\nfunction Px(a,b){this.a=a;this.b=b}\nfunction mC(a,b){this.a=a;this.b=b}\nfunction Wc(a){Lb(a.dc());this.c=a}\nfunction rf(a){this.b=BD(Qb(a),83)}\nfunction Zv(a){this.a=BD(Qb(a),83)}\nfunction dv(a){this.a=BD(Qb(a),15)}\nfunction $u(a){this.a=BD(Qb(a),15)}\nfunction Br(a){this.b=BD(Qb(a),47)}\nfunction eB(){this.q=new $wnd.Date}\nfunction Zfb(){Zfb=ccb;Yfb=new jcb}\nfunction Emb(){Emb=ccb;Dmb=new Fmb}\nfunction Vhb(a){return a.f.c+a.g.c}\nfunction hnb(a,b){return a.b.Hc(b)}\nfunction inb(a,b){return a.b.Ic(b)}\nfunction knb(a,b){return a.b.Qc(b)}\nfunction Dob(a,b){return a.b.Hc(b)}\nfunction dob(a,b){return a.c.uc(b)}\nfunction Rqb(a,b){return a.a._b(b)}\nfunction fob(a,b){return pb(a.c,b)}\nfunction jt(a,b){return Mhb(a.b,b)}\nfunction Lp(a,b){return a>b&&b0}\nfunction Gbb(a,b){return ybb(a,b)<0}\nfunction Crb(a,b){return a.a.get(b)}\nfunction icb(b,a){return a.split(b)}\nfunction Vrb(a,b){return Mhb(a.e,b)}\nfunction Nvb(a){return uCb(a),false}\nfunction Rub(a){Kub.call(this,a,21)}\nfunction wcb(a,b){Zy.call(this,a,b)}\nfunction mxb(a,b){$r.call(this,a,b)}\nfunction Gyb(a,b){$r.call(this,a,b)}\nfunction zx(a){yx();Wn.call(this,a)}\nfunction zlb(a,b){Dlb(a,a.length,b)}\nfunction Alb(a,b){Flb(a,a.length,b)}\nfunction ABb(a,b,c){b.ud(a.a.Ge(c))}\nfunction uBb(a,b,c){b.we(a.a.Fe(c))}\nfunction GBb(a,b,c){b.td(a.a.Kb(c))}\nfunction Zq(a,b,c){a.Mb(c)&&b.td(c)}\nfunction aCb(a,b,c){a.splice(b,0,c)}\nfunction lDb(a,b){return uqb(a.e,b)}\nfunction pjb(a,b){this.d=a;this.e=b}\nfunction kqb(a,b){this.b=a;this.a=b}\nfunction VBb(a,b){this.b=a;this.a=b}\nfunction BEb(a,b){this.b=a;this.a=b}\nfunction sBb(a,b){this.a=a;this.b=b}\nfunction yBb(a,b){this.a=a;this.b=b}\nfunction EBb(a,b){this.a=a;this.b=b}\nfunction KBb(a,b){this.a=a;this.b=b}\nfunction aDb(a,b){this.a=a;this.b=b}\nfunction tMb(a,b){this.b=a;this.a=b}\nfunction oOb(a,b){this.b=a;this.a=b}\nfunction SOb(a,b){$r.call(this,a,b)}\nfunction SMb(a,b){$r.call(this,a,b)}\nfunction NEb(a,b){$r.call(this,a,b)}\nfunction VEb(a,b){$r.call(this,a,b)}\nfunction sFb(a,b){$r.call(this,a,b)}\nfunction hHb(a,b){$r.call(this,a,b)}\nfunction OHb(a,b){$r.call(this,a,b)}\nfunction FIb(a,b){$r.call(this,a,b)}\nfunction wLb(a,b){$r.call(this,a,b)}\nfunction YRb(a,b){$r.call(this,a,b)}\nfunction zTb(a,b){$r.call(this,a,b)}\nfunction rUb(a,b){$r.call(this,a,b)}\nfunction oWb(a,b){$r.call(this,a,b)}\nfunction SXb(a,b){$r.call(this,a,b)}\nfunction k0b(a,b){$r.call(this,a,b)}\nfunction z5b(a,b){$r.call(this,a,b)}\nfunction T8b(a,b){$r.call(this,a,b)}\nfunction ibc(a,b){$r.call(this,a,b)}\nfunction Cec(a,b){this.a=a;this.b=b}\nfunction rfc(a,b){this.a=a;this.b=b}\nfunction Rfc(a,b){this.a=a;this.b=b}\nfunction Tfc(a,b){this.a=a;this.b=b}\nfunction bgc(a,b){this.a=a;this.b=b}\nfunction ngc(a,b){this.a=a;this.b=b}\nfunction Qhc(a,b){this.a=a;this.b=b}\nfunction $hc(a,b){this.a=a;this.b=b}\nfunction Z0b(a,b){this.a=a;this.b=b}\nfunction ZVb(a,b){this.b=a;this.a=b}\nfunction Dfc(a,b){this.b=a;this.a=b}\nfunction dgc(a,b){this.b=a;this.a=b}\nfunction Bmc(a,b){this.b=a;this.a=b}\nfunction cWb(a,b){this.c=a;this.d=b}\nfunction I$b(a,b){this.e=a;this.d=b}\nfunction Unc(a,b){this.a=a;this.b=b}\nfunction Oic(a,b){this.b=b;this.c=a}\nfunction Bjc(a,b){$r.call(this,a,b)}\nfunction Yjc(a,b){$r.call(this,a,b)}\nfunction Gkc(a,b){$r.call(this,a,b)}\nfunction Bpc(a,b){$r.call(this,a,b)}\nfunction Jpc(a,b){$r.call(this,a,b)}\nfunction Tpc(a,b){$r.call(this,a,b)}\nfunction cqc(a,b){$r.call(this,a,b)}\nfunction oqc(a,b){$r.call(this,a,b)}\nfunction yqc(a,b){$r.call(this,a,b)}\nfunction Hqc(a,b){$r.call(this,a,b)}\nfunction Uqc(a,b){$r.call(this,a,b)}\nfunction arc(a,b){$r.call(this,a,b)}\nfunction mrc(a,b){$r.call(this,a,b)}\nfunction zrc(a,b){$r.call(this,a,b)}\nfunction Prc(a,b){$r.call(this,a,b)}\nfunction Yrc(a,b){$r.call(this,a,b)}\nfunction fsc(a,b){$r.call(this,a,b)}\nfunction nsc(a,b){$r.call(this,a,b)}\nfunction nzc(a,b){$r.call(this,a,b)}\nfunction zzc(a,b){$r.call(this,a,b)}\nfunction Kzc(a,b){$r.call(this,a,b)}\nfunction Xzc(a,b){$r.call(this,a,b)}\nfunction Dtc(a,b){$r.call(this,a,b)}\nfunction lAc(a,b){$r.call(this,a,b)}\nfunction uAc(a,b){$r.call(this,a,b)}\nfunction CAc(a,b){$r.call(this,a,b)}\nfunction LAc(a,b){$r.call(this,a,b)}\nfunction UAc(a,b){$r.call(this,a,b)}\nfunction aBc(a,b){$r.call(this,a,b)}\nfunction uBc(a,b){$r.call(this,a,b)}\nfunction DBc(a,b){$r.call(this,a,b)}\nfunction MBc(a,b){$r.call(this,a,b)}\nfunction sGc(a,b){$r.call(this,a,b)}\nfunction VIc(a,b){$r.call(this,a,b)}\nfunction EIc(a,b){this.b=a;this.a=b}\nfunction qKc(a,b){this.a=a;this.b=b}\nfunction GKc(a,b){this.a=a;this.b=b}\nfunction lLc(a,b){this.a=a;this.b=b}\nfunction mMc(a,b){this.a=a;this.b=b}\nfunction fMc(a,b){$r.call(this,a,b)}\nfunction ZLc(a,b){$r.call(this,a,b)}\nfunction ZMc(a,b){this.b=a;this.d=b}\nfunction IOc(a,b){$r.call(this,a,b)}\nfunction GQc(a,b){$r.call(this,a,b)}\nfunction PQc(a,b){this.a=a;this.b=b}\nfunction RQc(a,b){this.a=a;this.b=b}\nfunction ARc(a,b){$r.call(this,a,b)}\nfunction rSc(a,b){$r.call(this,a,b)}\nfunction TTc(a,b){$r.call(this,a,b)}\nfunction _Tc(a,b){$r.call(this,a,b)}\nfunction RUc(a,b){$r.call(this,a,b)}\nfunction uVc(a,b){$r.call(this,a,b)}\nfunction hWc(a,b){$r.call(this,a,b)}\nfunction rWc(a,b){$r.call(this,a,b)}\nfunction kXc(a,b){$r.call(this,a,b)}\nfunction uXc(a,b){$r.call(this,a,b)}\nfunction AYc(a,b){$r.call(this,a,b)}\nfunction l$c(a,b){$r.call(this,a,b)}\nfunction Z$c(a,b){$r.call(this,a,b)}\nfunction D_c(a,b){$r.call(this,a,b)}\nfunction O_c(a,b){$r.call(this,a,b)}\nfunction c1c(a,b){$r.call(this,a,b)}\nfunction cVb(a,b){return uqb(a.c,b)}\nfunction nnc(a,b){return uqb(b.b,a)}\nfunction x1c(a,b){return -a.b.Je(b)}\nfunction D3c(a,b){return uqb(a.g,b)}\nfunction O5c(a,b){$r.call(this,a,b)}\nfunction a6c(a,b){$r.call(this,a,b)}\nfunction m2c(a,b){this.a=a;this.b=b}\nfunction W2c(a,b){this.a=a;this.b=b}\nfunction f7c(a,b){this.a=a;this.b=b}\nfunction G7c(a,b){$r.call(this,a,b)}\nfunction j8c(a,b){$r.call(this,a,b)}\nfunction iad(a,b){$r.call(this,a,b)}\nfunction rad(a,b){$r.call(this,a,b)}\nfunction Bad(a,b){$r.call(this,a,b)}\nfunction Nad(a,b){$r.call(this,a,b)}\nfunction ibd(a,b){$r.call(this,a,b)}\nfunction tbd(a,b){$r.call(this,a,b)}\nfunction Ibd(a,b){$r.call(this,a,b)}\nfunction Ubd(a,b){$r.call(this,a,b)}\nfunction gcd(a,b){$r.call(this,a,b)}\nfunction scd(a,b){$r.call(this,a,b)}\nfunction Ycd(a,b){$r.call(this,a,b)}\nfunction udd(a,b){$r.call(this,a,b)}\nfunction Jdd(a,b){$r.call(this,a,b)}\nfunction Eed(a,b){$r.call(this,a,b)}\nfunction bfd(a,b){this.a=a;this.b=b}\nfunction dfd(a,b){this.a=a;this.b=b}\nfunction ffd(a,b){this.a=a;this.b=b}\nfunction Kfd(a,b){this.a=a;this.b=b}\nfunction Mfd(a,b){this.a=a;this.b=b}\nfunction Ofd(a,b){this.a=a;this.b=b}\nfunction vgd(a,b){this.a=a;this.b=b}\nfunction qgd(a,b){$r.call(this,a,b)}\nfunction jrd(a,b){this.a=a;this.b=b}\nfunction krd(a,b){this.a=a;this.b=b}\nfunction mrd(a,b){this.a=a;this.b=b}\nfunction nrd(a,b){this.a=a;this.b=b}\nfunction qrd(a,b){this.a=a;this.b=b}\nfunction rrd(a,b){this.a=a;this.b=b}\nfunction srd(a,b){this.b=a;this.a=b}\nfunction trd(a,b){this.b=a;this.a=b}\nfunction Drd(a,b){this.b=a;this.a=b}\nfunction Frd(a,b){this.b=a;this.a=b}\nfunction Hrd(a,b){this.a=a;this.b=b}\nfunction Jrd(a,b){this.a=a;this.b=b}\nfunction Ord(a,b){Xqd(a.a,BD(b,56))}\nfunction BIc(a,b){gIc(a.a,BD(b,11))}\nfunction fIc(a,b){FHc();return b!=a}\nfunction Arb(){wrb();return new vrb}\nfunction CMc(){wMc();this.b=new Tqb}\nfunction NNc(){FNc();this.a=new Tqb}\nfunction eCc(){ZBc();aCc.call(this)}\nfunction Dsd(a,b){$r.call(this,a,b)}\nfunction Urd(a,b){this.a=a;this.b=b}\nfunction Wrd(a,b){this.a=a;this.b=b}\nfunction kGd(a,b){this.a=a;this.b=b}\nfunction nGd(a,b){this.a=a;this.b=b}\nfunction bUd(a,b){this.a=a;this.b=b}\nfunction zVd(a,b){this.a=a;this.b=b}\nfunction C1d(a,b){this.d=a;this.b=b}\nfunction MLd(a,b){this.d=a;this.e=b}\nfunction Wud(a,b){this.f=a;this.c=b}\nfunction f7d(a,b){this.b=a;this.c=b}\nfunction _zd(a,b){this.i=a;this.g=b}\nfunction Y1d(a,b){this.e=a;this.a=b}\nfunction c8d(a,b){this.a=a;this.b=b}\nfunction $Id(a,b){a.i=null;_Id(a,b)}\nfunction ivd(a,b){!!a&&Rhb(cvd,a,b)}\nfunction hCd(a,b){return qAd(a.a,b)}\nfunction e7d(a){return R2d(a.c,a.b)}\nfunction Wd(a){return !a?null:a.dd()}\nfunction PD(a){return a==null?null:a}\nfunction KD(a){return typeof a===Khe}\nfunction LD(a){return typeof a===Lhe}\nfunction ND(a){return typeof a===Mhe}\nfunction Em(a,b){return a.Hd().Xb(b)}\nfunction Kq(a,b){return hr(a.Kc(),b)}\nfunction Bbb(a,b){return ybb(a,b)==0}\nfunction Ebb(a,b){return ybb(a,b)>=0}\nfunction Kbb(a,b){return ybb(a,b)!=0}\nfunction Jdb(a){return ''+(uCb(a),a)}\nfunction pfb(a,b){return a.substr(b)}\nfunction cg(a){ag(a);return a.d.gc()}\nfunction oVb(a){pVb(a,a.c);return a}\nfunction RD(a){CCb(a==null);return a}\nfunction Dfb(a,b){a.a+=''+b;return a}\nfunction Efb(a,b){a.a+=''+b;return a}\nfunction Nfb(a,b){a.a+=''+b;return a}\nfunction Pfb(a,b){a.a+=''+b;return a}\nfunction Qfb(a,b){a.a+=''+b;return a}\nfunction Mfb(a,b){return a.a+=''+b,a}\nfunction Esb(a,b){Gsb(a,b,a.a,a.a.a)}\nfunction Fsb(a,b){Gsb(a,b,a.c.b,a.c)}\nfunction Mqd(a,b,c){Rpd(b,kqd(a,c))}\nfunction Nqd(a,b,c){Rpd(b,kqd(a,c))}\nfunction Dhe(a,b){Hhe(new Fyd(a),b)}\nfunction cB(a,b){a.q.setTime(Sbb(b))}\nfunction fvb(a,b){bvb.call(this,a,b)}\nfunction jvb(a,b){bvb.call(this,a,b)}\nfunction nvb(a,b){bvb.call(this,a,b)}\nfunction Nqb(a){Uhb(this);Ld(this,a)}\nfunction wmb(a){tCb(a,0);return null}\nfunction X6c(a){a.a=0;a.b=0;return a}\nfunction f3c(a,b){a.a=b.g+1;return a}\nfunction PJc(a,b){return a.j[b.p]==2}\nfunction _Pb(a){return VPb(BD(a,79))}\nfunction yJb(){yJb=ccb;xJb=as(wJb())}\nfunction Y8b(){Y8b=ccb;X8b=as(W8b())}\nfunction mt(){this.b=new Mqb(Cv(12))}\nfunction Otb(){this.b=0;this.a=false}\nfunction Wtb(){this.b=0;this.a=false}\nfunction sl(a){this.a=a;ol.call(this)}\nfunction vl(a){this.a=a;ol.call(this)}\nfunction Nsd(a,b){Msd.call(this,a,b)}\nfunction $zd(a,b){Cyd.call(this,a,b)}\nfunction nNd(a,b){_zd.call(this,a,b)}\nfunction s4d(a,b){p4d.call(this,a,b)}\nfunction w4d(a,b){qRd.call(this,a,b)}\nfunction rEd(a,b){pEd();Rhb(oEd,a,b)}\nfunction lcb(a,b){return qfb(a.a,0,b)}\nfunction ww(a,b){return a.a.a.a.cc(b)}\nfunction mb(a,b){return PD(a)===PD(b)}\nfunction Mdb(a,b){return Kdb(a.a,b.a)}\nfunction $db(a,b){return beb(a.a,b.a)}\nfunction seb(a,b){return ueb(a.a,b.a)}\nfunction hfb(a,b){return a.indexOf(b)}\nfunction Ny(a,b){return a==b?0:a?1:-1}\nfunction kB(a){return a<10?'0'+a:''+a}\nfunction Mq(a){return Qb(a),new sl(a)}\nfunction SC(a){return TC(a.l,a.m,a.h)}\nfunction Hdb(a){return QD((uCb(a),a))}\nfunction Idb(a){return QD((uCb(a),a))}\nfunction NIb(a,b){return beb(a.g,b.g)}\nfunction Fbb(a){return typeof a===Lhe}\nfunction mWb(a){return a==hWb||a==kWb}\nfunction nWb(a){return a==hWb||a==iWb}\nfunction G1b(a){return Jkb(a.b.b,a,0)}\nfunction lrb(a){this.a=Arb();this.b=a}\nfunction Frb(a){this.a=Arb();this.b=a}\nfunction swb(a,b){Ekb(a.a,b);return b}\nfunction Z1c(a,b){Ekb(a.c,b);return a}\nfunction E2c(a,b){d3c(a.a,b);return a}\nfunction _gc(a,b){Hgc();return b.a+=a}\nfunction bhc(a,b){Hgc();return b.a+=a}\nfunction ahc(a,b){Hgc();return b.c+=a}\nfunction Nlb(a,b){Klb(a,0,a.length,b)}\nfunction zsb(){Wqb.call(this,new $rb)}\nfunction I_b(){B_b.call(this,0,0,0,0)}\nfunction I6c(){J6c.call(this,0,0,0,0)}\nfunction g7c(a){this.a=a.a;this.b=a.b}\nfunction fad(a){return a==aad||a==bad}\nfunction gad(a){return a==dad||a==_9c}\nfunction Jzc(a){return a==Fzc||a==Ezc}\nfunction fcd(a){return a!=bcd&&a!=ccd}\nfunction oid(a){return a.Lg()&&a.Mg()}\nfunction Gfd(a){return Kkd(BD(a,118))}\nfunction k3c(a){return d3c(new j3c,a)}\nfunction y2d(a,b){return new p4d(b,a)}\nfunction z2d(a,b){return new p4d(b,a)}\nfunction ukd(a,b,c){vkd(a,b);wkd(a,c)}\nfunction _kd(a,b,c){cld(a,b);ald(a,c)}\nfunction bld(a,b,c){dld(a,b);eld(a,c)}\nfunction gmd(a,b,c){hmd(a,b);imd(a,c)}\nfunction nmd(a,b,c){omd(a,b);pmd(a,c)}\nfunction iKd(a,b){$Jd(a,b);_Jd(a,a.D)}\nfunction _ud(a){Wud.call(this,a,true)}\nfunction Xg(a,b,c){Vg.call(this,a,b,c)}\nfunction Ygb(a){Hgb();Zgb.call(this,a)}\nfunction rxb(){mxb.call(this,'Head',1)}\nfunction wxb(){mxb.call(this,'Tail',3)}\nfunction Ckb(a){a.c=KC(SI,Uhe,1,0,5,1)}\nfunction Vjb(a){a.a=KC(SI,Uhe,1,8,5,1)}\nfunction MGb(a){Hkb(a.xf(),new QGb(a))}\nfunction xtb(a){return a!=null?tb(a):0}\nfunction b2b(a,b){return ntd(b,mpd(a))}\nfunction c2b(a,b){return ntd(b,mpd(a))}\nfunction dAb(a,b){return a[a.length]=b}\nfunction gAb(a,b){return a[a.length]=b}\nfunction Vq(a){return lr(a.b.Kc(),a.a)}\nfunction dqd(a,b){return _o(qo(a.d),b)}\nfunction eqd(a,b){return _o(qo(a.g),b)}\nfunction fqd(a,b){return _o(qo(a.j),b)}\nfunction Osd(a,b){Msd.call(this,a.b,b)}\nfunction q0b(a){B_b.call(this,a,a,a,a)}\nfunction HOb(a){a.b&&LOb(a);return a.a}\nfunction IOb(a){a.b&&LOb(a);return a.c}\nfunction uyb(a,b){if(lyb){return}a.b=b}\nfunction lzd(a,b,c){NC(a,b,c);return c}\nfunction mBc(a,b,c){NC(a.c[b.g],b.g,c)}\nfunction _Hd(a,b,c){BD(a.c,69).Xh(b,c)}\nfunction wfd(a,b,c){bld(c,c.i+a,c.j+b)}\nfunction UOd(a,b){wtd(VKd(a.a),XOd(b))}\nfunction bTd(a,b){wtd(QSd(a.a),eTd(b))}\nfunction Lge(a){wfe();xfe.call(this,a)}\nfunction CAd(a){return a==null?0:tb(a)}\nfunction fNc(){fNc=ccb;eNc=new Rpb(v1)}\nfunction h0d(){h0d=ccb;new i0d;new Rkb}\nfunction i0d(){new Lqb;new Lqb;new Lqb}\nfunction GA(){GA=ccb;fA();FA=new Lqb}\nfunction Iy(){Iy=ccb;$wnd.Math.log(2)}\nfunction UVd(){UVd=ccb;TVd=(AFd(),zFd)}\nfunction _ge(){throw vbb(new cgb(Cxe))}\nfunction ohe(){throw vbb(new cgb(Cxe))}\nfunction che(){throw vbb(new cgb(Dxe))}\nfunction rhe(){throw vbb(new cgb(Dxe))}\nfunction Mg(a){this.a=a;Gg.call(this,a)}\nfunction up(a){this.a=a;rf.call(this,a)}\nfunction Bp(a){this.a=a;rf.call(this,a)}\nfunction Okb(a,b){Mlb(a.c,a.c.length,b)}\nfunction llb(a){return a.ab?1:0}\nfunction Deb(a,b){return ybb(a,b)>0?a:b}\nfunction TC(a,b,c){return {l:a,m:b,h:c}}\nfunction Ctb(a,b){a.a!=null&&BIc(b,a.a)}\nfunction Csb(a){a.a=new jtb;a.c=new jtb}\nfunction hDb(a){this.b=a;this.a=new Rkb}\nfunction dOb(a){this.b=new pOb;this.a=a}\nfunction q_b(a){n_b.call(this);this.a=a}\nfunction txb(){mxb.call(this,'Range',2)}\nfunction bUb(){ZTb();this.a=new L2c(zP)}\nfunction Bh(a,b){Qb(b);Ah(a).Jc(new Vw)}\nfunction fKc(a,b){FJc();return b.n.b+=a}\nfunction Tgc(a,b,c){return Rhb(a.g,c,b)}\nfunction LJc(a,b,c){return Rhb(a.k,c,b)}\nfunction r1c(a,b){return Rhb(a.a,b.a,b)}\nfunction jBc(a,b,c){return hBc(b,c,a.c)}\nfunction E6c(a){return new f7c(a.c,a.d)}\nfunction F6c(a){return new f7c(a.c,a.d)}\nfunction R6c(a){return new f7c(a.a,a.b)}\nfunction CQd(a,b){return hA(a.a,b,null)}\nfunction fec(a){QZb(a,null);RZb(a,null)}\nfunction AOc(a){BOc(a,null);COc(a,null)}\nfunction u4d(){qRd.call(this,null,null)}\nfunction y4d(){RRd.call(this,null,null)}\nfunction a7d(a){this.a=a;Lqb.call(this)}\nfunction Pp(a){this.b=(mmb(),new iob(a))}\nfunction Py(a){a.j=KC(VI,nie,310,0,0,1)}\nfunction oAd(a,b,c){a.c.Vc(b,BD(c,133))}\nfunction GAd(a,b,c){a.c.ji(b,BD(c,133))}\nfunction JLd(a,b){Uxd(a);a.Gc(BD(b,15))}\nfunction b7d(a,b){return t2d(a.c,a.b,b)}\nfunction Bv(a,b){return new Qv(a.Kc(),b)}\nfunction Lq(a,b){return rr(a.Kc(),b)!=-1}\nfunction Sqb(a,b){return a.a.Bc(b)!=null}\nfunction pr(a){return a.Ob()?a.Pb():null}\nfunction yfb(a){return zfb(a,0,a.length)}\nfunction JD(a,b){return a!=null&&AD(a,b)}\nfunction $A(a,b){a.q.setHours(b);YA(a,b)}\nfunction Yrb(a,b){if(a.c){jsb(b);isb(b)}}\nfunction nk(a,b,c){BD(a.Kb(c),164).Nb(b)}\nfunction RJc(a,b,c){SJc(a,b,c);return c}\nfunction Eub(a,b,c){a.a=b^1502;a.b=c^kke}\nfunction xHb(a,b,c){return a.a[b.g][c.g]}\nfunction REc(a,b){return a.a[b.c.p][b.p]}\nfunction aEc(a,b){return a.e[b.c.p][b.p]}\nfunction tEc(a,b){return a.c[b.c.p][b.p]}\nfunction OJc(a,b){return a.j[b.p]=aKc(b)}\nfunction k5c(a,b){return cfb(a.f,b.tg())}\nfunction Isd(a,b){return cfb(a.b,b.tg())}\nfunction Sfd(a,b){return a.a0?b*b/a:b*b*100}\nfunction CRb(a,b){return a>0?b/(a*a):b*100}\nfunction G2c(a,b,c){return Ekb(b,I2c(a,c))}\nfunction t3c(a,b,c){p3c();a.Xe(b)&&c.td(a)}\nfunction St(a,b,c){var d;d=a.Zc(b);d.Rb(c)}\nfunction O6c(a,b,c){a.a+=b;a.b+=c;return a}\nfunction Z6c(a,b,c){a.a*=b;a.b*=c;return a}\nfunction b7c(a,b,c){a.a-=b;a.b-=c;return a}\nfunction a7c(a,b){a.a=b.a;a.b=b.b;return a}\nfunction V6c(a){a.a=-a.a;a.b=-a.b;return a}\nfunction Dic(a){this.c=a;this.a=1;this.b=1}\nfunction xed(a){this.c=a;dld(a,0);eld(a,0)}\nfunction u7c(a){Psb.call(this);n7c(this,a)}\nfunction AXb(a){xXb();yXb(this);this.mf(a)}\nfunction GRd(a,b){nRd();qRd.call(this,a,b)}\nfunction dSd(a,b){LRd();RRd.call(this,a,b)}\nfunction hSd(a,b){LRd();RRd.call(this,a,b)}\nfunction fSd(a,b){LRd();dSd.call(this,a,b)}\nfunction sId(a,b,c){dId.call(this,a,b,c,2)}\nfunction zXd(a,b){UVd();nXd.call(this,a,b)}\nfunction BXd(a,b){UVd();zXd.call(this,a,b)}\nfunction DXd(a,b){UVd();zXd.call(this,a,b)}\nfunction FXd(a,b){UVd();DXd.call(this,a,b)}\nfunction PXd(a,b){UVd();nXd.call(this,a,b)}\nfunction RXd(a,b){UVd();PXd.call(this,a,b)}\nfunction XXd(a,b){UVd();nXd.call(this,a,b)}\nfunction pAd(a,b){return a.c.Fc(BD(b,133))}\nfunction w1d(a,b,c){return V1d(p1d(a,b),c)}\nfunction N2d(a,b,c){return b.Qk(a.e,a.c,c)}\nfunction P2d(a,b,c){return b.Rk(a.e,a.c,c)}\nfunction a3d(a,b){return xid(a.e,BD(b,49))}\nfunction aTd(a,b,c){vtd(QSd(a.a),b,eTd(c))}\nfunction TOd(a,b,c){vtd(VKd(a.a),b,XOd(c))}\nfunction ypb(a,b){b.$modCount=a.$modCount}\nfunction MUc(){MUc=ccb;LUc=new Lsd('root')}\nfunction LCd(){LCd=ccb;KCd=new lDd;new NDd}\nfunction KVc(){this.a=new Hp;this.b=new Hp}\nfunction FUd(){hJd.call(this);this.Bb|=Tje}\nfunction t_c(){$r.call(this,'GROW_TREE',0)}\nfunction C9d(a){return a==null?null:cde(a)}\nfunction G9d(a){return a==null?null:jde(a)}\nfunction J9d(a){return a==null?null:fcb(a)}\nfunction K9d(a){return a==null?null:fcb(a)}\nfunction fdb(a){if(a.o!=null){return}vdb(a)}\nfunction DD(a){CCb(a==null||KD(a));return a}\nfunction ED(a){CCb(a==null||LD(a));return a}\nfunction GD(a){CCb(a==null||ND(a));return a}\nfunction gB(a){this.q=new $wnd.Date(Sbb(a))}\nfunction Mf(a,b){this.c=a;ne.call(this,a,b)}\nfunction Sf(a,b){this.a=a;Mf.call(this,a,b)}\nfunction Hg(a,b){this.d=a;Dg(this);this.b=b}\nfunction bAb(a,b){Vzb.call(this,a);this.a=b}\nfunction vAb(a,b){Vzb.call(this,a);this.a=b}\nfunction sNb(a){pNb.call(this,0,0);this.f=a}\nfunction Vg(a,b,c){dg.call(this,a,b,c,null)}\nfunction Yg(a,b,c){dg.call(this,a,b,c,null)}\nfunction Pxb(a,b,c){return a.ue(b,c)<=0?c:b}\nfunction Qxb(a,b,c){return a.ue(b,c)<=0?b:c}\nfunction g4c(a,b){return BD(Wrb(a.b,b),149)}\nfunction i4c(a,b){return BD(Wrb(a.c,b),229)}\nfunction wic(a){return BD(Ikb(a.a,a.b),287)}\nfunction B6c(a){return new f7c(a.c,a.d+a.a)}\nfunction eLc(a){return FJc(),Jzc(BD(a,197))}\nfunction $Jb(){$Jb=ccb;ZJb=pqb((tdd(),sdd))}\nfunction fOb(a,b){b.a?gOb(a,b):Fxb(a.a,b.b)}\nfunction qyb(a,b){if(lyb){return}Ekb(a.a,b)}\nfunction F2b(a,b){x2b();return f_b(b.d.i,a)}\nfunction _9b(a,b){I9b();return new gac(b,a)}\nfunction _Hb(a,b){ytb(b,lle);a.f=b;return a}\nfunction Kld(a,b,c){c=_hd(a,b,3,c);return c}\nfunction bmd(a,b,c){c=_hd(a,b,6,c);return c}\nfunction kpd(a,b,c){c=_hd(a,b,9,c);return c}\nfunction Cvd(a,b,c){++a.j;a.Ki();Atd(a,b,c)}\nfunction Avd(a,b,c){++a.j;a.Hi(b,a.oi(b,c))}\nfunction bRd(a,b,c){var d;d=a.Zc(b);d.Rb(c)}\nfunction c7d(a,b,c){return C2d(a.c,a.b,b,c)}\nfunction DAd(a,b){return (b&Ohe)%a.d.length}\nfunction Msd(a,b){Lsd.call(this,a);this.a=b}\nfunction uVd(a,b){lVd.call(this,a);this.a=b}\nfunction sYd(a,b){lVd.call(this,a);this.a=b}\nfunction zyd(a,b){this.c=a;zud.call(this,b)}\nfunction YOd(a,b){this.a=a;qOd.call(this,b)}\nfunction fTd(a,b){this.a=a;qOd.call(this,b)}\nfunction Xp(a){this.a=(Xj(a,Jie),new Skb(a))}\nfunction cq(a){this.a=(Xj(a,Jie),new Skb(a))}\nfunction LA(a){!a.a&&(a.a=new VA);return a.a}\nfunction XMb(a){if(a>8){return 0}return a+1}\nfunction Ecb(a,b){Bcb();return a==b?0:a?1:-1}\nfunction Opb(a,b,c){return Npb(a,BD(b,22),c)}\nfunction Bz(a,b,c){return a.apply(b,c);var d}\nfunction Sfb(a,b,c){a.a+=zfb(b,0,c);return a}\nfunction ijb(a,b){var c;c=a.e;a.e=b;return c}\nfunction trb(a,b){var c;c=a[hke];c.call(a,b)}\nfunction urb(a,b){var c;c=a[hke];c.call(a,b)}\nfunction Aib(a,b){a.a.Vc(a.b,b);++a.b;a.c=-1}\nfunction Urb(a){Uhb(a.e);a.d.b=a.d;a.d.a=a.d}\nfunction _f(a){a.b?_f(a.b):a.f.c.zc(a.e,a.d)}\nfunction _Ab(a,b,c){EAb();MBb(a,b.Ce(a.a,c))}\nfunction Bxb(a,b){return Vd(Cwb(a.a,b,true))}\nfunction Cxb(a,b){return Vd(Dwb(a.a,b,true))}\nfunction _Bb(a,b){return eCb(new Array(b),a)}\nfunction HD(a){return String.fromCharCode(a)}\nfunction mz(a){return a==null?null:a.message}\nfunction gRb(){this.a=new Rkb;this.b=new Rkb}\nfunction iTb(){this.a=new MQb;this.b=new tTb}\nfunction tDb(){this.b=new d7c;this.c=new Rkb}\nfunction _Qb(){this.d=new d7c;this.e=new d7c}\nfunction n_b(){this.n=new d7c;this.o=new d7c}\nfunction $Gb(){this.n=new p0b;this.i=new I6c}\nfunction sec(){this.a=new Umc;this.b=new mnc}\nfunction NIc(){this.a=new Rkb;this.d=new Rkb}\nfunction LDc(){this.b=new Tqb;this.a=new Tqb}\nfunction hSc(){this.b=new Lqb;this.a=new Lqb}\nfunction HRc(){this.b=new tRc;this.a=new hRc}\nfunction aHb(){$Gb.call(this);this.a=new d7c}\nfunction Ywb(a){Zwb.call(this,a,(lxb(),hxb))}\nfunction J_b(a,b,c,d){B_b.call(this,a,b,c,d)}\nfunction sqd(a,b,c){c!=null&&kmd(b,Wqd(a,c))}\nfunction tqd(a,b,c){c!=null&&lmd(b,Wqd(a,c))}\nfunction Tod(a,b,c){c=_hd(a,b,11,c);return c}\nfunction P6c(a,b){a.a+=b.a;a.b+=b.b;return a}\nfunction c7c(a,b){a.a-=b.a;a.b-=b.b;return a}\nfunction u7b(a,b){return a.n.a=(uCb(b),b)+10}\nfunction v7b(a,b){return a.n.a=(uCb(b),b)+10}\nfunction dLd(a,b){return b==a||pud(UKd(b),a)}\nfunction PYd(a,b){return Rhb(a.a,b,'')==null}\nfunction E2b(a,b){x2b();return !f_b(b.d.i,a)}\nfunction rjc(a,b){fad(a.f)?sjc(a,b):tjc(a,b)}\nfunction h1d(a,b){var c;c=b.Hh(a.a);return c}\nfunction Cyd(a,b){qcb.call(this,gve+a+mue+b)}\nfunction gUd(a,b,c,d){cUd.call(this,a,b,c,d)}\nfunction Q4d(a,b,c,d){cUd.call(this,a,b,c,d)}\nfunction U4d(a,b,c,d){Q4d.call(this,a,b,c,d)}\nfunction n5d(a,b,c,d){i5d.call(this,a,b,c,d)}\nfunction p5d(a,b,c,d){i5d.call(this,a,b,c,d)}\nfunction v5d(a,b,c,d){i5d.call(this,a,b,c,d)}\nfunction t5d(a,b,c,d){p5d.call(this,a,b,c,d)}\nfunction A5d(a,b,c,d){p5d.call(this,a,b,c,d)}\nfunction y5d(a,b,c,d){v5d.call(this,a,b,c,d)}\nfunction D5d(a,b,c,d){A5d.call(this,a,b,c,d)}\nfunction d6d(a,b,c,d){Y5d.call(this,a,b,c,d)}\nfunction Vp(a,b,c){this.a=a;qc.call(this,b,c)}\nfunction tk(a,b,c){this.c=b;this.b=c;this.a=a}\nfunction ik(a,b,c){return a.d=BD(b.Kb(c),164)}\nfunction j6d(a,b){return a.Aj().Nh().Kh(a,b)}\nfunction h6d(a,b){return a.Aj().Nh().Ih(a,b)}\nfunction Fdb(a,b){return uCb(a),PD(a)===PD(b)}\nfunction dfb(a,b){return uCb(a),PD(a)===PD(b)}\nfunction Dxb(a,b){return Vd(Cwb(a.a,b,false))}\nfunction Exb(a,b){return Vd(Dwb(a.a,b,false))}\nfunction vBb(a,b){return a.b.sd(new yBb(a,b))}\nfunction BBb(a,b){return a.b.sd(new EBb(a,b))}\nfunction HBb(a,b){return a.b.sd(new KBb(a,b))}\nfunction lfb(a,b,c){return a.lastIndexOf(b,c)}\nfunction uTb(a,b,c){return Kdb(a[b.b],a[c.b])}\nfunction RTb(a,b){return yNb(b,(Nyc(),Cwc),a)}\nfunction fmc(a,b){return beb(b.a.d.p,a.a.d.p)}\nfunction emc(a,b){return beb(a.a.d.p,b.a.d.p)}\nfunction _Oc(a,b){return Kdb(a.c-a.s,b.c-b.s)}\nfunction S_b(a){return !a.c?-1:Jkb(a.c.a,a,0)}\nfunction Vxd(a){return a<100?null:new Ixd(a)}\nfunction ecd(a){return a==Zbd||a==_bd||a==$bd}\nfunction zAd(a,b){return JD(b,15)&&Btd(a.c,b)}\nfunction vyb(a,b){if(lyb){return}!!b&&(a.d=b)}\nfunction ujb(a,b){var c;c=b;return !!Awb(a,c)}\nfunction czd(a,b){this.c=a;Pyd.call(this,a,b)}\nfunction fBb(a){this.c=a;nvb.call(this,rie,0)}\nfunction Avb(a,b){Bvb.call(this,a,a.length,b)}\nfunction aId(a,b,c){return BD(a.c,69).lk(b,c)}\nfunction bId(a,b,c){return BD(a.c,69).mk(b,c)}\nfunction O2d(a,b,c){return N2d(a,BD(b,332),c)}\nfunction Q2d(a,b,c){return P2d(a,BD(b,332),c)}\nfunction i3d(a,b,c){return h3d(a,BD(b,332),c)}\nfunction k3d(a,b,c){return j3d(a,BD(b,332),c)}\nfunction tn(a,b){return b==null?null:Hv(a.b,b)}\nfunction Kcb(a){return LD(a)?(uCb(a),a):a.ke()}\nfunction Ldb(a){return !isNaN(a)&&!isFinite(a)}\nfunction Wn(a){Ql();this.a=(mmb(),new zob(a))}\nfunction dIc(a){FHc();this.d=a;this.a=new jkb}\nfunction xqb(a,b,c){this.a=a;this.b=b;this.c=c}\nfunction Nrb(a,b,c){this.a=a;this.b=b;this.c=c}\nfunction $sb(a,b,c){this.d=a;this.b=c;this.a=b}\nfunction Qsb(a){Csb(this);Osb(this);ye(this,a)}\nfunction Tkb(a){Ckb(this);bCb(this.c,0,a.Pc())}\nfunction Xwb(a){uib(a.a);Kwb(a.c,a.b);a.b=null}\nfunction iyb(a){this.a=a;Zfb();Cbb(Date.now())}\nfunction JCb(){JCb=ccb;GCb=new nb;ICb=new nb}\nfunction ntb(){ntb=ccb;ltb=new otb;mtb=new qtb}\nfunction kzd(){kzd=ccb;jzd=KC(SI,Uhe,1,0,5,1)}\nfunction tGd(){tGd=ccb;sGd=KC(SI,Uhe,1,0,5,1)}\nfunction $Gd(){$Gd=ccb;ZGd=KC(SI,Uhe,1,0,5,1)}\nfunction Ql(){Ql=ccb;new Zl((mmb(),mmb(),jmb))}\nfunction pxb(a){lxb();return es((zxb(),yxb),a)}\nfunction Hyb(a){Fyb();return es((Kyb(),Jyb),a)}\nfunction OEb(a){MEb();return es((REb(),QEb),a)}\nfunction WEb(a){UEb();return es((ZEb(),YEb),a)}\nfunction tFb(a){rFb();return es((wFb(),vFb),a)}\nfunction iHb(a){gHb();return es((lHb(),kHb),a)}\nfunction PHb(a){NHb();return es((SHb(),RHb),a)}\nfunction GIb(a){EIb();return es((JIb(),IIb),a)}\nfunction vJb(a){qJb();return es((yJb(),xJb),a)}\nfunction xLb(a){vLb();return es((ALb(),zLb),a)}\nfunction TMb(a){RMb();return es((WMb(),VMb),a)}\nfunction TOb(a){ROb();return es((WOb(),VOb),a)}\nfunction ePb(a){cPb();return es((hPb(),gPb),a)}\nfunction ZRb(a){XRb();return es((aSb(),_Rb),a)}\nfunction ATb(a){yTb();return es((DTb(),CTb),a)}\nfunction sUb(a){qUb();return es((vUb(),uUb),a)}\nfunction rWb(a){lWb();return es((uWb(),tWb),a)}\nfunction TXb(a){RXb();return es((WXb(),VXb),a)}\nfunction Mb(a,b){if(!a){throw vbb(new Wdb(b))}}\nfunction l0b(a){j0b();return es((o0b(),n0b),a)}\nfunction r0b(a){B_b.call(this,a.d,a.c,a.a,a.b)}\nfunction K_b(a){B_b.call(this,a.d,a.c,a.a,a.b)}\nfunction mKb(a,b,c){this.b=a;this.c=b;this.a=c}\nfunction BZb(a,b,c){this.b=a;this.a=b;this.c=c}\nfunction TNb(a,b,c){this.a=a;this.b=b;this.c=c}\nfunction uOb(a,b,c){this.a=a;this.b=b;this.c=c}\nfunction S3b(a,b,c){this.a=a;this.b=b;this.c=c}\nfunction Z6b(a,b,c){this.a=a;this.b=b;this.c=c}\nfunction n9b(a,b,c){this.b=a;this.a=b;this.c=c}\nfunction x$b(a,b,c){this.e=b;this.b=a;this.d=c}\nfunction $Ab(a,b,c){EAb();a.a.Od(b,c);return b}\nfunction LGb(a){var b;b=new KGb;b.e=a;return b}\nfunction iLb(a){var b;b=new fLb;b.b=a;return b}\nfunction D6b(){D6b=ccb;B6b=new M6b;C6b=new P6b}\nfunction Hgc(){Hgc=ccb;Fgc=new ghc;Ggc=new ihc}\nfunction jbc(a){gbc();return es((mbc(),lbc),a)}\nfunction Cjc(a){Ajc();return es((Fjc(),Ejc),a)}\nfunction Clc(a){Alc();return es((Flc(),Elc),a)}\nfunction Cpc(a){Apc();return es((Fpc(),Epc),a)}\nfunction Kpc(a){Ipc();return es((Npc(),Mpc),a)}\nfunction Wpc(a){Rpc();return es((Zpc(),Ypc),a)}\nfunction $jc(a){Xjc();return es((bkc(),akc),a)}\nfunction Hkc(a){Fkc();return es((Kkc(),Jkc),a)}\nfunction dqc(a){bqc();return es((gqc(),fqc),a)}\nfunction rqc(a){mqc();return es((uqc(),tqc),a)}\nfunction zqc(a){xqc();return es((Cqc(),Bqc),a)}\nfunction Iqc(a){Gqc();return es((Lqc(),Kqc),a)}\nfunction Vqc(a){Sqc();return es((Yqc(),Xqc),a)}\nfunction brc(a){_qc();return es((erc(),drc),a)}\nfunction nrc(a){lrc();return es((qrc(),prc),a)}\nfunction Arc(a){yrc();return es((Drc(),Crc),a)}\nfunction Qrc(a){Orc();return es((Trc(),Src),a)}\nfunction Zrc(a){Xrc();return es((asc(),_rc),a)}\nfunction gsc(a){esc();return es((jsc(),isc),a)}\nfunction osc(a){msc();return es((rsc(),qsc),a)}\nfunction Etc(a){Ctc();return es((Htc(),Gtc),a)}\nfunction qzc(a){lzc();return es((tzc(),szc),a)}\nfunction Azc(a){xzc();return es((Dzc(),Czc),a)}\nfunction Mzc(a){Izc();return es((Pzc(),Ozc),a)}\nfunction MAc(a){KAc();return es((PAc(),OAc),a)}\nfunction mAc(a){kAc();return es((pAc(),oAc),a)}\nfunction vAc(a){tAc();return es((yAc(),xAc),a)}\nfunction DAc(a){BAc();return es((GAc(),FAc),a)}\nfunction VAc(a){TAc();return es((YAc(),XAc),a)}\nfunction $zc(a){Vzc();return es((bAc(),aAc),a)}\nfunction bBc(a){_Ac();return es((eBc(),dBc),a)}\nfunction vBc(a){tBc();return es((yBc(),xBc),a)}\nfunction EBc(a){CBc();return es((HBc(),GBc),a)}\nfunction NBc(a){LBc();return es((QBc(),PBc),a)}\nfunction tGc(a){rGc();return es((wGc(),vGc),a)}\nfunction WIc(a){UIc();return es((ZIc(),YIc),a)}\nfunction $Lc(a){YLc();return es((bMc(),aMc),a)}\nfunction gMc(a){eMc();return es((jMc(),iMc),a)}\nfunction JOc(a){HOc();return es((MOc(),LOc),a)}\nfunction HQc(a){FQc();return es((KQc(),JQc),a)}\nfunction DRc(a){yRc();return es((GRc(),FRc),a)}\nfunction tSc(a){qSc();return es((wSc(),vSc),a)}\nfunction UTc(a){STc();return es((XTc(),WTc),a)}\nfunction UUc(a){PUc();return es((XUc(),WUc),a)}\nfunction aUc(a){$Tc();return es((dUc(),cUc),a)}\nfunction wVc(a){tVc();return es((zVc(),yVc),a)}\nfunction iWc(a){fWc();return es((lWc(),kWc),a)}\nfunction sWc(a){pWc();return es((vWc(),uWc),a)}\nfunction lXc(a){iXc();return es((oXc(),nXc),a)}\nfunction vXc(a){sXc();return es((yXc(),xXc),a)}\nfunction BYc(a){zYc();return es((EYc(),DYc),a)}\nfunction m$c(a){k$c();return es((p$c(),o$c),a)}\nfunction $$c(a){Y$c();return es((b_c(),a_c),a)}\nfunction n_c(a){i_c();return es((q_c(),p_c),a)}\nfunction w_c(a){s_c();return es((z_c(),y_c),a)}\nfunction E_c(a){C_c();return es((H_c(),G_c),a)}\nfunction P_c(a){N_c();return es((S_c(),R_c),a)}\nfunction W0c(a){R0c();return es((Z0c(),Y0c),a)}\nfunction f1c(a){a1c();return es((i1c(),h1c),a)}\nfunction P5c(a){N5c();return es((S5c(),R5c),a)}\nfunction b6c(a){_5c();return es((e6c(),d6c),a)}\nfunction H7c(a){F7c();return es((K7c(),J7c),a)}\nfunction k8c(a){i8c();return es((n8c(),m8c),a)}\nfunction V8b(a){S8b();return es((Y8b(),X8b),a)}\nfunction A5b(a){y5b();return es((D5b(),C5b),a)}\nfunction jad(a){ead();return es((mad(),lad),a)}\nfunction sad(a){qad();return es((vad(),uad),a)}\nfunction Cad(a){Aad();return es((Fad(),Ead),a)}\nfunction Oad(a){Mad();return es((Rad(),Qad),a)}\nfunction jbd(a){hbd();return es((mbd(),lbd),a)}\nfunction ubd(a){rbd();return es((xbd(),wbd),a)}\nfunction Kbd(a){Hbd();return es((Nbd(),Mbd),a)}\nfunction Vbd(a){Tbd();return es((Ybd(),Xbd),a)}\nfunction hcd(a){dcd();return es((kcd(),jcd),a)}\nfunction vcd(a){rcd();return es((ycd(),xcd),a)}\nfunction vdd(a){tdd();return es((ydd(),xdd),a)}\nfunction Kdd(a){Idd();return es((Ndd(),Mdd),a)}\nfunction $cd(a){Ucd();return es((cdd(),bdd),a)}\nfunction Fed(a){Ded();return es((Ied(),Hed),a)}\nfunction rgd(a){pgd();return es((ugd(),tgd),a)}\nfunction Esd(a){Csd();return es((Hsd(),Gsd),a)}\nfunction Yoc(a,b){return (uCb(a),a)+(uCb(b),b)}\nfunction NNd(a,b){Zfb();return wtd(ZKd(a.a),b)}\nfunction SNd(a,b){Zfb();return wtd(ZKd(a.a),b)}\nfunction bPc(a,b){this.c=a;this.a=b;this.b=b-a}\nfunction nYc(a,b,c){this.a=a;this.b=b;this.c=c}\nfunction L1c(a,b,c){this.a=a;this.b=b;this.c=c}\nfunction T1c(a,b,c){this.a=a;this.b=b;this.c=c}\nfunction Rrd(a,b,c){this.a=a;this.b=b;this.c=c}\nfunction zCd(a,b,c){this.a=a;this.b=b;this.c=c}\nfunction IVd(a,b,c){this.e=a;this.a=b;this.c=c}\nfunction kWd(a,b,c){UVd();cWd.call(this,a,b,c)}\nfunction HXd(a,b,c){UVd();oXd.call(this,a,b,c)}\nfunction TXd(a,b,c){UVd();oXd.call(this,a,b,c)}\nfunction ZXd(a,b,c){UVd();oXd.call(this,a,b,c)}\nfunction JXd(a,b,c){UVd();HXd.call(this,a,b,c)}\nfunction LXd(a,b,c){UVd();HXd.call(this,a,b,c)}\nfunction NXd(a,b,c){UVd();LXd.call(this,a,b,c)}\nfunction VXd(a,b,c){UVd();TXd.call(this,a,b,c)}\nfunction _Xd(a,b,c){UVd();ZXd.call(this,a,b,c)}\nfunction $j(a,b){Qb(a);Qb(b);return new _j(a,b)}\nfunction Nq(a,b){Qb(a);Qb(b);return new Wq(a,b)}\nfunction Rq(a,b){Qb(a);Qb(b);return new ar(a,b)}\nfunction lr(a,b){Qb(a);Qb(b);return new zr(a,b)}\nfunction BD(a,b){CCb(a==null||AD(a,b));return a}\nfunction Nu(a){var b;b=new Rkb;fr(b,a);return b}\nfunction Ex(a){var b;b=new Tqb;fr(b,a);return b}\nfunction Hx(a){var b;b=new Gxb;Jq(b,a);return b}\nfunction Ru(a){var b;b=new Psb;Jq(b,a);return b}\nfunction YEc(a){!a.e&&(a.e=new Rkb);return a.e}\nfunction SMd(a){!a.c&&(a.c=new xYd);return a.c}\nfunction Ekb(a,b){a.c[a.c.length]=b;return true}\nfunction WA(a,b){this.c=a;this.b=b;this.a=false}\nfunction Gg(a){this.d=a;Dg(this);this.b=ed(a.d)}\nfunction pzb(){this.a=';,;';this.b='';this.c=''}\nfunction Bvb(a,b,c){qvb.call(this,b,c);this.a=a}\nfunction fAb(a,b,c){this.b=a;fvb.call(this,b,c)}\nfunction lsb(a,b,c){this.c=a;pjb.call(this,b,c)}\nfunction bCb(a,b,c){$Bb(c,0,a,b,c.length,false)}\nfunction HVb(a,b,c,d,e){a.b=b;a.c=c;a.d=d;a.a=e}\nfunction eBb(a,b){if(b){a.b=b;a.a=(Tzb(b),b.a)}}\nfunction v_b(a,b,c,d,e){a.d=b;a.c=c;a.a=d;a.b=e}\nfunction h5b(a){var b,c;b=a.b;c=a.c;a.b=c;a.c=b}\nfunction k5b(a){var b,c;c=a.d;b=a.a;a.d=b;a.a=c}\nfunction Lbb(a){return zbb(iD(Fbb(a)?Rbb(a):a))}\nfunction rlc(a,b){return beb(D0b(a.d),D0b(b.d))}\nfunction uic(a,b){return b==(Ucd(),Tcd)?a.c:a.d}\nfunction FHc(){FHc=ccb;DHc=(Ucd(),Tcd);EHc=zcd}\nfunction DRb(){this.b=Edb(ED(Ksd((wSb(),vSb))))}\nfunction aBb(a){return EAb(),KC(SI,Uhe,1,a,5,1)}\nfunction C6c(a){return new f7c(a.c+a.b,a.d+a.a)}\nfunction Vmc(a,b){Imc();return beb(a.d.p,b.d.p)}\nfunction Lsb(a){sCb(a.b!=0);return Nsb(a,a.a.a)}\nfunction Msb(a){sCb(a.b!=0);return Nsb(a,a.c.b)}\nfunction rCb(a,b){if(!a){throw vbb(new ucb(b))}}\nfunction mCb(a,b){if(!a){throw vbb(new Wdb(b))}}\nfunction dWb(a,b,c){cWb.call(this,a,b);this.b=c}\nfunction pMd(a,b,c){MLd.call(this,a,b);this.c=c}\nfunction Dnc(a,b,c){Cnc.call(this,b,c);this.d=a}\nfunction _Gd(a){$Gd();MGd.call(this);this.th(a)}\nfunction PNd(a,b,c){this.a=a;nNd.call(this,b,c)}\nfunction UNd(a,b,c){this.a=a;nNd.call(this,b,c)}\nfunction k2d(a,b,c){MLd.call(this,a,b);this.c=c}\nfunction y1d(){T0d();z1d.call(this,(yFd(),xFd))}\nfunction gFd(a){return a!=null&&!OEd(a,CEd,DEd)}\nfunction dFd(a,b){return (jFd(a)<<4|jFd(b))&aje}\nfunction ln(a,b){return Vm(),Wj(a,b),new iy(a,b)}\nfunction Sdd(a,b){var c;if(a.n){c=b;Ekb(a.f,c)}}\nfunction Upd(a,b,c){var d;d=new yC(c);cC(a,b,d)}\nfunction WUd(a,b){var c;c=a.c;VUd(a,b);return c}\nfunction Ydd(a,b){b<0?(a.g=-1):(a.g=b);return a}\nfunction $6c(a,b){W6c(a);a.a*=b;a.b*=b;return a}\nfunction G6c(a,b,c,d,e){a.c=b;a.d=c;a.b=d;a.a=e}\nfunction Dsb(a,b){Gsb(a,b,a.c.b,a.c);return true}\nfunction jsb(a){a.a.b=a.b;a.b.a=a.a;a.a=a.b=null}\nfunction Aq(a){this.b=a;this.a=Wm(this.b.a).Ed()}\nfunction Wq(a,b){this.b=a;this.a=b;ol.call(this)}\nfunction ar(a,b){this.a=a;this.b=b;ol.call(this)}\nfunction vvb(a,b){qvb.call(this,b,1040);this.a=a}\nfunction Eeb(a){return a==0||isNaN(a)?a:a<0?-1:1}\nfunction WPb(a){QPb();return jtd(a)==Xod(ltd(a))}\nfunction XPb(a){QPb();return ltd(a)==Xod(jtd(a))}\nfunction iYb(a,b){return hYb(a,new cWb(b.a,b.b))}\nfunction NZb(a){return !OZb(a)&&a.c.i.c==a.d.i.c}\nfunction _Gb(a){var b;b=a.n;return a.a.b+b.d+b.a}\nfunction YHb(a){var b;b=a.n;return a.e.b+b.d+b.a}\nfunction ZHb(a){var b;b=a.n;return a.e.a+b.b+b.c}\nfunction zfe(a){wfe();++vfe;return new ige(0,a)}\nfunction o_b(a){if(a.a){return a.a}return JZb(a)}\nfunction CCb(a){if(!a){throw vbb(new Cdb(null))}}\nfunction X6d(){X6d=ccb;W6d=(mmb(),new anb(Fwe))}\nfunction ex(){ex=ccb;new gx((_k(),$k),(Lk(),Kk))}\nfunction oeb(){oeb=ccb;neb=KC(JI,nie,19,256,0,1)}\nfunction d$c(a,b,c,d){e$c.call(this,a,b,c,d,0,0)}\nfunction sQc(a,b,c){return Rhb(a.b,BD(c.b,17),b)}\nfunction tQc(a,b,c){return Rhb(a.b,BD(c.b,17),b)}\nfunction xfd(a,b){return Ekb(a,new f7c(b.a,b.b))}\nfunction Bic(a,b){return a.c=b){throw vbb(new rcb)}}\nfunction Pyb(a,b,c){NC(b,0,Bzb(b[0],c[0]));return b}\nfunction _yc(a,b,c){b.Ye(c,Edb(ED(Ohb(a.b,c)))*a.a)}\nfunction n6c(a,b,c){i6c();return m6c(a,b)&&m6c(a,c)}\nfunction tcd(a){rcd();return !a.Hc(ncd)&&!a.Hc(pcd)}\nfunction D6c(a){return new f7c(a.c+a.b/2,a.d+a.a/2)}\nfunction oOd(a,b){return b.kh()?xid(a.b,BD(b,49)):b}\nfunction bvb(a,b){this.e=a;this.d=(b&64)!=0?b|oie:b}\nfunction qvb(a,b){this.c=0;this.d=a;this.b=b|64|oie}\nfunction gub(a){this.b=new Skb(11);this.a=(ipb(),a)}\nfunction Qwb(a){this.b=null;this.a=(ipb(),!a?fpb:a)}\nfunction nHc(a){this.a=lHc(a.a);this.b=new Tkb(a.b)}\nfunction Pzd(a){this.b=a;Oyd.call(this,a);Ozd(this)}\nfunction Xzd(a){this.b=a;bzd.call(this,a);Wzd(this)}\nfunction jUd(a,b,c){this.a=a;gUd.call(this,b,c,5,6)}\nfunction Y5d(a,b,c,d){this.b=a;xMd.call(this,b,c,d)}\nfunction nSd(a,b,c,d,e){oSd.call(this,a,b,c,d,e,-1)}\nfunction DSd(a,b,c,d,e){ESd.call(this,a,b,c,d,e,-1)}\nfunction cUd(a,b,c,d){xMd.call(this,a,b,c);this.b=d}\nfunction i5d(a,b,c,d){pMd.call(this,a,b,c);this.b=d}\nfunction x0d(a){Wud.call(this,a,false);this.a=false}\nfunction Lj(a,b){this.b=a;sj.call(this,a.b);this.a=b}\nfunction px(a,b){im();ox.call(this,a,Dm(new amb(b)))}\nfunction Cfe(a,b){wfe();++vfe;return new Dge(a,b,0)}\nfunction Efe(a,b){wfe();++vfe;return new Dge(6,a,b)}\nfunction nfb(a,b){return dfb(a.substr(0,b.length),b)}\nfunction Mhb(a,b){return ND(b)?Qhb(a,b):!!irb(a.f,b)}\nfunction Rrb(a,b){uCb(b);while(a.Ob()){b.td(a.Pb())}}\nfunction Vgb(a,b,c){Hgb();this.e=a;this.d=b;this.a=c}\nfunction amc(a,b,c,d){var e;e=a.i;e.i=b;e.a=c;e.b=d}\nfunction xJc(a){var b;b=a;while(b.f){b=b.f}return b}\nfunction fkb(a){var b;b=bkb(a);sCb(b!=null);return b}\nfunction gkb(a){var b;b=ckb(a);sCb(b!=null);return b}\nfunction cv(a,b){var c;c=a.a.gc();Sb(b,c);return c-b}\nfunction Glb(a,b){var c;for(c=0;c0?$wnd.Math.log(a/b):-100}\nfunction ueb(a,b){return ybb(a,b)<0?-1:ybb(a,b)>0?1:0}\nfunction HMb(a,b,c){return IMb(a,BD(b,46),BD(c,167))}\nfunction iq(a,b){return BD(Rl(Wm(a.a)).Xb(b),42).cd()}\nfunction Olb(a,b){return avb(b,a.length),new vvb(a,b)}\nfunction Pyd(a,b){this.d=a;Fyd.call(this,a);this.e=b}\nfunction Lub(a){this.d=(uCb(a),a);this.a=0;this.c=rie}\nfunction rge(a,b){xfe.call(this,1);this.a=a;this.b=b}\nfunction Rzb(a,b){!a.c?Ekb(a.b,b):Rzb(a.c,b);return a}\nfunction uB(a,b,c){var d;d=tB(a,b);vB(a,b,c);return d}\nfunction ZBb(a,b){var c;c=a.slice(0,b);return PC(c,a)}\nfunction Flb(a,b,c){var d;for(d=0;d=a.g}\nfunction NHc(a,b,c){var d;d=THc(a,b,c);return MHc(a,d)}\nfunction Qpd(a,b){var c;c=a.a.length;tB(a,c);vB(a,c,b)}\nfunction gCb(a,b){var c;c=console[a];c.call(console,b)}\nfunction Bvd(a,b){var c;++a.j;c=a.Vi();a.Ii(a.oi(c,b))}\nfunction E1c(a,b,c){BD(b.b,65);Hkb(b.a,new L1c(a,c,b))}\nfunction oXd(a,b,c){VVd.call(this,b);this.a=a;this.b=c}\nfunction Dge(a,b,c){xfe.call(this,a);this.a=b;this.b=c}\nfunction dYd(a,b,c){this.a=a;lVd.call(this,b);this.b=c}\nfunction f0d(a,b,c){this.a=a;mxd.call(this,8,b,null,c)}\nfunction z1d(a){this.a=(uCb(Rve),Rve);this.b=a;new oUd}\nfunction ct(a){this.c=a;this.b=this.c.a;this.a=this.c.e}\nfunction usb(a){this.c=a;this.b=a.a.d.a;ypb(a.a.e,this)}\nfunction uib(a){yCb(a.c!=-1);a.d.$c(a.c);a.b=a.c;a.c=-1}\nfunction U6c(a){return $wnd.Math.sqrt(a.a*a.a+a.b*a.b)}\nfunction Uvb(a,b){return _vb(b,a.a.c.length),Ikb(a.a,b)}\nfunction Hb(a,b){return PD(a)===PD(b)||a!=null&&pb(a,b)}\nfunction oAb(a){if(0>=a){return new yAb}return pAb(a-1)}\nfunction Nfe(a){if(!bfe)return false;return Qhb(bfe,a)}\nfunction Ehe(a){if(a)return a.dc();return !a.Kc().Ob()}\nfunction Q_b(a){if(!a.a&&!!a.c){return a.c.b}return a.a}\nfunction LHd(a){!a.a&&(a.a=new xMd(m5,a,4));return a.a}\nfunction LQd(a){!a.d&&(a.d=new xMd(j5,a,1));return a.d}\nfunction uCb(a){if(a==null){throw vbb(new Geb)}return a}\nfunction Qzb(a){if(!a.c){a.d=true;Szb(a)}else{a.c.He()}}\nfunction Tzb(a){if(!a.c){Uzb(a);a.d=true}else{Tzb(a.c)}}\nfunction Kpb(a){Ae(a.a);a.b=KC(SI,Uhe,1,a.b.length,5,1)}\nfunction qlc(a,b){return beb(b.j.c.length,a.j.c.length)}\nfunction igd(a,b){a.c<0||a.b.b=0?a.Bh(c):vid(a,b)}\nfunction WHc(a){var b,c;b=a.c.i.c;c=a.d.i.c;return b==c}\nfunction Wwd(a){if(a.p!=4)throw vbb(new Ydb);return a.e}\nfunction Vwd(a){if(a.p!=3)throw vbb(new Ydb);return a.e}\nfunction Ywd(a){if(a.p!=6)throw vbb(new Ydb);return a.f}\nfunction fxd(a){if(a.p!=6)throw vbb(new Ydb);return a.k}\nfunction cxd(a){if(a.p!=3)throw vbb(new Ydb);return a.j}\nfunction dxd(a){if(a.p!=4)throw vbb(new Ydb);return a.j}\nfunction AYd(a){!a.b&&(a.b=new RYd(new NYd));return a.b}\nfunction $1d(a){a.c==-2&&e2d(a,X0d(a.g,a.b));return a.c}\nfunction pdb(a,b){var c;c=ldb('',a);c.n=b;c.i=1;return c}\nfunction MNb(a,b){$Nb(BD(b.b,65),a);Hkb(b.a,new RNb(a))}\nfunction Cnd(a,b){wtd((!a.a&&(a.a=new fTd(a,a)),a.a),b)}\nfunction Qzd(a,b){this.b=a;Pyd.call(this,a,b);Ozd(this)}\nfunction Yzd(a,b){this.b=a;czd.call(this,a,b);Wzd(this)}\nfunction Ms(a,b,c,d){Wo.call(this,a,b);this.d=c;this.a=d}\nfunction $o(a,b,c,d){Wo.call(this,a,c);this.a=b;this.f=d}\nfunction iy(a,b){Pp.call(this,umb(Qb(a),Qb(b)));this.a=b}\nfunction cae(){fod.call(this,Ewe,(p8d(),o8d));$9d(this)}\nfunction AZd(){fod.call(this,_ve,(LFd(),KFd));uZd(this)}\nfunction T0c(){$r.call(this,'DELAUNAY_TRIANGULATION',0)}\nfunction vfb(a){return String.fromCharCode.apply(null,a)}\nfunction Rhb(a,b,c){return ND(b)?Shb(a,b,c):jrb(a.f,b,c)}\nfunction tmb(a){mmb();return !a?(ipb(),ipb(),hpb):a.ve()}\nfunction d2c(a,b,c){Y1c();return c.pg(a,BD(b.cd(),146))}\nfunction ix(a,b){ex();return new gx(new il(a),new Uk(b))}\nfunction Iu(a){Xj(a,Mie);return Oy(wbb(wbb(5,a),a/10|0))}\nfunction Vm(){Vm=ccb;Um=new wx(OC(GC(CK,1),zie,42,0,[]))}\nfunction hob(a){!a.d&&(a.d=new lnb(a.c.Cc()));return a.d}\nfunction eob(a){!a.a&&(a.a=new Gob(a.c.vc()));return a.a}\nfunction gob(a){!a.b&&(a.b=new zob(a.c.ec()));return a.b}\nfunction keb(a,b){while(b-->0){a=a<<1|(a<0?1:0)}return a}\nfunction wtb(a,b){return PD(a)===PD(b)||a!=null&&pb(a,b)}\nfunction Gbc(a,b){return Bcb(),BD(b.b,19).ad&&++d;return d}\nfunction Nnd(a){var b,c;c=(b=new UQd,b);NQd(c,a);return c}\nfunction Ond(a){var b,c;c=(b=new UQd,b);RQd(c,a);return c}\nfunction hqd(a,b){var c;c=Ohb(a.f,b);Yqd(b,c);return null}\nfunction JZb(a){var b;b=P2b(a);if(b){return b}return null}\nfunction Wod(a){!a.b&&(a.b=new cUd(B2,a,12,3));return a.b}\nfunction YEd(a){return a!=null&&hnb(GEd,a.toLowerCase())}\nfunction ied(a,b){return Kdb(red(a)*qed(a),red(b)*qed(b))}\nfunction jed(a,b){return Kdb(red(a)*qed(a),red(b)*qed(b))}\nfunction wEb(a,b){return Kdb(a.d.c+a.d.b/2,b.d.c+b.d.b/2)}\nfunction UVb(a,b){return Kdb(a.g.c+a.g.b/2,b.g.c+b.g.b/2)}\nfunction pQb(a,b,c){c.a?eld(a,b.b-a.f/2):dld(a,b.a-a.g/2)}\nfunction prd(a,b,c,d){this.a=a;this.b=b;this.c=c;this.d=d}\nfunction ord(a,b,c,d){this.a=a;this.b=b;this.c=c;this.d=d}\nfunction JVd(a,b,c,d){this.e=a;this.a=b;this.c=c;this.d=d}\nfunction ZVd(a,b,c,d){this.a=a;this.c=b;this.d=c;this.b=d}\nfunction cXd(a,b,c,d){UVd();mWd.call(this,b,c,d);this.a=a}\nfunction jXd(a,b,c,d){UVd();mWd.call(this,b,c,d);this.a=a}\nfunction Ng(a,b){this.a=a;Hg.call(this,a,BD(a.d,15).Zc(b))}\nfunction ZBd(a){this.f=a;this.c=this.f.e;a.f>0&&YBd(this)}\nfunction lBb(a,b,c,d){this.b=a;this.c=d;nvb.call(this,b,c)}\nfunction tib(a){sCb(a.b=0&&dfb(a.substr(c,b.length),b)}\nfunction H2d(a,b,c,d,e,f,g){return new O7d(a.e,b,c,d,e,f,g)}\nfunction Cxd(a,b,c,d,e,f){this.a=a;nxd.call(this,b,c,d,e,f)}\nfunction vyd(a,b,c,d,e,f){this.a=a;nxd.call(this,b,c,d,e,f)}\nfunction $Ec(a,b){this.g=a;this.d=OC(GC(OQ,1),kne,10,0,[b])}\nfunction KVd(a,b){this.e=a;this.a=SI;this.b=R5d(b);this.c=b}\nfunction cIb(a,b){$Gb.call(this);THb(this);this.a=a;this.c=b}\nfunction kBc(a,b,c,d){NC(a.c[b.g],c.g,d);NC(a.c[c.g],b.g,d)}\nfunction nBc(a,b,c,d){NC(a.c[b.g],b.g,c);NC(a.b[b.g],b.g,d)}\nfunction cBc(){_Ac();return OC(GC(fX,1),Kie,376,0,[$Ac,ZAc])}\nfunction crc(){_qc();return OC(GC(MW,1),Kie,479,0,[$qc,Zqc])}\nfunction Aqc(){xqc();return OC(GC(JW,1),Kie,419,0,[vqc,wqc])}\nfunction Lpc(){Ipc();return OC(GC(FW,1),Kie,422,0,[Gpc,Hpc])}\nfunction psc(){msc();return OC(GC(SW,1),Kie,420,0,[ksc,lsc])}\nfunction EAc(){BAc();return OC(GC(cX,1),Kie,421,0,[zAc,AAc])}\nfunction XIc(){UIc();return OC(GC(mY,1),Kie,523,0,[TIc,SIc])}\nfunction KOc(){HOc();return OC(GC(DZ,1),Kie,520,0,[GOc,FOc])}\nfunction _Lc(){YLc();return OC(GC(fZ,1),Kie,516,0,[XLc,WLc])}\nfunction hMc(){eMc();return OC(GC(gZ,1),Kie,515,0,[cMc,dMc])}\nfunction IQc(){FQc();return OC(GC(YZ,1),Kie,455,0,[DQc,EQc])}\nfunction bUc(){$Tc();return OC(GC(F$,1),Kie,425,0,[ZTc,YTc])}\nfunction VTc(){STc();return OC(GC(E$,1),Kie,480,0,[QTc,RTc])}\nfunction VUc(){PUc();return OC(GC(K$,1),Kie,495,0,[NUc,OUc])}\nfunction jWc(){fWc();return OC(GC(X$,1),Kie,426,0,[dWc,eWc])}\nfunction g1c(){a1c();return OC(GC(X_,1),Kie,429,0,[_0c,$0c])}\nfunction F_c(){C_c();return OC(GC(P_,1),Kie,430,0,[B_c,A_c])}\nfunction PEb(){MEb();return OC(GC(aN,1),Kie,428,0,[LEb,KEb])}\nfunction XEb(){UEb();return OC(GC(bN,1),Kie,427,0,[SEb,TEb])}\nfunction $Rb(){XRb();return OC(GC(gP,1),Kie,424,0,[VRb,WRb])}\nfunction B5b(){y5b();return OC(GC(ZR,1),Kie,511,0,[x5b,w5b])}\nfunction lid(a,b,c,d){return c>=0?a.jh(b,c,d):a.Sg(null,c,d)}\nfunction hgd(a){if(a.b.b==0){return a.a.$e()}return Lsb(a.b)}\nfunction Xwd(a){if(a.p!=5)throw vbb(new Ydb);return Tbb(a.f)}\nfunction exd(a){if(a.p!=5)throw vbb(new Ydb);return Tbb(a.k)}\nfunction pNd(a){PD(a.a)===PD((NKd(),MKd))&&qNd(a);return a.a}\nfunction by(a){this.a=BD(Qb(a),271);this.b=(mmb(),new Zob(a))}\nfunction bQc(a,b){$Pc(this,new f7c(a.a,a.b));_Pc(this,Ru(b))}\nfunction FQc(){FQc=ccb;DQc=new GQc(jle,0);EQc=new GQc(kle,1)}\nfunction YLc(){YLc=ccb;XLc=new ZLc(kle,0);WLc=new ZLc(jle,1)}\nfunction Hp(){Gp.call(this,new Mqb(Cv(12)));Lb(true);this.a=2}\nfunction Hge(a,b,c){wfe();xfe.call(this,a);this.b=b;this.a=c}\nfunction cWd(a,b,c){UVd();VVd.call(this,b);this.a=a;this.b=c}\nfunction aIb(a){$Gb.call(this);THb(this);this.a=a;this.c=true}\nfunction isb(a){var b;b=a.c.d.b;a.b=b;a.a=a.c.d;b.a=a.c.d.b=a}\nfunction $Cb(a){var b;NGb(a.a);MGb(a.a);b=new YGb(a.a);UGb(b)}\nfunction iKb(a,b){hKb(a,true);Hkb(a.e.wf(),new mKb(a,true,b))}\nfunction tlb(a,b){pCb(b);return vlb(a,KC(WD,oje,25,b,15,1),b)}\nfunction YPb(a,b){QPb();return a==Xod(jtd(b))||a==Xod(ltd(b))}\nfunction Phb(a,b){return b==null?Wd(irb(a.f,null)):Crb(a.g,b)}\nfunction Ksb(a){return a.b==0?null:(sCb(a.b!=0),Nsb(a,a.a.a))}\nfunction QD(a){return Math.max(Math.min(a,Ohe),-2147483648)|0}\nfunction uz(a,b){var c=tz[a.charCodeAt(0)];return c==null?a:c}\nfunction Cx(a,b){Rb(a,'set1');Rb(b,'set2');return new Px(a,b)}\nfunction QUb(a,b){var c;c=zUb(a.f,b);return P6c(V6c(c),a.f.d)}\nfunction Jwb(a,b){var c,d;c=b;d=new fxb;Lwb(a,c,d);return d.d}\nfunction NJb(a,b,c,d){var e;e=new aHb;b.a[c.g]=e;Npb(a.b,d,e)}\nfunction zid(a,b,c){var d;d=a.Yg(b);d>=0?a.sh(d,c):uid(a,b,c)}\nfunction hvd(a,b,c){evd();!!a&&Rhb(dvd,a,b);!!a&&Rhb(cvd,a,c)}\nfunction g_c(a,b,c){this.i=new Rkb;this.b=a;this.g=b;this.a=c}\nfunction VZc(a,b,c){this.c=new Rkb;this.e=a;this.f=b;this.b=c}\nfunction b$c(a,b,c){this.a=new Rkb;this.e=a;this.f=b;this.c=c}\nfunction Zy(a,b){Py(this);this.f=b;this.g=a;Ry(this);this._d()}\nfunction ZA(a,b){var c;c=a.q.getHours();a.q.setDate(b);YA(a,c)}\nfunction no(a,b){var c;Qb(b);for(c=a.a;c;c=c.c){b.Od(c.g,c.i)}}\nfunction Fx(a){var b;b=new Uqb(Cv(a.length));nmb(b,a);return b}\nfunction ecb(a){function b(){}\n;b.prototype=a||{};return new b}\nfunction dkb(a,b){if(Zjb(a,b)){wkb(a);return true}return false}\nfunction aC(a,b){if(b==null){throw vbb(new Geb)}return bC(a,b)}\nfunction tdb(a){if(a.qe()){return null}var b=a.n;return _bb[b]}\nfunction Mld(a){if(a.Db>>16!=3)return null;return BD(a.Cb,33)}\nfunction mpd(a){if(a.Db>>16!=9)return null;return BD(a.Cb,33)}\nfunction fmd(a){if(a.Db>>16!=6)return null;return BD(a.Cb,79)}\nfunction Ind(a){if(a.Db>>16!=7)return null;return BD(a.Cb,235)}\nfunction Fod(a){if(a.Db>>16!=7)return null;return BD(a.Cb,160)}\nfunction Xod(a){if(a.Db>>16!=11)return null;return BD(a.Cb,33)}\nfunction nid(a,b){var c;c=a.Yg(b);return c>=0?a.lh(c):tid(a,b)}\nfunction Dtd(a,b){var c;c=new Bsb(b);Ve(c,a);return new Tkb(c)}\nfunction Uud(a){var b;b=a.d;b=a.si(a.f);wtd(a,b);return b.Ob()}\nfunction t_b(a,b){a.b+=b.b;a.c+=b.c;a.d+=b.d;a.a+=b.a;return a}\nfunction A4b(a,b){return $wnd.Math.abs(a)<$wnd.Math.abs(b)?a:b}\nfunction Zod(a){return !a.a&&(a.a=new cUd(E2,a,10,11)),a.a.i>0}\nfunction oDb(){this.a=new zsb;this.e=new Tqb;this.g=0;this.i=0}\nfunction BGc(a){this.a=a;this.b=KC(SX,nie,1944,a.e.length,0,2)}\nfunction RHc(a,b,c){var d;d=SHc(a,b,c);a.b=new BHc(d.c.length)}\nfunction eMc(){eMc=ccb;cMc=new fMc(vle,0);dMc=new fMc('UP',1)}\nfunction STc(){STc=ccb;QTc=new TTc(Yqe,0);RTc=new TTc('FAN',1)}\nfunction evd(){evd=ccb;dvd=new Lqb;cvd=new Lqb;ivd(hK,new jvd)}\nfunction Swd(a){if(a.p!=0)throw vbb(new Ydb);return Kbb(a.f,0)}\nfunction _wd(a){if(a.p!=0)throw vbb(new Ydb);return Kbb(a.k,0)}\nfunction MHd(a){if(a.Db>>16!=3)return null;return BD(a.Cb,147)}\nfunction ZJd(a){if(a.Db>>16!=6)return null;return BD(a.Cb,235)}\nfunction WId(a){if(a.Db>>16!=17)return null;return BD(a.Cb,26)}\nfunction rdb(a,b){var c=a.a=a.a||[];return c[b]||(c[b]=a.le(b))}\nfunction hrb(a,b){var c;c=a.a.get(b);return c==null?new Array:c}\nfunction aB(a,b){var c;c=a.q.getHours();a.q.setMonth(b);YA(a,c)}\nfunction Shb(a,b,c){return b==null?jrb(a.f,null,c):Drb(a.g,b,c)}\nfunction FLd(a,b,c,d,e,f){return new pSd(a.e,b,a.aj(),c,d,e,f)}\nfunction Tfb(a,b,c){a.a=qfb(a.a,0,b)+(''+c)+pfb(a.a,b);return a}\nfunction bq(a,b,c){Ekb(a.a,(Vm(),Wj(b,c),new Wo(b,c)));return a}\nfunction uu(a){ot(a.c);a.e=a.a=a.c;a.c=a.c.c;++a.d;return a.a.f}\nfunction vu(a){ot(a.e);a.c=a.a=a.e;a.e=a.e.e;--a.d;return a.a.f}\nfunction RZb(a,b){!!a.d&&Lkb(a.d.e,a);a.d=b;!!a.d&&Ekb(a.d.e,a)}\nfunction QZb(a,b){!!a.c&&Lkb(a.c.g,a);a.c=b;!!a.c&&Ekb(a.c.g,a)}\nfunction $_b(a,b){!!a.c&&Lkb(a.c.a,a);a.c=b;!!a.c&&Ekb(a.c.a,a)}\nfunction F0b(a,b){!!a.i&&Lkb(a.i.j,a);a.i=b;!!a.i&&Ekb(a.i.j,a)}\nfunction jDb(a,b,c){this.a=b;this.c=a;this.b=(Qb(c),new Tkb(c))}\nfunction qXb(a,b,c){this.a=b;this.c=a;this.b=(Qb(c),new Tkb(c))}\nfunction aOb(a,b){this.a=a;this.c=R6c(this.a);this.b=new K6c(b)}\nfunction IAb(a){var b;Uzb(a);b=new Tqb;return JAb(a,new jBb(b))}\nfunction wCb(a,b){if(a<0||a>b){throw vbb(new qcb(Ake+a+Bke+b))}}\nfunction Ppb(a,b){return vqb(a.a,b)?Qpb(a,BD(b,22).g,null):null}\nfunction WUb(a){LUb();return Bcb(),BD(a.a,81).d.e!=0?true:false}\nfunction qs(){qs=ccb;ps=as((hs(),OC(GC(yG,1),Kie,538,0,[gs])))}\nfunction SBc(){SBc=ccb;RBc=c3c(new j3c,(qUb(),pUb),(S8b(),J8b))}\nfunction ZBc(){ZBc=ccb;YBc=c3c(new j3c,(qUb(),pUb),(S8b(),J8b))}\nfunction oCc(){oCc=ccb;nCc=c3c(new j3c,(qUb(),pUb),(S8b(),J8b))}\nfunction aJc(){aJc=ccb;_Ic=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))}\nfunction FJc(){FJc=ccb;EJc=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))}\nfunction ILc(){ILc=ccb;HLc=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))}\nfunction wMc(){wMc=ccb;vMc=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))}\nfunction fUc(){fUc=ccb;eUc=c3c(new j3c,(yRc(),xRc),(qSc(),kSc))}\nfunction DOc(a,b,c,d){this.c=a;this.d=d;BOc(this,b);COc(this,c)}\nfunction W3c(a){this.c=new Psb;this.b=a.b;this.d=a.c;this.a=a.a}\nfunction e7c(a){this.a=$wnd.Math.cos(a);this.b=$wnd.Math.sin(a)}\nfunction BOc(a,b){!!a.a&&Lkb(a.a.k,a);a.a=b;!!a.a&&Ekb(a.a.k,a)}\nfunction COc(a,b){!!a.b&&Lkb(a.b.f,a);a.b=b;!!a.b&&Ekb(a.b.f,a)}\nfunction D1c(a,b){E1c(a,a.b,a.c);BD(a.b.b,65);!!b&&BD(b.b,65).b}\nfunction BUd(a,b){CUd(a,b);JD(a.Cb,88)&&XMd($Kd(BD(a.Cb,88)),2)}\nfunction cJd(a,b){JD(a.Cb,88)&&XMd($Kd(BD(a.Cb,88)),4);pnd(a,b)}\nfunction lKd(a,b){JD(a.Cb,179)&&(BD(a.Cb,179).tb=null);pnd(a,b)}\nfunction T2d(a,b){return Q6d(),YId(b)?new R7d(b,a):new f7d(b,a)}\nfunction jsd(a,b){var c,d;c=b.c;d=c!=null;d&&Qpd(a,new yC(b.c))}\nfunction XOd(a){var b,c;c=(LFd(),b=new UQd,b);NQd(c,a);return c}\nfunction eTd(a){var b,c;c=(LFd(),b=new UQd,b);NQd(c,a);return c}\nfunction yCc(a,b){var c;c=new H1b(a);b.c[b.c.length]=c;return c}\nfunction Aw(a,b){var c;c=BD(Hv(nd(a.a),b),14);return !c?0:c.gc()}\nfunction UAb(a){var b;Uzb(a);b=(ipb(),ipb(),gpb);return VAb(a,b)}\nfunction nr(a){var b;while(true){b=a.Pb();if(!a.Ob()){return b}}}\nfunction Ki(a,b){Ii.call(this,new Mqb(Cv(a)));Xj(b,mie);this.a=b}\nfunction Jib(a,b,c){xCb(b,c,a.gc());this.c=a;this.a=b;this.b=c-b}\nfunction Mkb(a,b,c){var d;xCb(b,c,a.c.length);d=c-b;cCb(a.c,b,d)}\nfunction Fub(a,b){Eub(a,Tbb(xbb(Obb(b,24),nke)),Tbb(xbb(b,nke)))}\nfunction tCb(a,b){if(a<0||a>=b){throw vbb(new qcb(Ake+a+Bke+b))}}\nfunction BCb(a,b){if(a<0||a>=b){throw vbb(new Xfb(Ake+a+Bke+b))}}\nfunction Kub(a,b){this.b=(uCb(a),a);this.a=(b&Rje)==0?b|64|oie:b}\nfunction kkb(a){Vjb(this);dCb(this.a,geb($wnd.Math.max(8,a))<<1)}\nfunction A0b(a){return l7c(OC(GC(m1,1),nie,8,0,[a.i.n,a.n,a.a]))}\nfunction Iyb(){Fyb();return OC(GC(xL,1),Kie,132,0,[Cyb,Dyb,Eyb])}\nfunction jHb(){gHb();return OC(GC(pN,1),Kie,232,0,[dHb,eHb,fHb])}\nfunction QHb(){NHb();return OC(GC(sN,1),Kie,461,0,[LHb,KHb,MHb])}\nfunction HIb(){EIb();return OC(GC(zN,1),Kie,462,0,[DIb,CIb,BIb])}\nfunction UXb(){RXb();return OC(GC(hQ,1),Kie,423,0,[QXb,PXb,OXb])}\nfunction BTb(){yTb();return OC(GC(oP,1),Kie,379,0,[wTb,vTb,xTb])}\nfunction Bzc(){xzc();return OC(GC(ZW,1),Kie,378,0,[uzc,vzc,wzc])}\nfunction Xpc(){Rpc();return OC(GC(GW,1),Kie,314,0,[Ppc,Opc,Qpc])}\nfunction eqc(){bqc();return OC(GC(HW,1),Kie,337,0,[$pc,aqc,_pc])}\nfunction Jqc(){Gqc();return OC(GC(KW,1),Kie,450,0,[Eqc,Dqc,Fqc])}\nfunction Ikc(){Fkc();return OC(GC(vV,1),Kie,361,0,[Ekc,Dkc,Ckc])}\nfunction hsc(){esc();return OC(GC(RW,1),Kie,303,0,[csc,dsc,bsc])}\nfunction $rc(){Xrc();return OC(GC(QW,1),Kie,292,0,[Vrc,Wrc,Urc])}\nfunction NAc(){KAc();return OC(GC(dX,1),Kie,452,0,[JAc,HAc,IAc])}\nfunction wAc(){tAc();return OC(GC(bX,1),Kie,339,0,[rAc,qAc,sAc])}\nfunction WAc(){TAc();return OC(GC(eX,1),Kie,375,0,[QAc,RAc,SAc])}\nfunction OBc(){LBc();return OC(GC(jX,1),Kie,377,0,[JBc,KBc,IBc])}\nfunction wBc(){tBc();return OC(GC(hX,1),Kie,336,0,[qBc,rBc,sBc])}\nfunction FBc(){CBc();return OC(GC(iX,1),Kie,338,0,[BBc,zBc,ABc])}\nfunction uGc(){rGc();return OC(GC(PX,1),Kie,454,0,[oGc,pGc,qGc])}\nfunction xVc(){tVc();return OC(GC(O$,1),Kie,442,0,[sVc,qVc,rVc])}\nfunction tWc(){pWc();return OC(GC(Y$,1),Kie,380,0,[mWc,nWc,oWc])}\nfunction CYc(){zYc();return OC(GC(q_,1),Kie,381,0,[xYc,yYc,wYc])}\nfunction wXc(){sXc();return OC(GC(b_,1),Kie,293,0,[qXc,rXc,pXc])}\nfunction _$c(){Y$c();return OC(GC(J_,1),Kie,437,0,[V$c,W$c,X$c])}\nfunction kbd(){hbd();return OC(GC(z1,1),Kie,334,0,[fbd,ebd,gbd])}\nfunction tad(){qad();return OC(GC(u1,1),Kie,272,0,[nad,oad,pad])}\nfunction o3d(a,b){return p3d(a,b,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)}\nfunction LZc(a,b,c){var d;d=MZc(a,b,false);return d.b<=b&&d.a<=c}\nfunction tMc(a,b,c){var d;d=new sMc;d.b=b;d.a=c;++b.b;Ekb(a.d,d)}\nfunction fs(a,b){var c;c=(uCb(a),a).g;lCb(!!c);uCb(b);return c(b)}\nfunction av(a,b){var c,d;d=cv(a,b);c=a.a.Zc(d);return new qv(a,c)}\nfunction cKd(a){if(a.Db>>16!=6)return null;return BD(aid(a),235)}\nfunction Uwd(a){if(a.p!=2)throw vbb(new Ydb);return Tbb(a.f)&aje}\nfunction bxd(a){if(a.p!=2)throw vbb(new Ydb);return Tbb(a.k)&aje}\nfunction Z1d(a){a.a==(T0d(),S0d)&&d2d(a,U0d(a.g,a.b));return a.a}\nfunction _1d(a){a.d==(T0d(),S0d)&&f2d(a,Y0d(a.g,a.b));return a.d}\nfunction mlb(a){sCb(a.ad?1:0}\nfunction bjc(a,b){var c,d;c=ajc(b);d=c;return BD(Ohb(a.c,d),19).a}\nfunction iSc(a,b){var c;c=a+'';while(c.length0&&a.a[--a.d]==0);a.a[a.d++]==0&&(a.e=0)}\nfunction wwb(a){return !a.a?a.c:a.e.length==0?a.a.a:a.a.a+(''+a.e)}\nfunction RSd(a){return !!a.a&&QSd(a.a.a).i!=0&&!(!!a.b&&QTd(a.b))}\nfunction cLd(a){return !!a.u&&VKd(a.u.a).i!=0&&!(!!a.n&&FMd(a.n))}\nfunction $i(a){return Zj(a.e.Hd().gc()*a.c.Hd().gc(),16,new ij(a))}\nfunction XA(a,b){return ueb(Cbb(a.q.getTime()),Cbb(b.q.getTime()))}\nfunction k_b(a){return BD(Qkb(a,KC(AQ,jne,17,a.c.length,0,1)),474)}\nfunction l_b(a){return BD(Qkb(a,KC(OQ,kne,10,a.c.length,0,1)),193)}\nfunction cKc(a){FJc();return !OZb(a)&&!(!OZb(a)&&a.c.i.c==a.d.i.c)}\nfunction kDb(a,b,c){var d;d=(Qb(a),new Tkb(a));iDb(new jDb(d,b,c))}\nfunction rXb(a,b,c){var d;d=(Qb(a),new Tkb(a));pXb(new qXb(d,b,c))}\nfunction Nwb(a,b){var c;c=1-b;a.a[c]=Owb(a.a[c],c);return Owb(a,b)}\nfunction YXc(a,b){var c;a.e=new QXc;c=gVc(b);Okb(c,a.c);ZXc(a,c,0)}\nfunction o4c(a,b,c,d){var e;e=new w4c;e.a=b;e.b=c;e.c=d;Dsb(a.a,e)}\nfunction p4c(a,b,c,d){var e;e=new w4c;e.a=b;e.b=c;e.c=d;Dsb(a.b,e)}\nfunction i6d(a){var b,c,d;b=new A6d;c=s6d(b,a);z6d(b);d=c;return d}\nfunction vZd(){var a,b,c;b=(c=(a=new UQd,a),c);Ekb(rZd,b);return b}\nfunction H2c(a){a.j.c=KC(SI,Uhe,1,0,5,1);Ae(a.c);h3c(a.a);return a}\nfunction tgc(a){qgc();if(JD(a.g,10)){return BD(a.g,10)}return null}\nfunction Zw(a){if(Ah(a).dc()){return false}Bh(a,new bx);return true}\nfunction _y(b){if(!('stack' in b)){try{throw b}catch(a){}}return b}\nfunction Pb(a,b){if(a<0||a>=b){throw vbb(new qcb(Ib(a,b)))}return a}\nfunction Tb(a,b,c){if(a<0||bc){throw vbb(new qcb(Kb(a,b,c)))}}\nfunction eVb(a,b){Qqb(a.a,b);if(b.d){throw vbb(new hz(Hke))}b.d=a}\nfunction xpb(a,b){if(b.$modCount!=a.$modCount){throw vbb(new Apb)}}\nfunction $pb(a,b){if(JD(b,42)){return Jd(a.a,BD(b,42))}return false}\nfunction dib(a,b){if(JD(b,42)){return Jd(a.a,BD(b,42))}return false}\nfunction msb(a,b){if(JD(b,42)){return Jd(a.a,BD(b,42))}return false}\nfunction qAb(a,b){if(a.a<=a.b){b.ud(a.a++);return true}return false}\nfunction Sbb(a){var b;if(Fbb(a)){b=a;return b==-0.?0:b}return oD(a)}\nfunction tAb(a){var b;Tzb(a);b=new drb;_ub(a.a,new BAb(b));return b}\nfunction Yzb(a){var b;Tzb(a);b=new Gpb;_ub(a.a,new mAb(b));return b}\nfunction Bib(a,b){this.a=a;vib.call(this,a);wCb(b,a.gc());this.b=b}\nfunction orb(a){this.e=a;this.b=this.e.a.entries();this.a=new Array}\nfunction Oi(a){return Zj(a.e.Hd().gc()*a.c.Hd().gc(),273,new cj(a))}\nfunction Qu(a){return new Skb((Xj(a,Mie),Oy(wbb(wbb(5,a),a/10|0))))}\nfunction m_b(a){return BD(Qkb(a,KC(aR,lne,11,a.c.length,0,1)),1943)}\nfunction sMb(a,b,c){return c.f.c.length>0?HMb(a.a,b,c):HMb(a.b,b,c)}\nfunction SZb(a,b,c){!!a.d&&Lkb(a.d.e,a);a.d=b;!!a.d&&Dkb(a.d.e,c,a)}\nfunction a5b(a,b){i5b(b,a);k5b(a.d);k5b(BD(vNb(a,(Nyc(),wxc)),207))}\nfunction _4b(a,b){f5b(b,a);h5b(a.d);h5b(BD(vNb(a,(Nyc(),wxc)),207))}\nfunction Ypd(a,b){var c,d;c=aC(a,b);d=null;!!c&&(d=c.fe());return d}\nfunction Zpd(a,b){var c,d;c=tB(a,b);d=null;!!c&&(d=c.ie());return d}\nfunction $pd(a,b){var c,d;c=aC(a,b);d=null;!!c&&(d=c.ie());return d}\nfunction _pd(a,b){var c,d;c=aC(a,b);d=null;!!c&&(d=aqd(c));return d}\nfunction Tqd(a,b,c){var d;d=Wpd(c);ro(a.g,d,b);ro(a.i,b,c);return b}\nfunction Ez(a,b,c){var d;d=Cz();try{return Bz(a,b,c)}finally{Fz(d)}}\nfunction C6d(a){var b;b=a.Wg();this.a=JD(b,69)?BD(b,69).Zh():b.Kc()}\nfunction j3c(){D2c.call(this);this.j.c=KC(SI,Uhe,1,0,5,1);this.a=-1}\nfunction mxd(a,b,c,d){this.d=a;this.n=b;this.g=c;this.o=d;this.p=-1}\nfunction jk(a,b,c,d){this.e=d;this.d=null;this.c=a;this.a=b;this.b=c}\nfunction uEc(a,b,c){this.d=new HEc(this);this.e=a;this.i=b;this.f=c}\nfunction msc(){msc=ccb;ksc=new nsc(gle,0);lsc=new nsc('TOP_LEFT',1)}\nfunction cDc(){cDc=ccb;bDc=ix(meb(1),meb(4));aDc=ix(meb(1),meb(2))}\nfunction z_c(){z_c=ccb;y_c=as((s_c(),OC(GC(O_,1),Kie,551,0,[r_c])))}\nfunction q_c(){q_c=ccb;p_c=as((i_c(),OC(GC(N_,1),Kie,482,0,[h_c])))}\nfunction Z0c(){Z0c=ccb;Y0c=as((R0c(),OC(GC(W_,1),Kie,530,0,[Q0c])))}\nfunction hPb(){hPb=ccb;gPb=as((cPb(),OC(GC(GO,1),Kie,481,0,[bPb])))}\nfunction yLb(){vLb();return OC(GC(PN,1),Kie,406,0,[uLb,rLb,sLb,tLb])}\nfunction qxb(){lxb();return OC(GC(iL,1),Kie,297,0,[hxb,ixb,jxb,kxb])}\nfunction UOb(){ROb();return OC(GC(CO,1),Kie,394,0,[OOb,NOb,POb,QOb])}\nfunction UMb(){RMb();return OC(GC(jO,1),Kie,323,0,[OMb,NMb,PMb,QMb])}\nfunction sWb(){lWb();return OC(GC(SP,1),Kie,405,0,[hWb,kWb,iWb,jWb])}\nfunction kbc(){gbc();return OC(GC(VS,1),Kie,360,0,[fbc,dbc,ebc,cbc])}\nfunction Vc(a,b,c,d){return JD(c,54)?new Cg(a,b,c,d):new qg(a,b,c,d)}\nfunction Djc(){Ajc();return OC(GC(mV,1),Kie,411,0,[wjc,xjc,yjc,zjc])}\nfunction okc(a){var b;return a.j==(Ucd(),Rcd)&&(b=pkc(a),uqb(b,zcd))}\nfunction Mdc(a,b){var c;c=b.a;QZb(c,b.c.d);RZb(c,b.d.d);q7c(c.a,a.n)}\nfunction Smc(a,b){return BD(Btb(QAb(BD(Qc(a.k,b),15).Oc(),Hmc)),113)}\nfunction Tmc(a,b){return BD(Btb(RAb(BD(Qc(a.k,b),15).Oc(),Hmc)),113)}\nfunction _w(a){return new Kub(rmb(BD(a.a.dd(),14).gc(),a.a.cd()),16)}\nfunction Qq(a){if(JD(a,14)){return BD(a,14).dc()}return !a.Kc().Ob()}\nfunction ugc(a){qgc();if(JD(a.g,145)){return BD(a.g,145)}return null}\nfunction Ko(a){if(a.e.g!=a.b){throw vbb(new Apb)}return !!a.c&&a.d>0}\nfunction Xsb(a){sCb(a.b!=a.d.c);a.c=a.b;a.b=a.b.a;++a.a;return a.c.c}\nfunction Xjb(a,b){uCb(b);NC(a.a,a.c,b);a.c=a.c+1&a.a.length-1;_jb(a)}\nfunction Wjb(a,b){uCb(b);a.b=a.b-1&a.a.length-1;NC(a.a,a.b,b);_jb(a)}\nfunction A2c(a,b){var c;for(c=a.j.c.length;c0&&$fb(a.g,0,b,0,a.i);return b}\nfunction qEd(a,b){pEd();var c;c=BD(Ohb(oEd,a),55);return !c||c.wj(b)}\nfunction Twd(a){if(a.p!=1)throw vbb(new Ydb);return Tbb(a.f)<<24>>24}\nfunction axd(a){if(a.p!=1)throw vbb(new Ydb);return Tbb(a.k)<<24>>24}\nfunction gxd(a){if(a.p!=7)throw vbb(new Ydb);return Tbb(a.k)<<16>>16}\nfunction Zwd(a){if(a.p!=7)throw vbb(new Ydb);return Tbb(a.f)<<16>>16}\nfunction sr(a){var b;b=0;while(a.Ob()){a.Pb();b=wbb(b,1)}return Oy(b)}\nfunction nx(a,b){var c;c=new Vfb;a.xd(c);c.a+='..';b.yd(c);return c.a}\nfunction Sgc(a,b,c){var d;d=BD(Ohb(a.g,c),57);Ekb(a.a.c,new vgd(b,d))}\nfunction VCb(a,b,c){return Ddb(ED(Wd(irb(a.f,b))),ED(Wd(irb(a.f,c))))}\nfunction E2d(a,b,c){return F2d(a,b,c,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)}\nfunction L2d(a,b,c){return M2d(a,b,c,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)}\nfunction q3d(a,b,c){return r3d(a,b,c,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)}\nfunction JJc(a,b){return a==(j0b(),h0b)&&b==h0b?4:a==h0b||b==h0b?8:32}\nfunction Nd(a,b){return PD(b)===PD(a)?'(this Map)':b==null?Xhe:fcb(b)}\nfunction kFd(a,b){return BD(b==null?Wd(irb(a.f,null)):Crb(a.g,b),281)}\nfunction Rqd(a,b,c){var d;d=Wpd(c);Rhb(a.b,d,b);Rhb(a.c,b,c);return b}\nfunction Bfd(a,b){var c;c=b;while(c){O6c(a,c.i,c.j);c=Xod(c)}return a}\nfunction kt(a,b){var c;c=vmb(Nu(new wu(a,b)));ir(new wu(a,b));return c}\nfunction R6d(a,b){Q6d();var c;c=BD(a,66).Mj();kVd(c,b);return c.Ok(b)}\nfunction TOc(a,b,c,d,e){var f;f=OOc(e,c,d);Ekb(b,tOc(e,f));XOc(a,e,b)}\nfunction mic(a,b,c){a.i=0;a.e=0;if(b==c){return}lic(a,b,c);kic(a,b,c)}\nfunction dB(a,b){var c;c=a.q.getHours();a.q.setFullYear(b+nje);YA(a,c)}\nfunction dC(d,a,b){if(b){var c=b.ee();d.a[a]=c(b)}else{delete d.a[a]}}\nfunction vB(d,a,b){if(b){var c=b.ee();b=c(b)}else{b=undefined}d.a[a]=b}\nfunction pCb(a){if(a<0){throw vbb(new Feb('Negative array size: '+a))}}\nfunction VKd(a){if(!a.n){$Kd(a);a.n=new JMd(a,j5,a);_Kd(a)}return a.n}\nfunction Fqb(a){sCb(a.a=0&&a.a[c]===b[c];c--);return c<0}\nfunction Ucc(a,b){Occ();var c;c=a.j.g-b.j.g;if(c!=0){return c}return 0}\nfunction Dtb(a,b){uCb(b);if(a.a!=null){return Itb(b.Kb(a.a))}return ztb}\nfunction Gx(a){var b;if(a){return new Bsb(a)}b=new zsb;Jq(b,a);return b}\nfunction GAb(a,b){var c;return b.b.Kb(SAb(a,b.c.Ee(),(c=new TBb(b),c)))}\nfunction Hub(a){zub();Eub(this,Tbb(xbb(Obb(a,24),nke)),Tbb(xbb(a,nke)))}\nfunction REb(){REb=ccb;QEb=as((MEb(),OC(GC(aN,1),Kie,428,0,[LEb,KEb])))}\nfunction ZEb(){ZEb=ccb;YEb=as((UEb(),OC(GC(bN,1),Kie,427,0,[SEb,TEb])))}\nfunction aSb(){aSb=ccb;_Rb=as((XRb(),OC(GC(gP,1),Kie,424,0,[VRb,WRb])))}\nfunction D5b(){D5b=ccb;C5b=as((y5b(),OC(GC(ZR,1),Kie,511,0,[x5b,w5b])))}\nfunction Cqc(){Cqc=ccb;Bqc=as((xqc(),OC(GC(JW,1),Kie,419,0,[vqc,wqc])))}\nfunction erc(){erc=ccb;drc=as((_qc(),OC(GC(MW,1),Kie,479,0,[$qc,Zqc])))}\nfunction eBc(){eBc=ccb;dBc=as((_Ac(),OC(GC(fX,1),Kie,376,0,[$Ac,ZAc])))}\nfunction GAc(){GAc=ccb;FAc=as((BAc(),OC(GC(cX,1),Kie,421,0,[zAc,AAc])))}\nfunction Npc(){Npc=ccb;Mpc=as((Ipc(),OC(GC(FW,1),Kie,422,0,[Gpc,Hpc])))}\nfunction rsc(){rsc=ccb;qsc=as((msc(),OC(GC(SW,1),Kie,420,0,[ksc,lsc])))}\nfunction MOc(){MOc=ccb;LOc=as((HOc(),OC(GC(DZ,1),Kie,520,0,[GOc,FOc])))}\nfunction ZIc(){ZIc=ccb;YIc=as((UIc(),OC(GC(mY,1),Kie,523,0,[TIc,SIc])))}\nfunction bMc(){bMc=ccb;aMc=as((YLc(),OC(GC(fZ,1),Kie,516,0,[XLc,WLc])))}\nfunction jMc(){jMc=ccb;iMc=as((eMc(),OC(GC(gZ,1),Kie,515,0,[cMc,dMc])))}\nfunction KQc(){KQc=ccb;JQc=as((FQc(),OC(GC(YZ,1),Kie,455,0,[DQc,EQc])))}\nfunction dUc(){dUc=ccb;cUc=as(($Tc(),OC(GC(F$,1),Kie,425,0,[ZTc,YTc])))}\nfunction XUc(){XUc=ccb;WUc=as((PUc(),OC(GC(K$,1),Kie,495,0,[NUc,OUc])))}\nfunction XTc(){XTc=ccb;WTc=as((STc(),OC(GC(E$,1),Kie,480,0,[QTc,RTc])))}\nfunction lWc(){lWc=ccb;kWc=as((fWc(),OC(GC(X$,1),Kie,426,0,[dWc,eWc])))}\nfunction i1c(){i1c=ccb;h1c=as((a1c(),OC(GC(X_,1),Kie,429,0,[_0c,$0c])))}\nfunction H_c(){H_c=ccb;G_c=as((C_c(),OC(GC(P_,1),Kie,430,0,[B_c,A_c])))}\nfunction UIc(){UIc=ccb;TIc=new VIc('UPPER',0);SIc=new VIc('LOWER',1)}\nfunction Lqd(a,b){var c;c=new eC;Spd(c,'x',b.a);Spd(c,'y',b.b);Qpd(a,c)}\nfunction Oqd(a,b){var c;c=new eC;Spd(c,'x',b.a);Spd(c,'y',b.b);Qpd(a,c)}\nfunction Jic(a,b){var c,d;d=false;do{c=Mic(a,b);d=d|c}while(c);return d}\nfunction zHc(a,b){var c,d;c=b;d=0;while(c>0){d+=a.a[c];c-=c&-c}return d}\nfunction Cfd(a,b){var c;c=b;while(c){O6c(a,-c.i,-c.j);c=Xod(c)}return a}\nfunction reb(a,b){var c,d;uCb(b);for(d=a.Kc();d.Ob();){c=d.Pb();b.td(c)}}\nfunction me(a,b){var c;c=b.cd();return new Wo(c,a.e.pc(c,BD(b.dd(),14)))}\nfunction Gsb(a,b,c,d){var e;e=new jtb;e.c=b;e.b=c;e.a=d;d.b=c.a=e;++a.b}\nfunction Nkb(a,b,c){var d;d=(tCb(b,a.c.length),a.c[b]);a.c[b]=c;return d}\nfunction lFd(a,b,c){return BD(b==null?jrb(a.f,null,c):Drb(a.g,b,c),281)}\nfunction fRb(a){return !!a.c&&!!a.d?oRb(a.c)+'->'+oRb(a.d):'e_'+FCb(a)}\nfunction FAb(a,b){return (Uzb(a),WAb(new YAb(a,new qBb(b,a.a)))).sd(DAb)}\nfunction tUb(){qUb();return OC(GC(zP,1),Kie,356,0,[lUb,mUb,nUb,oUb,pUb])}\nfunction _cd(){Ucd();return OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])}\nfunction Dz(b){Az();return function(){return Ez(b,this,arguments);var a}}\nfunction sz(){if(Date.now){return Date.now()}return (new Date).getTime()}\nfunction OZb(a){if(!a.c||!a.d){return false}return !!a.c.i&&a.c.i==a.d.i}\nfunction pv(a){if(!a.c.Sb()){throw vbb(new utb)}a.a=true;return a.c.Ub()}\nfunction ko(a){a.i=0;Alb(a.b,null);Alb(a.c,null);a.a=null;a.e=null;++a.g}\nfunction ycb(a){wcb.call(this,a==null?Xhe:fcb(a),JD(a,78)?BD(a,78):null)}\nfunction PYb(a){MYb();yXb(this);this.a=new Psb;NYb(this,a);Dsb(this.a,a)}\nfunction jYb(){Ckb(this);this.b=new f7c(Pje,Pje);this.a=new f7c(Qje,Qje)}\nfunction rAb(a,b){this.c=0;this.b=b;jvb.call(this,a,17493);this.a=this.c}\nfunction wyb(a){oyb();if(lyb){return}this.c=a;this.e=true;this.a=new Rkb}\nfunction oyb(){oyb=ccb;lyb=true;jyb=false;kyb=false;nyb=false;myb=false}\nfunction C3c(a,b){if(JD(b,149)){return dfb(a.c,BD(b,149).c)}return false}\nfunction zUc(a,b){var c;c=0;!!a&&(c+=a.f.a/2);!!b&&(c+=b.f.a/2);return c}\nfunction j4c(a,b){var c;c=BD(Wrb(a.d,b),23);return c?c:BD(Wrb(a.e,b),23)}\nfunction Lzd(a){this.b=a;Fyd.call(this,a);this.a=BD(Ajd(this.b.a,4),126)}\nfunction Uzd(a){this.b=a;$yd.call(this,a);this.a=BD(Ajd(this.b.a,4),126)}\nfunction $Kd(a){if(!a.t){a.t=new YMd(a);vtd(new c0d(a),0,a.t)}return a.t}\nfunction kad(){ead();return OC(GC(t1,1),Kie,103,0,[cad,bad,aad,_9c,dad])}\nfunction Wbd(){Tbd();return OC(GC(C1,1),Kie,249,0,[Qbd,Sbd,Obd,Pbd,Rbd])}\nfunction Q5c(){N5c();return OC(GC(e1,1),Kie,175,0,[L5c,K5c,I5c,M5c,J5c])}\nfunction Q_c(){N_c();return OC(GC(Q_,1),Kie,316,0,[I_c,J_c,M_c,K_c,L_c])}\nfunction _zc(){Vzc();return OC(GC(_W,1),Kie,315,0,[Uzc,Rzc,Szc,Qzc,Tzc])}\nfunction sqc(){mqc();return OC(GC(IW,1),Kie,335,0,[iqc,hqc,kqc,lqc,jqc])}\nfunction n$c(){k$c();return OC(GC(y_,1),Kie,355,0,[g$c,f$c,i$c,h$c,j$c])}\nfunction _jc(){Xjc();return OC(GC(uV,1),Kie,363,0,[Tjc,Vjc,Wjc,Ujc,Sjc])}\nfunction Ftc(){Ctc();return OC(GC(TW,1),Kie,163,0,[Btc,xtc,ytc,ztc,Atc])}\nfunction T0d(){T0d=ccb;var a,b;R0d=(LFd(),b=new MPd,b);S0d=(a=new OJd,a)}\nfunction yUd(a){var b;if(!a.c){b=a.r;JD(b,88)&&(a.c=BD(b,26))}return a.c}\nfunction zc(a){a.e=3;a.d=a.Yb();if(a.e!=2){a.e=0;return true}return false}\nfunction RC(a){var b,c,d;b=a&Eje;c=a>>22&Eje;d=a<0?Fje:0;return TC(b,c,d)}\nfunction uy(a){var b,c,d,e;for(c=a,d=0,e=c.length;d0?ihb(a,b):lhb(a,-b)}\nfunction Rgb(a,b){if(b==0||a.e==0){return a}return b>0?lhb(a,b):ihb(a,-b)}\nfunction Rr(a){if(Qr(a)){a.c=a.a;return a.a.Pb()}else{throw vbb(new utb)}}\nfunction Yac(a){var b,c;b=a.c.i;c=a.d.i;return b.k==(j0b(),e0b)&&c.k==e0b}\nfunction kZb(a){var b;b=new UZb;tNb(b,a);yNb(b,(Nyc(),jxc),null);return b}\nfunction hid(a,b,c){var d;return d=a.Yg(b),d>=0?a._g(d,c,true):sid(a,b,c)}\nfunction uHb(a,b,c,d){var e;for(e=0;eb){throw vbb(new qcb(Jb(a,b,'index')))}return a}\nfunction zhb(a,b,c,d){var e;e=KC(WD,oje,25,b,15,1);Ahb(e,a,b,c,d);return e}\nfunction _A(a,b){var c;c=a.q.getHours()+(b/60|0);a.q.setMinutes(b);YA(a,c)}\nfunction A$c(a,b){return $wnd.Math.min(S6c(b.a,a.d.d.c),S6c(b.b,a.d.d.c))}\nfunction Thb(a,b){return ND(b)?b==null?krb(a.f,null):Erb(a.g,b):krb(a.f,b)}\nfunction b1b(a){this.c=a;this.a=new olb(this.c.a);this.b=new olb(this.c.b)}\nfunction kRb(){this.e=new Rkb;this.c=new Rkb;this.d=new Rkb;this.b=new Rkb}\nfunction MFb(){this.g=new PFb;this.b=new PFb;this.a=new Rkb;this.k=new Rkb}\nfunction Gjc(a,b,c){this.a=a;this.c=b;this.d=c;Ekb(b.e,this);Ekb(c.b,this)}\nfunction wBb(a,b){fvb.call(this,b.rd(),b.qd()&-6);uCb(a);this.a=a;this.b=b}\nfunction CBb(a,b){jvb.call(this,b.rd(),b.qd()&-6);uCb(a);this.a=a;this.b=b}\nfunction IBb(a,b){nvb.call(this,b.rd(),b.qd()&-6);uCb(a);this.a=a;this.b=b}\nfunction BQc(a,b,c){this.a=a;this.b=b;this.c=c;Ekb(a.t,this);Ekb(b.i,this)}\nfunction SRc(){this.b=new Psb;this.a=new Psb;this.b=new Psb;this.a=new Psb}\nfunction g6c(){g6c=ccb;f6c=new Lsd('org.eclipse.elk.labels.labelManager')}\nfunction Vac(){Vac=ccb;Uac=new Msd('separateLayerConnections',(gbc(),fbc))}\nfunction HOc(){HOc=ccb;GOc=new IOc('REGULAR',0);FOc=new IOc('CRITICAL',1)}\nfunction _Ac(){_Ac=ccb;$Ac=new aBc('STACKED',0);ZAc=new aBc('SEQUENCED',1)}\nfunction C_c(){C_c=ccb;B_c=new D_c('FIXED',0);A_c=new D_c('CENTER_NODE',1)}\nfunction PHc(a,b){var c;c=VHc(a,b);a.b=new BHc(c.c.length);return OHc(a,c)}\nfunction KAd(a,b,c){var d;++a.e;--a.f;d=BD(a.d[b].$c(c),133);return d.dd()}\nfunction JJd(a){var b;if(!a.a){b=a.r;JD(b,148)&&(a.a=BD(b,148))}return a.a}\nfunction poc(a){if(a.a){if(a.e){return poc(a.e)}}else{return a}return null}\nfunction ODc(a,b){if(a.pb.p){return -1}return 0}\nfunction pvb(a,b){uCb(b);if(a.c=0,'Initial capacity must not be negative')}\nfunction lHb(){lHb=ccb;kHb=as((gHb(),OC(GC(pN,1),Kie,232,0,[dHb,eHb,fHb])))}\nfunction SHb(){SHb=ccb;RHb=as((NHb(),OC(GC(sN,1),Kie,461,0,[LHb,KHb,MHb])))}\nfunction JIb(){JIb=ccb;IIb=as((EIb(),OC(GC(zN,1),Kie,462,0,[DIb,CIb,BIb])))}\nfunction Kyb(){Kyb=ccb;Jyb=as((Fyb(),OC(GC(xL,1),Kie,132,0,[Cyb,Dyb,Eyb])))}\nfunction DTb(){DTb=ccb;CTb=as((yTb(),OC(GC(oP,1),Kie,379,0,[wTb,vTb,xTb])))}\nfunction WXb(){WXb=ccb;VXb=as((RXb(),OC(GC(hQ,1),Kie,423,0,[QXb,PXb,OXb])))}\nfunction Zpc(){Zpc=ccb;Ypc=as((Rpc(),OC(GC(GW,1),Kie,314,0,[Ppc,Opc,Qpc])))}\nfunction gqc(){gqc=ccb;fqc=as((bqc(),OC(GC(HW,1),Kie,337,0,[$pc,aqc,_pc])))}\nfunction Lqc(){Lqc=ccb;Kqc=as((Gqc(),OC(GC(KW,1),Kie,450,0,[Eqc,Dqc,Fqc])))}\nfunction Kkc(){Kkc=ccb;Jkc=as((Fkc(),OC(GC(vV,1),Kie,361,0,[Ekc,Dkc,Ckc])))}\nfunction jsc(){jsc=ccb;isc=as((esc(),OC(GC(RW,1),Kie,303,0,[csc,dsc,bsc])))}\nfunction asc(){asc=ccb;_rc=as((Xrc(),OC(GC(QW,1),Kie,292,0,[Vrc,Wrc,Urc])))}\nfunction Dzc(){Dzc=ccb;Czc=as((xzc(),OC(GC(ZW,1),Kie,378,0,[uzc,vzc,wzc])))}\nfunction YAc(){YAc=ccb;XAc=as((TAc(),OC(GC(eX,1),Kie,375,0,[QAc,RAc,SAc])))}\nfunction yAc(){yAc=ccb;xAc=as((tAc(),OC(GC(bX,1),Kie,339,0,[rAc,qAc,sAc])))}\nfunction PAc(){PAc=ccb;OAc=as((KAc(),OC(GC(dX,1),Kie,452,0,[JAc,HAc,IAc])))}\nfunction QBc(){QBc=ccb;PBc=as((LBc(),OC(GC(jX,1),Kie,377,0,[JBc,KBc,IBc])))}\nfunction yBc(){yBc=ccb;xBc=as((tBc(),OC(GC(hX,1),Kie,336,0,[qBc,rBc,sBc])))}\nfunction HBc(){HBc=ccb;GBc=as((CBc(),OC(GC(iX,1),Kie,338,0,[BBc,zBc,ABc])))}\nfunction wGc(){wGc=ccb;vGc=as((rGc(),OC(GC(PX,1),Kie,454,0,[oGc,pGc,qGc])))}\nfunction zVc(){zVc=ccb;yVc=as((tVc(),OC(GC(O$,1),Kie,442,0,[sVc,qVc,rVc])))}\nfunction vWc(){vWc=ccb;uWc=as((pWc(),OC(GC(Y$,1),Kie,380,0,[mWc,nWc,oWc])))}\nfunction EYc(){EYc=ccb;DYc=as((zYc(),OC(GC(q_,1),Kie,381,0,[xYc,yYc,wYc])))}\nfunction yXc(){yXc=ccb;xXc=as((sXc(),OC(GC(b_,1),Kie,293,0,[qXc,rXc,pXc])))}\nfunction b_c(){b_c=ccb;a_c=as((Y$c(),OC(GC(J_,1),Kie,437,0,[V$c,W$c,X$c])))}\nfunction mbd(){mbd=ccb;lbd=as((hbd(),OC(GC(z1,1),Kie,334,0,[fbd,ebd,gbd])))}\nfunction vad(){vad=ccb;uad=as((qad(),OC(GC(u1,1),Kie,272,0,[nad,oad,pad])))}\nfunction icd(){dcd();return OC(GC(D1,1),Kie,98,0,[ccd,bcd,acd,Zbd,_bd,$bd])}\nfunction ikd(a,b){return !a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),qAd(a.o,b)}\nfunction NAd(a){!a.g&&(a.g=new JCd);!a.g.d&&(a.g.d=new MBd(a));return a.g.d}\nfunction yAd(a){!a.g&&(a.g=new JCd);!a.g.a&&(a.g.a=new SBd(a));return a.g.a}\nfunction EAd(a){!a.g&&(a.g=new JCd);!a.g.b&&(a.g.b=new GBd(a));return a.g.b}\nfunction FAd(a){!a.g&&(a.g=new JCd);!a.g.c&&(a.g.c=new iCd(a));return a.g.c}\nfunction A2d(a,b,c){var d,e;e=new p4d(b,a);for(d=0;dc||b=0?a._g(c,true,true):sid(a,b,true)}\nfunction s6b(a,b){return Kdb(Edb(ED(vNb(a,(wtc(),htc)))),Edb(ED(vNb(b,htc))))}\nfunction pUc(){pUc=ccb;oUc=b3c(b3c(g3c(new j3c,(yRc(),vRc)),(qSc(),pSc)),lSc)}\nfunction IHc(a,b,c){var d;d=SHc(a,b,c);a.b=new BHc(d.c.length);return KHc(a,d)}\nfunction qhe(a){if(a.b<=0)throw vbb(new utb);--a.b;a.a-=a.c.c;return meb(a.a)}\nfunction ptd(a){var b;if(!a.a){throw vbb(new vtb)}b=a.a;a.a=Xod(a.a);return b}\nfunction dBb(a){while(!a.a){if(!HBb(a.c,new hBb(a))){return false}}return true}\nfunction vr(a){var b;Qb(a);if(JD(a,198)){b=BD(a,198);return b}return new wr(a)}\nfunction r3c(a){p3c();BD(a.We((Y9c(),x9c)),174).Fc((rcd(),ocd));a.Ye(w9c,null)}\nfunction p3c(){p3c=ccb;m3c=new v3c;o3c=new x3c;n3c=mn((Y9c(),w9c),m3c,b9c,o3c)}\nfunction fWc(){fWc=ccb;dWc=new hWc('LEAF_NUMBER',0);eWc=new hWc('NODE_SIZE',1)}\nfunction UMc(a,b,c){a.a=b;a.c=c;a.b.a.$b();Osb(a.d);a.e.a.c=KC(SI,Uhe,1,0,5,1)}\nfunction yHc(a){a.a=KC(WD,oje,25,a.b+1,15,1);a.c=KC(WD,oje,25,a.b,15,1);a.d=0}\nfunction MWb(a,b){if(a.a.ue(b.d,a.b)>0){Ekb(a.c,new dWb(b.c,b.d,a.d));a.b=b.d}}\nfunction nud(a,b){if(a.g==null||b>=a.i)throw vbb(new $zd(b,a.i));return a.g[b]}\nfunction pOd(a,b,c){Itd(a,c);if(c!=null&&!a.wj(c)){throw vbb(new tcb)}return c}\nfunction KLd(a){var b;if(a.Ek()){for(b=a.i-1;b>=0;--b){qud(a,b)}}return wud(a)}\nfunction Bwb(a){var b,c;if(!a.b){return null}c=a.b;while(b=c.a[0]){c=b}return c}\nfunction ulb(a,b){var c,d;pCb(b);return c=(d=a.slice(0,b),PC(d,a)),c.length=b,c}\nfunction Klb(a,b,c,d){var e;d=(ipb(),!d?fpb:d);e=a.slice(b,c);Llb(e,a,b,c,-b,d)}\nfunction bid(a,b,c,d,e){return b<0?sid(a,c,d):BD(c,66).Nj().Pj(a,a.yh(),b,d,e)}\nfunction hZd(a){if(JD(a,172)){return ''+BD(a,172).a}return a==null?null:fcb(a)}\nfunction iZd(a){if(JD(a,172)){return ''+BD(a,172).a}return a==null?null:fcb(a)}\nfunction nDb(a,b){if(b.a){throw vbb(new hz(Hke))}Qqb(a.a,b);b.a=a;!a.j&&(a.j=b)}\nfunction qBb(a,b){nvb.call(this,b.rd(),b.qd()&-16449);uCb(a);this.a=a;this.c=b}\nfunction Ti(a,b){var c,d;d=b/a.c.Hd().gc()|0;c=b%a.c.Hd().gc();return Mi(a,d,c)}\nfunction NHb(){NHb=ccb;LHb=new OHb(jle,0);KHb=new OHb(gle,1);MHb=new OHb(kle,2)}\nfunction lxb(){lxb=ccb;hxb=new mxb('All',0);ixb=new rxb;jxb=new txb;kxb=new wxb}\nfunction zxb(){zxb=ccb;yxb=as((lxb(),OC(GC(iL,1),Kie,297,0,[hxb,ixb,jxb,kxb])))}\nfunction uWb(){uWb=ccb;tWb=as((lWb(),OC(GC(SP,1),Kie,405,0,[hWb,kWb,iWb,jWb])))}\nfunction ALb(){ALb=ccb;zLb=as((vLb(),OC(GC(PN,1),Kie,406,0,[uLb,rLb,sLb,tLb])))}\nfunction WMb(){WMb=ccb;VMb=as((RMb(),OC(GC(jO,1),Kie,323,0,[OMb,NMb,PMb,QMb])))}\nfunction WOb(){WOb=ccb;VOb=as((ROb(),OC(GC(CO,1),Kie,394,0,[OOb,NOb,POb,QOb])))}\nfunction GRc(){GRc=ccb;FRc=as((yRc(),OC(GC(h$,1),Kie,393,0,[uRc,vRc,wRc,xRc])))}\nfunction mbc(){mbc=ccb;lbc=as((gbc(),OC(GC(VS,1),Kie,360,0,[fbc,dbc,ebc,cbc])))}\nfunction oXc(){oXc=ccb;nXc=as((iXc(),OC(GC(a_,1),Kie,340,0,[hXc,fXc,gXc,eXc])))}\nfunction Fjc(){Fjc=ccb;Ejc=as((Ajc(),OC(GC(mV,1),Kie,411,0,[wjc,xjc,yjc,zjc])))}\nfunction Pzc(){Pzc=ccb;Ozc=as((Izc(),OC(GC($W,1),Kie,197,0,[Gzc,Hzc,Fzc,Ezc])))}\nfunction ugd(){ugd=ccb;tgd=as((pgd(),OC(GC(k2,1),Kie,396,0,[mgd,ngd,lgd,ogd])))}\nfunction xbd(){xbd=ccb;wbd=as((rbd(),OC(GC(A1,1),Kie,285,0,[qbd,nbd,obd,pbd])))}\nfunction Fad(){Fad=ccb;Ead=as((Aad(),OC(GC(v1,1),Kie,218,0,[zad,xad,wad,yad])))}\nfunction Ied(){Ied=ccb;Hed=as((Ded(),OC(GC(O1,1),Kie,311,0,[Ced,zed,Bed,Aed])))}\nfunction ydd(){ydd=ccb;xdd=as((tdd(),OC(GC(I1,1),Kie,374,0,[rdd,sdd,qdd,pdd])))}\nfunction A9d(){A9d=ccb;Smd();x9d=Pje;w9d=Qje;z9d=new Ndb(Pje);y9d=new Ndb(Qje)}\nfunction _qc(){_qc=ccb;$qc=new arc(ane,0);Zqc=new arc('IMPROVE_STRAIGHTNESS',1)}\nfunction eIc(a,b){FHc();return Ekb(a,new vgd(b,meb(b.e.c.length+b.g.c.length)))}\nfunction gIc(a,b){FHc();return Ekb(a,new vgd(b,meb(b.e.c.length+b.g.c.length)))}\nfunction PC(a,b){HC(b)!=10&&OC(rb(b),b.hm,b.__elementTypeId$,HC(b),a);return a}\nfunction Lkb(a,b){var c;c=Jkb(a,b,0);if(c==-1){return false}Kkb(a,c);return true}\nfunction Zrb(a,b){var c;c=BD(Thb(a.e,b),387);if(c){jsb(c);return c.e}return null}\nfunction Jbb(a){var b;if(Fbb(a)){b=0-a;if(!isNaN(b)){return b}}return zbb(hD(a))}\nfunction Jkb(a,b,c){for(;c=0?fid(a,c,true,true):sid(a,b,true)}\nfunction vgc(a,b){qgc();var c,d;c=ugc(a);d=ugc(b);return !!c&&!!d&&!omb(c.k,d.k)}\nfunction Gqd(a,b){dld(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))}\nfunction Hqd(a,b){eld(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))}\nfunction Iqd(a,b){cld(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))}\nfunction Jqd(a,b){ald(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))}\nfunction agd(a){(!this.q?(mmb(),mmb(),kmb):this.q).Ac(!a.q?(mmb(),mmb(),kmb):a.q)}\nfunction S2d(a,b){return JD(b,99)&&(BD(b,18).Bb&Tje)!=0?new s4d(b,a):new p4d(b,a)}\nfunction U2d(a,b){return JD(b,99)&&(BD(b,18).Bb&Tje)!=0?new s4d(b,a):new p4d(b,a)}\nfunction INb(a,b){HNb=new tOb;FNb=b;GNb=a;BD(GNb.b,65);KNb(GNb,HNb,null);JNb(GNb)}\nfunction uud(a,b,c){var d;d=a.g[b];mud(a,b,a.oi(b,c));a.gi(b,c,d);a.ci();return d}\nfunction Ftd(a,b){var c;c=a.Xc(b);if(c>=0){a.$c(c);return true}else{return false}}\nfunction YId(a){var b;if(a.d!=a.r){b=wId(a);a.e=!!b&&b.Cj()==Bve;a.d=b}return a.e}\nfunction fr(a,b){var c;Qb(a);Qb(b);c=false;while(b.Ob()){c=c|a.Fc(b.Pb())}return c}\nfunction Wrb(a,b){var c;c=BD(Ohb(a.e,b),387);if(c){Yrb(a,c);return c.e}return null}\nfunction UA(a){var b,c;b=a/60|0;c=a%60;if(c==0){return ''+b}return ''+b+':'+(''+c)}\nfunction LAb(a,b){var c,d;Uzb(a);d=new IBb(b,a.a);c=new fBb(d);return new YAb(a,c)}\nfunction tB(d,a){var b=d.a[a];var c=(rC(),qC)[typeof b];return c?c(b):xC(typeof b)}\nfunction yzc(a){switch(a.g){case 0:return Ohe;case 1:return -1;default:return 0;}}\nfunction oD(a){if(eD(a,(wD(),vD))<0){return -aD(hD(a))}return a.l+a.m*Hje+a.h*Ije}\nfunction HC(a){return a.__elementTypeCategory$==null?10:a.__elementTypeCategory$}\nfunction dub(a){var b;b=a.b.c.length==0?null:Ikb(a.b,0);b!=null&&fub(a,0);return b}\nfunction uA(a,b){while(b[0]=0){++b[0]}}\nfunction sgb(a,b){this.e=b;this.a=vgb(a);this.a<54?(this.f=Sbb(a)):(this.c=ghb(a))}\nfunction vge(a,b,c,d){wfe();xfe.call(this,26);this.c=a;this.a=b;this.d=c;this.b=d}\nfunction EA(a,b,c){var d,e;d=10;for(e=0;ea.a[d]&&(d=c)}return d}\nfunction fic(a,b){var c;c=Jy(a.e.c,b.e.c);if(c==0){return Kdb(a.e.d,b.e.d)}return c}\nfunction Ogb(a,b){if(b.e==0){return Ggb}if(a.e==0){return Ggb}return Dhb(),Ehb(a,b)}\nfunction nCb(a,b){if(!a){throw vbb(new Wdb(DCb('Enum constant undefined: %s',b)))}}\nfunction AWb(){AWb=ccb;xWb=new XWb;yWb=new _Wb;vWb=new dXb;wWb=new hXb;zWb=new lXb}\nfunction UEb(){UEb=ccb;SEb=new VEb('BY_SIZE',0);TEb=new VEb('BY_SIZE_AND_SHAPE',1)}\nfunction XRb(){XRb=ccb;VRb=new YRb('EADES',0);WRb=new YRb('FRUCHTERMAN_REINGOLD',1)}\nfunction xqc(){xqc=ccb;vqc=new yqc('READING_DIRECTION',0);wqc=new yqc('ROTATION',1)}\nfunction uqc(){uqc=ccb;tqc=as((mqc(),OC(GC(IW,1),Kie,335,0,[iqc,hqc,kqc,lqc,jqc])))}\nfunction bAc(){bAc=ccb;aAc=as((Vzc(),OC(GC(_W,1),Kie,315,0,[Uzc,Rzc,Szc,Qzc,Tzc])))}\nfunction bkc(){bkc=ccb;akc=as((Xjc(),OC(GC(uV,1),Kie,363,0,[Tjc,Vjc,Wjc,Ujc,Sjc])))}\nfunction Htc(){Htc=ccb;Gtc=as((Ctc(),OC(GC(TW,1),Kie,163,0,[Btc,xtc,ytc,ztc,Atc])))}\nfunction S_c(){S_c=ccb;R_c=as((N_c(),OC(GC(Q_,1),Kie,316,0,[I_c,J_c,M_c,K_c,L_c])))}\nfunction S5c(){S5c=ccb;R5c=as((N5c(),OC(GC(e1,1),Kie,175,0,[L5c,K5c,I5c,M5c,J5c])))}\nfunction p$c(){p$c=ccb;o$c=as((k$c(),OC(GC(y_,1),Kie,355,0,[g$c,f$c,i$c,h$c,j$c])))}\nfunction vUb(){vUb=ccb;uUb=as((qUb(),OC(GC(zP,1),Kie,356,0,[lUb,mUb,nUb,oUb,pUb])))}\nfunction mad(){mad=ccb;lad=as((ead(),OC(GC(t1,1),Kie,103,0,[cad,bad,aad,_9c,dad])))}\nfunction Ybd(){Ybd=ccb;Xbd=as((Tbd(),OC(GC(C1,1),Kie,249,0,[Qbd,Sbd,Obd,Pbd,Rbd])))}\nfunction cdd(){cdd=ccb;bdd=as((Ucd(),OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])))}\nfunction _1c(a,b){var c;c=BD(Ohb(a.a,b),134);if(!c){c=new zNb;Rhb(a.a,b,c)}return c}\nfunction hoc(a){var b;b=BD(vNb(a,(wtc(),usc)),305);if(b){return b.a==a}return false}\nfunction ioc(a){var b;b=BD(vNb(a,(wtc(),usc)),305);if(b){return b.i==a}return false}\nfunction Jub(a,b){uCb(b);Iub(a);if(a.d.Ob()){b.td(a.d.Pb());return true}return false}\nfunction Oy(a){if(ybb(a,Ohe)>0){return Ohe}if(ybb(a,Rie)<0){return Rie}return Tbb(a)}\nfunction Cv(a){if(a<3){Xj(a,Hie);return a+1}if(a=0&&b=-0.01&&a.a<=ple&&(a.a=0);a.b>=-0.01&&a.b<=ple&&(a.b=0);return a}\nfunction sfb(a,b){return b==(ntb(),ntb(),mtb)?a.toLocaleLowerCase():a.toLowerCase()}\nfunction idb(a){return ((a.i&2)!=0?'interface ':(a.i&1)!=0?'':'class ')+(fdb(a),a.o)}\nfunction Pnd(a){var b,c;c=(b=new SSd,b);wtd((!a.q&&(a.q=new cUd(n5,a,11,10)),a.q),c)}\nfunction Pdd(a,b){var c;c=b>0?b-1:b;return Vdd(Wdd(Xdd(Ydd(new Zdd,c),a.n),a.j),a.k)}\nfunction u2d(a,b,c,d){var e;a.j=-1;Qxd(a,I2d(a,b,c),(Q6d(),e=BD(b,66).Mj(),e.Ok(d)))}\nfunction VWb(a){this.g=a;this.f=new Rkb;this.a=$wnd.Math.min(this.g.c.c,this.g.d.c)}\nfunction mDb(a){this.b=new Rkb;this.a=new Rkb;this.c=new Rkb;this.d=new Rkb;this.e=a}\nfunction Cnc(a,b){this.a=new Lqb;this.e=new Lqb;this.b=(xzc(),wzc);this.c=a;this.b=b}\nfunction bIb(a,b,c){$Gb.call(this);THb(this);this.a=a;this.c=c;this.b=b.d;this.f=b.e}\nfunction yd(a){this.d=a;this.c=a.c.vc().Kc();this.b=null;this.a=null;this.e=(hs(),gs)}\nfunction zud(a){if(a<0){throw vbb(new Wdb('Illegal Capacity: '+a))}this.g=this.ri(a)}\nfunction avb(a,b){if(0>a||a>b){throw vbb(new scb('fromIndex: 0, toIndex: '+a+oke+b))}}\nfunction Gs(a){var b;if(a.a==a.b.a){throw vbb(new utb)}b=a.a;a.c=b;a.a=a.a.e;return b}\nfunction Zsb(a){var b;yCb(!!a.c);b=a.c.a;Nsb(a.d,a.c);a.b==a.c?(a.b=b):--a.a;a.c=null}\nfunction VAb(a,b){var c;Uzb(a);c=new lBb(a,a.a.rd(),a.a.qd()|4,b);return new YAb(a,c)}\nfunction ke(a,b){var c,d;c=BD(Hv(a.d,b),14);if(!c){return null}d=b;return a.e.pc(d,c)}\nfunction xac(a,b){var c,d;for(d=a.Kc();d.Ob();){c=BD(d.Pb(),70);yNb(c,(wtc(),Ssc),b)}}\nfunction t9b(a){var b;b=Edb(ED(vNb(a,(Nyc(),Zwc))));if(b<0){b=0;yNb(a,Zwc,b)}return b}\nfunction ifc(a,b,c){var d;d=$wnd.Math.max(0,a.b/2-0.5);cfc(c,d,1);Ekb(b,new rfc(c,d))}\nfunction NMc(a,b,c){var d;d=a.a.e[BD(b.a,10).p]-a.a.e[BD(c.a,10).p];return QD(Eeb(d))}\nfunction iZb(a,b,c,d,e,f){var g;g=kZb(d);QZb(g,e);RZb(g,f);Rc(a.a,d,new BZb(g,b,c.f))}\nfunction Bid(a,b){var c;c=YKd(a.Tg(),b);if(!c){throw vbb(new Wdb(ite+b+lte))}return c}\nfunction ntd(a,b){var c;c=a;while(Xod(c)){c=Xod(c);if(c==b){return true}}return false}\nfunction Uw(a,b){var c,d,e;d=b.a.cd();c=BD(b.a.dd(),14).gc();for(e=0;e0){a.a/=b;a.b/=b}return a}\nfunction bKd(a){var b;if(a.w){return a.w}else{b=cKd(a);!!b&&!b.kh()&&(a.w=b);return b}}\nfunction gZd(a){var b;if(a==null){return null}else{b=BD(a,190);return Umd(b,b.length)}}\nfunction qud(a,b){if(a.g==null||b>=a.i)throw vbb(new $zd(b,a.i));return a.li(b,a.g[b])}\nfunction Mmc(a){var b,c;b=a.a.d.j;c=a.c.d.j;while(b!=c){rqb(a.b,b);b=Xcd(b)}rqb(a.b,b)}\nfunction Jmc(a){var b;for(b=0;b=14&&b<=16)));return a}\nfunction dcb(a,b,c){var d=function(){return a.apply(d,arguments)};b.apply(d,c);return d}\nfunction TLc(a,b,c){var d,e;d=b;do{e=Edb(a.p[d.p])+c;a.p[d.p]=e;d=a.a[d.p]}while(d!=b)}\nfunction NQd(a,b){var c,d;d=a.a;c=OQd(a,b,null);d!=b&&!a.e&&(c=QQd(a,b,c));!!c&&c.Fi()}\nfunction ADb(a,b){return Iy(),My(Qie),$wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)}\nfunction Ky(a,b){Iy();My(Qie);return $wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)}\nfunction Akc(a,b){gkc();return beb(a.b.c.length-a.e.c.length,b.b.c.length-b.e.c.length)}\nfunction oo(a,b){return Kv(uo(a,b,Tbb(Ibb(Eie,keb(Tbb(Ibb(b==null?0:tb(b),Fie)),15)))))}\nfunction o0b(){o0b=ccb;n0b=as((j0b(),OC(GC(NQ,1),Kie,267,0,[h0b,g0b,e0b,i0b,f0b,d0b])))}\nfunction n8c(){n8c=ccb;m8c=as((i8c(),OC(GC(r1,1),Kie,291,0,[h8c,g8c,f8c,d8c,c8c,e8c])))}\nfunction K7c(){K7c=ccb;J7c=as((F7c(),OC(GC(o1,1),Kie,248,0,[z7c,C7c,D7c,E7c,A7c,B7c])))}\nfunction Fpc(){Fpc=ccb;Epc=as((Apc(),OC(GC(EW,1),Kie,227,0,[wpc,ypc,vpc,xpc,zpc,upc])))}\nfunction Drc(){Drc=ccb;Crc=as((yrc(),OC(GC(OW,1),Kie,275,0,[wrc,trc,xrc,vrc,urc,rrc])))}\nfunction qrc(){qrc=ccb;prc=as((lrc(),OC(GC(NW,1),Kie,274,0,[irc,hrc,krc,grc,jrc,frc])))}\nfunction tzc(){tzc=ccb;szc=as((lzc(),OC(GC(YW,1),Kie,313,0,[jzc,hzc,fzc,gzc,kzc,izc])))}\nfunction Yqc(){Yqc=ccb;Xqc=as((Sqc(),OC(GC(LW,1),Kie,276,0,[Nqc,Mqc,Pqc,Oqc,Rqc,Qqc])))}\nfunction wSc(){wSc=ccb;vSc=as((qSc(),OC(GC(t$,1),Kie,327,0,[pSc,lSc,nSc,mSc,oSc,kSc])))}\nfunction ycd(){ycd=ccb;xcd=as((rcd(),OC(GC(E1,1),Kie,273,0,[pcd,ncd,ocd,mcd,lcd,qcd])))}\nfunction Rad(){Rad=ccb;Qad=as((Mad(),OC(GC(w1,1),Kie,312,0,[Kad,Iad,Lad,Gad,Jad,Had])))}\nfunction Lbd(){Hbd();return OC(GC(B1,1),Kie,93,0,[zbd,ybd,Bbd,Gbd,Fbd,Ebd,Cbd,Dbd,Abd])}\nfunction vkd(a,b){var c;c=a.a;a.a=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,0,c,a.a))}\nfunction wkd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,1,c,a.b))}\nfunction hmd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,3,c,a.b))}\nfunction ald(a,b){var c;c=a.f;a.f=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,3,c,a.f))}\nfunction cld(a,b){var c;c=a.g;a.g=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,4,c,a.g))}\nfunction dld(a,b){var c;c=a.i;a.i=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,5,c,a.i))}\nfunction eld(a,b){var c;c=a.j;a.j=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,6,c,a.j))}\nfunction omd(a,b){var c;c=a.j;a.j=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,1,c,a.j))}\nfunction imd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,4,c,a.c))}\nfunction pmd(a,b){var c;c=a.k;a.k=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,2,c,a.k))}\nfunction qQd(a,b){var c;c=a.d;a.d=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new mSd(a,2,c,a.d))}\nfunction AId(a,b){var c;c=a.s;a.s=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new mSd(a,4,c,a.s))}\nfunction DId(a,b){var c;c=a.t;a.t=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new mSd(a,5,c,a.t))}\nfunction _Jd(a,b){var c;c=a.F;a.F=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,5,c,b))}\nfunction izd(a,b){var c;c=BD(Ohb((pEd(),oEd),a),55);return c?c.xj(b):KC(SI,Uhe,1,b,5,1)}\nfunction Xpd(a,b){var c,d;c=b in a.a;if(c){d=aC(a,b).he();if(d){return d.a}}return null}\nfunction ftd(a,b){var c,d,e;c=(d=(Fhd(),e=new Jod,e),!!b&&God(d,b),d);Hod(c,a);return c}\nfunction LLd(a,b,c){Itd(a,c);if(!a.Bk()&&c!=null&&!a.wj(c)){throw vbb(new tcb)}return c}\nfunction Xdd(a,b){a.n=b;if(a.n){a.f=new Rkb;a.e=new Rkb}else{a.f=null;a.e=null}return a}\nfunction ndb(a,b,c,d,e,f){var g;g=ldb(a,b);zdb(c,g);g.i=e?8:0;g.f=d;g.e=e;g.g=f;return g}\nfunction rSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=1;this.c=a;this.a=c}\nfunction tSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=2;this.c=a;this.a=c}\nfunction BSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=6;this.c=a;this.a=c}\nfunction GSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=7;this.c=a;this.a=c}\nfunction xSd(a,b,c,d,e){this.d=b;this.j=d;this.e=e;this.o=-1;this.p=4;this.c=a;this.a=c}\nfunction rDb(a,b){var c,d,e,f;for(d=b,e=0,f=d.length;e=0);if(ekb(a.d,a.c)<0){a.a=a.a-1&a.d.a.length-1;a.b=a.d.c}a.c=-1}\nfunction pgb(a){if(a.a<54){return a.f<0?-1:a.f>0?1:0}return (!a.c&&(a.c=fhb(a.f)),a.c).e}\nfunction My(a){if(!(a>=0)){throw vbb(new Wdb('tolerance ('+a+') must be >= 0'))}return a}\nfunction n4c(){if(!f4c){f4c=new m4c;l4c(f4c,OC(GC(C0,1),Uhe,130,0,[new Z9c]))}return f4c}\nfunction KAc(){KAc=ccb;JAc=new LAc(ole,0);HAc=new LAc('INPUT',1);IAc=new LAc('OUTPUT',2)}\nfunction bqc(){bqc=ccb;$pc=new cqc('ARD',0);aqc=new cqc('MSD',1);_pc=new cqc('MANUAL',2)}\nfunction rGc(){rGc=ccb;oGc=new sGc('BARYCENTER',0);pGc=new sGc(Bne,1);qGc=new sGc(Cne,2)}\nfunction ztd(a,b){var c;c=a.gc();if(b<0||b>c)throw vbb(new Cyd(b,c));return new czd(a,b)}\nfunction JAd(a,b){var c;if(JD(b,42)){return a.c.Mc(b)}else{c=qAd(a,b);LAd(a,b);return c}}\nfunction $nd(a,b,c){yId(a,b);pnd(a,c);AId(a,0);DId(a,1);CId(a,true);BId(a,true);return a}\nfunction Xj(a,b){if(a<0){throw vbb(new Wdb(b+' cannot be negative but was: '+a))}return a}\nfunction Bt(a,b){var c,d;for(c=0,d=a.gc();c0){return BD(Ikb(c.a,d-1),10)}return null}\nfunction Lkd(a,b){var c;c=a.k;a.k=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,2,c,a.k))}\nfunction kmd(a,b){var c;c=a.f;a.f=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,8,c,a.f))}\nfunction lmd(a,b){var c;c=a.i;a.i=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,7,c,a.i))}\nfunction Hod(a,b){var c;c=a.a;a.a=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,8,c,a.a))}\nfunction zpd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,0,c,a.b))}\nfunction UUd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,0,c,a.b))}\nfunction VUd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,1,c,a.c))}\nfunction Apd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,1,c,a.c))}\nfunction pQd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,4,c,a.c))}\nfunction PHd(a,b){var c;c=a.d;a.d=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,1,c,a.d))}\nfunction jKd(a,b){var c;c=a.D;a.D=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,2,c,a.D))}\nfunction Rdd(a,b){if(a.r>0&&a.c0&&a.g!=0&&Rdd(a.i,b/a.r*a.i.d)}}\nfunction dge(a,b,c){var d;a.b=b;a.a=c;d=(a.a&512)==512?new hee:new ude;a.c=ode(d,a.b,a.a)}\nfunction g3d(a,b){return T6d(a.e,b)?(Q6d(),YId(b)?new R7d(b,a):new f7d(b,a)):new c8d(b,a)}\nfunction _o(a,b){return Fv(vo(a.a,b,Tbb(Ibb(Eie,keb(Tbb(Ibb(b==null?0:tb(b),Fie)),15)))))}\nfunction Nyb(a,b,c){return Ayb(a,new Kzb(b),new Mzb,new Ozb(c),OC(GC(xL,1),Kie,132,0,[]))}\nfunction pAb(a){var b,c;if(0>a){return new yAb}b=a+1;c=new rAb(b,a);return new vAb(null,c)}\nfunction umb(a,b){mmb();var c;c=new Mqb(1);ND(a)?Shb(c,a,b):jrb(c.f,a,b);return new iob(c)}\nfunction aMb(a,b){var c,d;c=a.o+a.p;d=b.o+b.p;if(cb){b<<=1;return b>0?b:Iie}return b}\nfunction xc(a){Ub(a.e!=3);switch(a.e){case 2:return false;case 0:return true;}return zc(a)}\nfunction T6c(a,b){var c;if(JD(b,8)){c=BD(b,8);return a.a==c.a&&a.b==c.b}else{return false}}\nfunction _Mb(a,b,c){var d,e,f;f=b>>5;e=b&31;d=xbb(Pbb(a.n[c][f],Tbb(Nbb(e,1))),3);return d}\nfunction IAd(a,b){var c,d;for(d=b.vc().Kc();d.Ob();){c=BD(d.Pb(),42);HAd(a,c.cd(),c.dd())}}\nfunction N1c(a,b){var c;c=new tOb;BD(b.b,65);BD(b.b,65);BD(b.b,65);Hkb(b.a,new T1c(a,c,b))}\nfunction DUd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,21,c,a.b))}\nfunction jmd(a,b){var c;c=a.d;a.d=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,11,c,a.d))}\nfunction _Id(a,b){var c;c=a.j;a.j=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,13,c,a.j))}\nfunction $jb(a,b,c){var d,e,f;f=a.a.length-1;for(e=a.b,d=0;d>>31}d!=0&&(a[c]=d)}\nfunction rmb(a,b){mmb();var c,d;d=new Rkb;for(c=0;c0){this.g=this.ri(this.i+(this.i/8|0)+1);a.Qc(this.g)}}\nfunction u3d(a,b){k2d.call(this,D9,a,b);this.b=this;this.a=S6d(a.Tg(),XKd(this.e.Tg(),this.c))}\nfunction Ld(a,b){var c,d;uCb(b);for(d=b.vc().Kc();d.Ob();){c=BD(d.Pb(),42);a.zc(c.cd(),c.dd())}}\nfunction G2d(a,b,c){var d;for(d=c.Kc();d.Ob();){if(!E2d(a,b,d.Pb())){return false}}return true}\nfunction sVd(a,b,c,d,e){var f;if(c){f=bLd(b.Tg(),a.c);e=c.gh(b,-1-(f==-1?d:f),null,e)}return e}\nfunction tVd(a,b,c,d,e){var f;if(c){f=bLd(b.Tg(),a.c);e=c.ih(b,-1-(f==-1?d:f),null,e)}return e}\nfunction Mgb(a){var b;if(a.b==-2){if(a.e==0){b=-1}else{for(b=0;a.a[b]==0;b++);}a.b=b}return a.b}\nfunction Z4b(a){switch(a.g){case 2:return Ucd(),Tcd;case 4:return Ucd(),zcd;default:return a;}}\nfunction $4b(a){switch(a.g){case 1:return Ucd(),Rcd;case 3:return Ucd(),Acd;default:return a;}}\nfunction nkc(a){var b,c,d;return a.j==(Ucd(),Acd)&&(b=pkc(a),c=uqb(b,zcd),d=uqb(b,Tcd),d||d&&c)}\nfunction oqb(a){var b,c;b=BD(a.e&&a.e(),9);c=BD(ZBb(b,b.length),9);return new xqb(b,c,b.length)}\nfunction l7b(a,b){Odd(b,zne,1);UGb(TGb(new YGb((a$b(),new l$b(a,false,false,new T$b)))));Qdd(b)}\nfunction Fcb(a,b){Bcb();return ND(a)?cfb(a,GD(b)):LD(a)?Ddb(a,ED(b)):KD(a)?Dcb(a,DD(b)):a.wd(b)}\nfunction WZc(a,b){b.q=a;a.d=$wnd.Math.max(a.d,b.r);a.b+=b.d+(a.a.c.length==0?0:a.c);Ekb(a.a,b)}\nfunction m6c(a,b){var c,d,e,f;e=a.c;c=a.c+a.b;f=a.d;d=a.d+a.a;return b.a>e&&b.af&&b.b1||a.Ob()){++a.a;a.g=0;b=a.i;a.Ob();return b}else{throw vbb(new utb)}}\nfunction kNc(a){fNc();var b;if(!Lpb(eNc,a)){b=new hNc;b.a=a;Opb(eNc,a,b)}return BD(Mpb(eNc,a),635)}\nfunction Rbb(a){var b,c,d,e;e=a;d=0;if(e<0){e+=Ije;d=Fje}c=QD(e/Hje);b=QD(e-c*Hje);return TC(b,c,d)}\nfunction Ox(a){var b,c,d;d=0;for(c=new Gqb(a.a);c.a>22);e=a.h+b.h+(d>>22);return TC(c&Eje,d&Eje,e&Fje)}\nfunction nD(a,b){var c,d,e;c=a.l-b.l;d=a.m-b.m+(c>>22);e=a.h-b.h+(d>>22);return TC(c&Eje,d&Eje,e&Fje)}\nfunction bdb(a){var b;if(a<128){b=(ddb(),cdb)[a];!b&&(b=cdb[a]=new Xcb(a));return b}return new Xcb(a)}\nfunction ubb(a){var b;if(JD(a,78)){return a}b=a&&a.__java$exception;if(!b){b=new lz(a);Sz(b)}return b}\nfunction btd(a){if(JD(a,186)){return BD(a,118)}else if(!a){throw vbb(new Heb(gue))}else{return null}}\nfunction Zjb(a,b){if(b==null){return false}while(a.a!=a.b){if(pb(b,vkb(a))){return true}}return false}\nfunction kib(a){if(a.a.Ob()){return true}if(a.a!=a.d){return false}a.a=new orb(a.e.f);return a.a.Ob()}\nfunction Gkb(a,b){var c,d;c=b.Pc();d=c.length;if(d==0){return false}bCb(a.c,a.c.length,c);return true}\nfunction Vyb(a,b,c){var d,e;for(e=b.vc().Kc();e.Ob();){d=BD(e.Pb(),42);a.yc(d.cd(),d.dd(),c)}return a}\nfunction yac(a,b){var c,d;for(d=new olb(a.b);d.a=0,'Negative initial capacity');mCb(b>=0,'Non-positive load factor');Uhb(this)}\nfunction _Ed(a,b,c){if(a>=128)return false;return a<64?Kbb(xbb(Nbb(1,a),c),0):Kbb(xbb(Nbb(1,a-64),b),0)}\nfunction bOb(a,b){if(!a||!b||a==b){return false}return Jy(a.b.c,b.b.c+b.b.b)<0&&Jy(b.b.c,a.b.c+a.b.b)<0}\nfunction I4b(a){var b,c,d;c=a.n;d=a.o;b=a.d;return new J6c(c.a-b.b,c.b-b.d,d.a+(b.b+b.c),d.b+(b.d+b.a))}\nfunction $ic(a){var b,c,d,e;for(c=a.a,d=0,e=c.length;dd)throw vbb(new Cyd(b,d));a.hi()&&(c=Dtd(a,c));return a.Vh(b,c)}\nfunction xNb(a,b,c){return c==null?(!a.q&&(a.q=new Lqb),Thb(a.q,b)):(!a.q&&(a.q=new Lqb),Rhb(a.q,b,c)),a}\nfunction yNb(a,b,c){c==null?(!a.q&&(a.q=new Lqb),Thb(a.q,b)):(!a.q&&(a.q=new Lqb),Rhb(a.q,b,c));return a}\nfunction TQb(a){var b,c;c=new kRb;tNb(c,a);yNb(c,(HSb(),FSb),a);b=new Lqb;VQb(a,c,b);UQb(a,c,b);return c}\nfunction j6c(a){i6c();var b,c,d;c=KC(m1,nie,8,2,0,1);d=0;for(b=0;b<2;b++){d+=0.5;c[b]=r6c(d,a)}return c}\nfunction Mic(a,b){var c,d,e,f;c=false;d=a.a[b].length;for(f=0;f>=1);return b}}\nfunction $C(a){var b,c;c=heb(a.h);if(c==32){b=heb(a.m);return b==32?heb(a.l)+32:b+20-10}else{return c-12}}\nfunction bkb(a){var b;b=a.a[a.b];if(b==null){return null}NC(a.a,a.b,null);a.b=a.b+1&a.a.length-1;return b}\nfunction EDc(a){var b,c;b=a.t-a.k[a.o.p]*a.d+a.j[a.o.p]>a.f;c=a.u+a.e[a.o.p]*a.d>a.f*a.s*a.d;return b||c}\nfunction Iwb(a,b,c){var d,e;d=new exb(b,c);e=new fxb;a.b=Gwb(a,a.b,d,e);e.b||++a.c;a.b.b=false;return e.d}\nfunction djc(a,b,c){var d,e,f,g;g=CHc(b,c);f=0;for(e=g.Kc();e.Ob();){d=BD(e.Pb(),11);Rhb(a.c,d,meb(f++))}}\nfunction xVb(a){var b,c;for(c=new olb(a.a.b);c.ac&&(c=a[b])}return c}\nfunction SHc(a,b,c){var d;d=new Rkb;UHc(a,b,d,(Ucd(),zcd),true,false);UHc(a,c,d,Tcd,false,false);return d}\nfunction crd(a,b,c){var d,e,f,g;f=null;g=b;e=Ypd(g,'labels');d=new Hrd(a,c);f=(Dqd(d.a,d.b,e),e);return f}\nfunction j1d(a,b,c,d){var e;e=r1d(a,b,c,d);if(!e){e=i1d(a,c,d);if(!!e&&!e1d(a,b,e)){return null}}return e}\nfunction m1d(a,b,c,d){var e;e=s1d(a,b,c,d);if(!e){e=l1d(a,c,d);if(!!e&&!e1d(a,b,e)){return null}}return e}\nfunction Xb(a,b){var c;for(c=0;c1||b>=0&&a.b<3}\nfunction w7c(a){var b,c,d;b=new s7c;for(d=Jsb(a,0);d.b!=d.d.c;){c=BD(Xsb(d),8);St(b,0,new g7c(c))}return b}\nfunction qVb(a){var b,c;for(c=new olb(a.a.b);c.ad?1:0}\nfunction NYb(a,b){if(OYb(a,b)){Rc(a.b,BD(vNb(b,(wtc(),Esc)),21),b);Dsb(a.a,b);return true}else{return false}}\nfunction d3b(a){var b,c;b=BD(vNb(a,(wtc(),gtc)),10);if(b){c=b.c;Lkb(c.a,b);c.a.c.length==0&&Lkb(Q_b(b).b,c)}}\nfunction syb(a){if(lyb){return KC(qL,tke,572,0,0,1)}return BD(Qkb(a.a,KC(qL,tke,572,a.a.c.length,0,1)),842)}\nfunction mn(a,b,c,d){Vm();return new wx(OC(GC(CK,1),zie,42,0,[(Wj(a,b),new Wo(a,b)),(Wj(c,d),new Wo(c,d))]))}\nfunction Dnd(a,b,c){var d,e;e=(d=new SSd,d);$nd(e,b,c);wtd((!a.q&&(a.q=new cUd(n5,a,11,10)),a.q),e);return e}\nfunction Zmd(a){var b,c,d,e;e=icb(Rmd,a);c=e.length;d=KC(ZI,nie,2,c,6,1);for(b=0;b=a.b.c.length){return}aub(a,2*b+1);c=2*b+2;c=0&&a[d]===b[d];d--);return d<0?0:Gbb(xbb(a[d],Yje),xbb(b[d],Yje))?-1:1}\nfunction UFc(a,b){var c,d;for(d=Jsb(a,0);d.b!=d.d.c;){c=BD(Xsb(d),214);if(c.e.length>0){b.td(c);c.i&&_Fc(c)}}}\nfunction nzd(a,b){var c,d;d=BD(Ajd(a.a,4),126);c=KC($3,hve,415,b,0,1);d!=null&&$fb(d,0,c,0,d.length);return c}\nfunction JEd(a,b){var c;c=new NEd((a.f&256)!=0,a.i,a.a,a.d,(a.f&16)!=0,a.j,a.g,b);a.e!=null||(c.c=a);return c}\nfunction Dc(a,b){var c,d;for(d=a.Zb().Cc().Kc();d.Ob();){c=BD(d.Pb(),14);if(c.Hc(b)){return true}}return false}\nfunction oNb(a,b,c,d,e){var f,g;for(g=c;g<=e;g++){for(f=b;f<=d;f++){if(YMb(a,f,g)){return true}}}return false}\nfunction Tt(a,b,c){var d,e,f,g;uCb(c);g=false;f=a.Zc(b);for(e=c.Kc();e.Ob();){d=e.Pb();f.Rb(d);g=true}return g}\nfunction Dv(a,b){var c;if(a===b){return true}else if(JD(b,83)){c=BD(b,83);return Ax(Wm(a),c.vc())}return false}\nfunction Nhb(a,b,c){var d,e;for(e=c.Kc();e.Ob();){d=BD(e.Pb(),42);if(a.re(b,d.dd())){return true}}return false}\nfunction Hic(a,b,c){if(!a.d[b.p][c.p]){Gic(a,b,c);a.d[b.p][c.p]=true;a.d[c.p][b.p]=true}return a.a[b.p][c.p]}\nfunction Itd(a,b){if(!a.ai()&&b==null){throw vbb(new Wdb(\"The 'no null' constraint is violated\"))}return b}\nfunction $Jd(a,b){if(a.D==null&&a.B!=null){a.D=a.B;a.B=null}jKd(a,b==null?null:(uCb(b),b));!!a.C&&a.yk(null)}\nfunction XHc(a,b){var c;if(!a||a==b||!wNb(b,(wtc(),Psc))){return false}c=BD(vNb(b,(wtc(),Psc)),10);return c!=a}\nfunction b4d(a){switch(a.i){case 2:{return true}case 1:{return false}case -1:{++a.c}default:{return a.pl()}}}\nfunction c4d(a){switch(a.i){case -2:{return true}case -1:{return false}case 1:{--a.c}default:{return a.ql()}}}\nfunction Xdb(a){Zy.call(this,'The given string does not match the expected format for individual spacings.',a)}\nfunction pgd(){pgd=ccb;mgd=new qgd('ELK',0);ngd=new qgd('JSON',1);lgd=new qgd('DOT',2);ogd=new qgd('SVG',3)}\nfunction pWc(){pWc=ccb;mWc=new rWc(ane,0);nWc=new rWc('RADIAL_COMPACTION',1);oWc=new rWc('WEDGE_COMPACTION',2)}\nfunction Fyb(){Fyb=ccb;Cyb=new Gyb('CONCURRENT',0);Dyb=new Gyb('IDENTITY_FINISH',1);Eyb=new Gyb('UNORDERED',2)}\nfunction nPb(){nPb=ccb;kPb=(cPb(),bPb);jPb=new Nsd(Tle,kPb);iPb=new Lsd(Ule);lPb=new Lsd(Vle);mPb=new Lsd(Wle)}\nfunction Occ(){Occ=ccb;Mcc=new Zcc;Ncc=new _cc;Lcc=new bdc;Kcc=new fdc;Jcc=new jdc;Icc=(uCb(Jcc),new bpb)}\nfunction tBc(){tBc=ccb;qBc=new uBc('CONSERVATIVE',0);rBc=new uBc('CONSERVATIVE_SOFT',1);sBc=new uBc('SLOPPY',2)}\nfunction Zad(){Zad=ccb;Xad=new q0b(15);Wad=new Osd((Y9c(),f9c),Xad);Yad=C9c;Sad=s8c;Tad=Y8c;Vad=_8c;Uad=$8c}\nfunction o7c(a,b,c){var d,e,f;d=new Psb;for(f=Jsb(c,0);f.b!=f.d.c;){e=BD(Xsb(f),8);Dsb(d,new g7c(e))}Tt(a,b,d)}\nfunction r7c(a){var b,c,d;b=0;d=KC(m1,nie,8,a.b,0,1);c=Jsb(a,0);while(c.b!=c.d.c){d[b++]=BD(Xsb(c),8)}return d}\nfunction $Pd(a){var b;b=(!a.a&&(a.a=new cUd(g5,a,9,5)),a.a);if(b.i!=0){return nQd(BD(qud(b,0),678))}return null}\nfunction Ly(a,b){var c;c=wbb(a,b);if(Gbb(Vbb(a,b),0)|Ebb(Vbb(a,c),0)){return c}return wbb(rie,Vbb(Pbb(c,63),1))}\nfunction Yyc(a,b){var c;c=Ksd((dzc(),bzc))!=null&&b.wg()!=null?Edb(ED(b.wg()))/Edb(ED(Ksd(bzc))):1;Rhb(a.b,b,c)}\nfunction le(a,b){var c,d;c=BD(a.d.Bc(b),14);if(!c){return null}d=a.e.hc();d.Gc(c);a.e.d-=c.gc();c.$b();return d}\nfunction AHc(a,b){var c,d;d=a.c[b];if(d==0){return}a.c[b]=0;a.d-=d;c=b+1;while(c0){return _vb(b-1,a.a.c.length),Kkb(a.a,b-1)}else{throw vbb(new Jpb)}}\nfunction C2c(a,b,c){if(b<0){throw vbb(new qcb(ese+b))}if(bb){throw vbb(new Wdb(xke+a+yke+b))}if(a<0||b>c){throw vbb(new scb(xke+a+zke+b+oke+c))}}\nfunction j5c(a){if(!a.a||(a.a.i&8)==0){throw vbb(new Zdb('Enumeration class expected for layout option '+a.f))}}\nfunction vud(a){var b;++a.j;if(a.i==0){a.g=null}else if(a.iRqe?a-c>Rqe:c-a>Rqe}\nfunction pHb(a,b){if(!a){return 0}if(b&&!a.j){return 0}if(JD(a,124)){if(BD(a,124).a.b==0){return 0}}return a.Re()}\nfunction qHb(a,b){if(!a){return 0}if(b&&!a.k){return 0}if(JD(a,124)){if(BD(a,124).a.a==0){return 0}}return a.Se()}\nfunction fhb(a){Hgb();if(a<0){if(a!=-1){return new Tgb(-1,-a)}return Bgb}else return a<=10?Dgb[QD(a)]:new Tgb(1,a)}\nfunction xC(a){rC();throw vbb(new MB(\"Unexpected typeof result '\"+a+\"'; please report this bug to the GWT team\"))}\nfunction lz(a){jz();Py(this);Ry(this);this.e=a;Sy(this,a);this.g=a==null?Xhe:fcb(a);this.a='';this.b=a;this.a=''}\nfunction F$c(){this.a=new G$c;this.f=new I$c(this);this.b=new K$c(this);this.i=new M$c(this);this.e=new O$c(this)}\nfunction ss(){rs.call(this,new _rb(Cv(16)));Xj(2,mie);this.b=2;this.a=new Ms(null,null,0,null);As(this.a,this.a)}\nfunction xzc(){xzc=ccb;uzc=new zzc('DUMMY_NODE_OVER',0);vzc=new zzc('DUMMY_NODE_UNDER',1);wzc=new zzc('EQUAL',2)}\nfunction LUb(){LUb=ccb;JUb=Fx(OC(GC(t1,1),Kie,103,0,[(ead(),aad),bad]));KUb=Fx(OC(GC(t1,1),Kie,103,0,[dad,_9c]))}\nfunction VQc(a){return (Ucd(),Lcd).Hc(a.j)?Edb(ED(vNb(a,(wtc(),qtc)))):l7c(OC(GC(m1,1),nie,8,0,[a.i.n,a.n,a.a])).b}\nfunction DOb(a){var b,c,d,e;d=a.b.a;for(c=d.a.ec().Kc();c.Ob();){b=BD(c.Pb(),561);e=new MPb(b,a.e,a.f);Ekb(a.g,e)}}\nfunction yId(a,b){var c,d,e;d=a.nk(b,null);e=null;if(b){e=(LFd(),c=new UQd,c);NQd(e,a.r)}d=xId(a,e,d);!!d&&d.Fi()}\nfunction VFc(a,b){var c,d;d=Cub(a.d,1)!=0;c=true;while(c){c=false;c=b.c.Tf(b.e,d);c=c|dGc(a,b,d,false);d=!d}$Fc(a)}\nfunction wZc(a,b){var c,d,e;d=false;c=b.q.d;if(b.de){$Zc(b.q,e);d=c!=b.q.d}}return d}\nfunction PVc(a,b){var c,d,e,f,g,h,i,j;i=b.i;j=b.j;d=a.f;e=d.i;f=d.j;g=i-e;h=j-f;c=$wnd.Math.sqrt(g*g+h*h);return c}\nfunction Rnd(a,b){var c,d;d=jid(a);if(!d){!And&&(And=new lUd);c=(IEd(),PEd(b));d=new s0d(c);wtd(d.Vk(),a)}return d}\nfunction Sc(a,b){var c,d;c=BD(a.c.Bc(b),14);if(!c){return a.jc()}d=a.hc();d.Gc(c);a.d-=c.gc();c.$b();return a.mc(d)}\nfunction j7c(a,b){var c;for(c=0;c=a.c.b:a.a<=a.c.b)){throw vbb(new utb)}b=a.a;a.a+=a.c.c;++a.b;return meb(b)}\nfunction BWb(a){var b;b=new VWb(a);rXb(a.a,zWb,new amb(OC(GC(bQ,1),Uhe,369,0,[b])));!!b.d&&Ekb(b.f,b.d);return b.f}\nfunction Z1b(a){var b;b=new q_b(a.a);tNb(b,a);yNb(b,(wtc(),$sc),a);b.o.a=a.g;b.o.b=a.f;b.n.a=a.i;b.n.b=a.j;return b}\nfunction A9b(a,b,c,d){var e,f;for(f=a.Kc();f.Ob();){e=BD(f.Pb(),70);e.n.a=b.a+(d.a-e.o.a)/2;e.n.b=b.b;b.b+=e.o.b+c}}\nfunction UDb(a,b,c){var d,e;for(e=b.a.a.ec().Kc();e.Ob();){d=BD(e.Pb(),57);if(VDb(a,d,c)){return true}}return false}\nfunction JDc(a){var b,c;for(c=new olb(a.r);c.a=0?b:-b;while(d>0){if(d%2==0){c*=c;d=d/2|0}else{e*=c;d-=1}}return b<0?1/e:e}\nfunction y6c(a,b){var c,d,e;e=1;c=a;d=b>=0?b:-b;while(d>0){if(d%2==0){c*=c;d=d/2|0}else{e*=c;d-=1}}return b<0?1/e:e}\nfunction sAd(a){var b,c,d,e;if(a!=null){for(c=0;c0){c=BD(Ikb(a.a,a.a.c.length-1),570);if(NYb(c,b)){return}}Ekb(a.a,new PYb(b))}\nfunction $gc(a){Hgc();var b,c;b=a.d.c-a.e.c;c=BD(a.g,145);Hkb(c.b,new shc(b));Hkb(c.c,new uhc(b));reb(c.i,new whc(b))}\nfunction gic(a){var b;b=new Ufb;b.a+='VerticalSegment ';Pfb(b,a.e);b.a+=' ';Qfb(b,Eb(new Gb,new olb(a.k)));return b.a}\nfunction u4c(a){var b;b=BD(Wrb(a.c.c,''),229);if(!b){b=new W3c(d4c(c4c(new e4c,''),'Other'));Xrb(a.c.c,'',b)}return b}\nfunction qnd(a){var b;if((a.Db&64)!=0)return Eid(a);b=new Jfb(Eid(a));b.a+=' (name: ';Efb(b,a.zb);b.a+=')';return b.a}\nfunction Jnd(a,b,c){var d,e;e=a.sb;a.sb=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,4,e,b);!c?(c=d):c.Ei(d)}return c}\nfunction _ic(a,b){var c,d,e;c=0;for(e=V_b(a,b).Kc();e.Ob();){d=BD(e.Pb(),11);c+=vNb(d,(wtc(),gtc))!=null?1:0}return c}\nfunction vPc(a,b,c){var d,e,f;d=0;for(f=Jsb(a,0);f.b!=f.d.c;){e=Edb(ED(Xsb(f)));if(e>c){break}else e>=b&&++d}return d}\nfunction RTd(a,b,c){var d,e;d=new pSd(a.e,3,13,null,(e=b.c,e?e:(jGd(),YFd)),HLd(a,b),false);!c?(c=d):c.Ei(d);return c}\nfunction STd(a,b,c){var d,e;d=new pSd(a.e,4,13,(e=b.c,e?e:(jGd(),YFd)),null,HLd(a,b),false);!c?(c=d):c.Ei(d);return c}\nfunction zId(a,b,c){var d,e;e=a.r;a.r=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,8,e,a.r);!c?(c=d):c.Ei(d)}return c}\nfunction o1d(a,b){var c,d;c=BD(b,676);d=c.vk();!d&&c.wk(d=JD(b,88)?new C1d(a,BD(b,26)):new O1d(a,BD(b,148)));return d}\nfunction kud(a,b,c){var d;a.qi(a.i+1);d=a.oi(b,c);b!=a.i&&$fb(a.g,b,a.g,b+1,a.i-b);NC(a.g,b,d);++a.i;a.bi(b,c);a.ci()}\nfunction vwb(a,b){var c;if(b.a){c=b.a.a.length;!a.a?(a.a=new Wfb(a.d)):Qfb(a.a,a.b);Ofb(a.a,b.a,b.d.length,c)}return a}\nfunction __d(a,b){var c,d,e,f;b.vi(a.a);f=BD(Ajd(a.a,8),1936);if(f!=null){for(c=f,d=0,e=c.length;dc){throw vbb(new qcb(xke+a+zke+b+', size: '+c))}if(a>b){throw vbb(new Wdb(xke+a+yke+b))}}\nfunction eid(a,b,c){if(b<0){vid(a,c)}else{if(!c.Ij()){throw vbb(new Wdb(ite+c.ne()+jte))}BD(c,66).Nj().Vj(a,a.yh(),b)}}\nfunction Jlb(a,b,c,d,e,f,g,h){var i;i=c;while(f=d||b=65&&a<=70){return a-65+10}if(a>=97&&a<=102){return a-97+10}if(a>=48&&a<=57){return a-48}return 0}\nfunction QHd(a){var b;if((a.Db&64)!=0)return Eid(a);b=new Jfb(Eid(a));b.a+=' (source: ';Efb(b,a.d);b.a+=')';return b.a}\nfunction OQd(a,b,c){var d,e;e=a.a;a.a=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,5,e,a.a);!c?(c=d):Qwd(c,d)}return c}\nfunction BId(a,b){var c;c=(a.Bb&256)!=0;b?(a.Bb|=256):(a.Bb&=-257);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,2,c,b))}\nfunction eLd(a,b){var c;c=(a.Bb&256)!=0;b?(a.Bb|=256):(a.Bb&=-257);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,8,c,b))}\nfunction LPd(a,b){var c;c=(a.Bb&256)!=0;b?(a.Bb|=256):(a.Bb&=-257);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,8,c,b))}\nfunction CId(a,b){var c;c=(a.Bb&512)!=0;b?(a.Bb|=512):(a.Bb&=-513);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,3,c,b))}\nfunction fLd(a,b){var c;c=(a.Bb&512)!=0;b?(a.Bb|=512):(a.Bb&=-513);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,9,c,b))}\nfunction N7d(a,b){var c;if(a.b==-1&&!!a.a){c=a.a.Gj();a.b=!c?bLd(a.c.Tg(),a.a):a.c.Xg(a.a.aj(),c)}return a.c.Og(a.b,b)}\nfunction meb(a){var b,c;if(a>-129&&a<128){b=a+128;c=(oeb(),neb)[b];!c&&(c=neb[b]=new _db(a));return c}return new _db(a)}\nfunction Web(a){var b,c;if(a>-129&&a<128){b=a+128;c=(Yeb(),Xeb)[b];!c&&(c=Xeb[b]=new Qeb(a));return c}return new Qeb(a)}\nfunction L5b(a){var b,c;b=a.k;if(b==(j0b(),e0b)){c=BD(vNb(a,(wtc(),Hsc)),61);return c==(Ucd(),Acd)||c==Rcd}return false}\nfunction i1d(a,b,c){var d,e,f;f=(e=nUd(a.b,b),e);if(f){d=BD(V1d(p1d(a,f),''),26);if(d){return r1d(a,d,b,c)}}return null}\nfunction l1d(a,b,c){var d,e,f;f=(e=nUd(a.b,b),e);if(f){d=BD(V1d(p1d(a,f),''),26);if(d){return s1d(a,d,b,c)}}return null}\nfunction cTd(a,b){var c,d;for(d=new Fyd(a);d.e!=d.i.gc();){c=BD(Dyd(d),138);if(PD(b)===PD(c)){return true}}return false}\nfunction vtd(a,b,c){var d;d=a.gc();if(b>d)throw vbb(new Cyd(b,d));if(a.hi()&&a.Hc(c)){throw vbb(new Wdb(kue))}a.Xh(b,c)}\nfunction iqd(a,b){var c;c=oo(a.i,b);if(c==null){throw vbb(new cqd('Node did not exist in input.'))}Yqd(b,c);return null}\nfunction $hd(a,b){var c;c=YKd(a,b);if(JD(c,322)){return BD(c,34)}throw vbb(new Wdb(ite+b+\"' is not a valid attribute\"))}\nfunction V2d(a,b,c){var d,e;e=JD(b,99)&&(BD(b,18).Bb&Tje)!=0?new s4d(b,a):new p4d(b,a);for(d=0;db){return 1}if(a==b){return a==0?Kdb(1/a,1/b):0}return isNaN(a)?isNaN(b)?0:1:-1}\nfunction f4b(a,b){Odd(b,'Sort end labels',1);MAb(JAb(LAb(new YAb(null,new Kub(a.b,16)),new q4b),new s4b),new u4b);Qdd(b)}\nfunction Wxd(a,b,c){var d,e;if(a.ej()){e=a.fj();d=sud(a,b,c);a.$i(a.Zi(7,meb(c),d,b,e));return d}else{return sud(a,b,c)}}\nfunction vAd(a,b){var c,d,e;if(a.d==null){++a.e;--a.f}else{e=b.cd();c=b.Sh();d=(c&Ohe)%a.d.length;KAd(a,d,xAd(a,d,c,e))}}\nfunction ZId(a,b){var c;c=(a.Bb&zte)!=0;b?(a.Bb|=zte):(a.Bb&=-1025);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,10,c,b))}\nfunction dJd(a,b){var c;c=(a.Bb&Rje)!=0;b?(a.Bb|=Rje):(a.Bb&=-4097);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,12,c,b))}\nfunction eJd(a,b){var c;c=(a.Bb&Cve)!=0;b?(a.Bb|=Cve):(a.Bb&=-8193);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,15,c,b))}\nfunction fJd(a,b){var c;c=(a.Bb&Dve)!=0;b?(a.Bb|=Dve):(a.Bb&=-2049);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,11,c,b))}\nfunction jOb(a,b){var c;c=Kdb(a.b.c,b.b.c);if(c!=0){return c}c=Kdb(a.a.a,b.a.a);if(c!=0){return c}return Kdb(a.a.b,b.a.b)}\nfunction jqd(a,b){var c;c=Ohb(a.k,b);if(c==null){throw vbb(new cqd('Port did not exist in input.'))}Yqd(b,c);return null}\nfunction k6d(a){var b,c;for(c=l6d(bKd(a)).Kc();c.Ob();){b=GD(c.Pb());if(Dmd(a,b)){return uFd((tFd(),sFd),b)}}return null}\nfunction n3d(a,b){var c,d,e,f,g;g=S6d(a.e.Tg(),b);f=0;c=BD(a.g,119);for(e=0;e>10)+Uje&aje;b[1]=(a&1023)+56320&aje;return zfb(b,0,b.length)}\nfunction a_b(a){var b,c;c=BD(vNb(a,(Nyc(),Lwc)),103);if(c==(ead(),cad)){b=Edb(ED(vNb(a,owc)));return b>=1?bad:_9c}return c}\nfunction rec(a){switch(BD(vNb(a,(Nyc(),Swc)),218).g){case 1:return new Fmc;case 3:return new wnc;default:return new zmc;}}\nfunction Uzb(a){if(a.c){Uzb(a.c)}else if(a.d){throw vbb(new Zdb(\"Stream already terminated, can't be modified or used\"))}}\nfunction Mkd(a){var b;if((a.Db&64)!=0)return Eid(a);b=new Jfb(Eid(a));b.a+=' (identifier: ';Efb(b,a.k);b.a+=')';return b.a}\nfunction ctd(a,b,c){var d,e;d=(Fhd(),e=new xkd,e);vkd(d,b);wkd(d,c);!!a&&wtd((!a.a&&(a.a=new xMd(y2,a,5)),a.a),d);return d}\nfunction ttb(a,b,c,d){var e,f;uCb(d);uCb(c);e=a.xc(b);f=e==null?c:Myb(BD(e,15),BD(c,14));f==null?a.Bc(b):a.zc(b,f);return f}\nfunction pqb(a){var b,c,d,e;c=(b=BD(gdb((d=a.gm,e=d.f,e==CI?d:e)),9),new xqb(b,BD(_Bb(b,b.length),9),0));rqb(c,a);return c}\nfunction hDc(a,b,c){var d,e;for(e=a.a.ec().Kc();e.Ob();){d=BD(e.Pb(),10);if(Be(c,BD(Ikb(b,d.p),14))){return d}}return null}\nfunction Db(b,c,d){var e;try{Cb(b,c,d)}catch(a){a=ubb(a);if(JD(a,597)){e=a;throw vbb(new ycb(e))}else throw vbb(a)}return c}\nfunction Qbb(a,b){var c;if(Fbb(a)&&Fbb(b)){c=a-b;if(Kje>1;a.k=c-1>>1}\nfunction Gub(){zub();var a,b,c;c=yub+++Date.now();a=QD($wnd.Math.floor(c*lke))&nke;b=QD(c-a*mke);this.a=a^1502;this.b=b^kke}\nfunction O_b(a){var b,c,d;b=new Rkb;for(d=new olb(a.j);d.a3.4028234663852886E38){return Pje}else if(b<-3.4028234663852886E38){return Qje}return b}\nfunction aeb(a){a-=a>>1&1431655765;a=(a>>2&858993459)+(a&858993459);a=(a>>4)+a&252645135;a+=a>>8;a+=a>>16;return a&63}\nfunction Ev(a){var b,c,d,e;b=new cq(a.Hd().gc());e=0;for(d=vr(a.Hd().Kc());d.Ob();){c=d.Pb();bq(b,c,meb(e++))}return fn(b.a)}\nfunction Uyb(a,b){var c,d,e;e=new Lqb;for(d=b.vc().Kc();d.Ob();){c=BD(d.Pb(),42);Rhb(e,c.cd(),Yyb(a,BD(c.dd(),15)))}return e}\nfunction EZc(a,b){a.n.c.length==0&&Ekb(a.n,new VZc(a.s,a.t,a.i));Ekb(a.b,b);QZc(BD(Ikb(a.n,a.n.c.length-1),211),b);GZc(a,b)}\nfunction LFb(a){if(a.c!=a.b.b||a.i!=a.g.b){a.a.c=KC(SI,Uhe,1,0,5,1);Gkb(a.a,a.b);Gkb(a.a,a.g);a.c=a.b.b;a.i=a.g.b}return a.a}\nfunction Ycc(a,b){var c,d,e;e=0;for(d=BD(b.Kb(a),20).Kc();d.Ob();){c=BD(d.Pb(),17);Ccb(DD(vNb(c,(wtc(),ltc))))||++e}return e}\nfunction efc(a,b){var c,d,e;d=tgc(b);e=Edb(ED(pBc(d,(Nyc(),lyc))));c=$wnd.Math.max(0,e/2-0.5);cfc(b,c,1);Ekb(a,new Dfc(b,c))}\nfunction Ctc(){Ctc=ccb;Btc=new Dtc(ane,0);xtc=new Dtc('FIRST',1);ytc=new Dtc(Gne,2);ztc=new Dtc('LAST',3);Atc=new Dtc(Hne,4)}\nfunction Aad(){Aad=ccb;zad=new Bad(ole,0);xad=new Bad('POLYLINE',1);wad=new Bad('ORTHOGONAL',2);yad=new Bad('SPLINES',3)}\nfunction zYc(){zYc=ccb;xYc=new AYc('ASPECT_RATIO_DRIVEN',0);yYc=new AYc('MAX_SCALE_DRIVEN',1);wYc=new AYc('AREA_DRIVEN',2)}\nfunction Y$c(){Y$c=ccb;V$c=new Z$c('P1_STRUCTURE',0);W$c=new Z$c('P2_PROCESSING_ORDER',1);X$c=new Z$c('P3_EXECUTION',2)}\nfunction tVc(){tVc=ccb;sVc=new uVc('OVERLAP_REMOVAL',0);qVc=new uVc('COMPACTION',1);rVc=new uVc('GRAPH_SIZE_CALCULATION',2)}\nfunction Jy(a,b){Iy();return My(Qie),$wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b))}\nfunction yOc(a,b){var c,d;c=Jsb(a,0);while(c.b!=c.d.c){d=Gdb(ED(Xsb(c)));if(d==b){return}else if(d>b){Ysb(c);break}}Vsb(c,b)}\nfunction t4c(a,b){var c,d,e,f,g;c=b.f;Xrb(a.c.d,c,b);if(b.g!=null){for(e=b.g,f=0,g=e.length;fb&&d.ue(a[f-1],a[f])>0;--f){g=a[f];NC(a,f,a[f-1]);NC(a,f-1,g)}}}\nfunction did(a,b,c,d){if(b<0){uid(a,c,d)}else{if(!c.Ij()){throw vbb(new Wdb(ite+c.ne()+jte))}BD(c,66).Nj().Tj(a,a.yh(),b,d)}}\nfunction xFb(a,b){if(b==a.d){return a.e}else if(b==a.e){return a.d}else{throw vbb(new Wdb('Node '+b+' not part of edge '+a))}}\nfunction iEb(a,b){switch(b.g){case 2:return a.b;case 1:return a.c;case 4:return a.d;case 3:return a.a;default:return false;}}\nfunction GVb(a,b){switch(b.g){case 2:return a.b;case 1:return a.c;case 4:return a.d;case 3:return a.a;default:return false;}}\nfunction Xkd(a,b,c,d){switch(b){case 3:return a.f;case 4:return a.g;case 5:return a.i;case 6:return a.j;}return Ekd(a,b,c,d)}\nfunction Ljc(a){if(a.k!=(j0b(),h0b)){return false}return FAb(new YAb(null,new Lub(new Sr(ur(U_b(a).a.Kc(),new Sq)))),new Mjc)}\nfunction MEd(a){if(a.e==null){return a}else !a.c&&(a.c=new NEd((a.f&256)!=0,a.i,a.a,a.d,(a.f&16)!=0,a.j,a.g,null));return a.c}\nfunction VC(a,b){if(a.h==Gje&&a.m==0&&a.l==0){b&&(QC=TC(0,0,0));return SC((wD(),uD))}b&&(QC=TC(a.l,a.m,a.h));return TC(0,0,0)}\nfunction fcb(a){var b;if(Array.isArray(a)&&a.im===gcb){return hdb(rb(a))+'@'+(b=tb(a)>>>0,b.toString(16))}return a.toString()}\nfunction Rpb(a){var b;this.a=(b=BD(a.e&&a.e(),9),new xqb(b,BD(_Bb(b,b.length),9),0));this.b=KC(SI,Uhe,1,this.a.a.length,5,1)}\nfunction _Ob(a){var b,c,d;this.a=new zsb;for(d=new olb(a);d.a0&&(BCb(b-1,a.length),a.charCodeAt(b-1)==58)&&!OEd(a,CEd,DEd)}\nfunction OEd(a,b,c){var d,e;for(d=0,e=a.length;d=e){return b.c+c}}return b.c+b.b.gc()}\nfunction NCd(a,b){LCd();var c,d,e,f;d=KLd(a);e=b;Klb(d,0,d.length,e);for(c=0;c0){d+=e;++c}}c>1&&(d+=a.d*(c-1));return d}\nfunction Htd(a){var b,c,d;d=new Hfb;d.a+='[';for(b=0,c=a.gc();b0&&this.b>0&&q$c(this.c,this.b,this.a)}\nfunction ezc(a){dzc();this.c=Ou(OC(GC(h0,1),Uhe,831,0,[Uyc]));this.b=new Lqb;this.a=a;Rhb(this.b,bzc,1);Hkb(czc,new Xed(this))}\nfunction I2c(a,b){var c;if(a.d){if(Mhb(a.b,b)){return BD(Ohb(a.b,b),51)}else{c=b.Kf();Rhb(a.b,b,c);return c}}else{return b.Kf()}}\nfunction Kgb(a,b){var c;if(PD(a)===PD(b)){return true}if(JD(b,91)){c=BD(b,91);return a.e==c.e&&a.d==c.d&&Lgb(a,c.a)}return false}\nfunction Zcd(a){Ucd();switch(a.g){case 4:return Acd;case 1:return zcd;case 3:return Rcd;case 2:return Tcd;default:return Scd;}}\nfunction Ykd(a,b){switch(b){case 3:return a.f!=0;case 4:return a.g!=0;case 5:return a.i!=0;case 6:return a.j!=0;}return Hkd(a,b)}\nfunction gWc(a){switch(a.g){case 0:return new FXc;case 1:return new IXc;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}}\nfunction QUc(a){switch(a.g){case 0:return new CXc;case 1:return new MXc;default:throw vbb(new Wdb(Dne+(a.f!=null?a.f:''+a.g)));}}\nfunction b1c(a){switch(a.g){case 0:return new s1c;case 1:return new w1c;default:throw vbb(new Wdb(Mre+(a.f!=null?a.f:''+a.g)));}}\nfunction qWc(a){switch(a.g){case 1:return new SVc;case 2:return new KVc;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}}\nfunction ryb(a){var b,c;if(a.b){return a.b}c=lyb?null:a.d;while(c){b=lyb?null:c.b;if(b){return b}c=lyb?null:c.d}return $xb(),Zxb}\nfunction hhb(a){var b,c,d;if(a.e==0){return 0}b=a.d<<5;c=a.a[a.d-1];if(a.e<0){d=Mgb(a);if(d==a.d-1){--c;c=c|0}}b-=heb(c);return b}\nfunction bhb(a){var b,c,d;if(a>5;b=a&31;d=KC(WD,oje,25,c+1,15,1);d[c]=1<3){e*=10;--f}a=(a+(e>>1))/e|0}d.i=a;return true}\nfunction XUb(a){LUb();return Bcb(),GVb(BD(a.a,81).j,BD(a.b,103))||BD(a.a,81).d.e!=0&&GVb(BD(a.a,81).j,BD(a.b,103))?true:false}\nfunction s3c(a){p3c();if(BD(a.We((Y9c(),b9c)),174).Hc((Idd(),Gdd))){BD(a.We(x9c),174).Fc((rcd(),qcd));BD(a.We(b9c),174).Mc(Gdd)}}\nfunction Gxd(a,b){var c,d;if(!b){return false}else{for(c=0;c=0;--d){b=c[d];for(e=0;e>1;this.k=b-1>>1}\nfunction r3b(a,b){Odd(b,'End label post-processing',1);MAb(JAb(LAb(new YAb(null,new Kub(a.b,16)),new w3b),new y3b),new A3b);Qdd(b)}\nfunction NLc(a,b,c){var d,e;d=Edb(a.p[b.i.p])+Edb(a.d[b.i.p])+b.n.b+b.a.b;e=Edb(a.p[c.i.p])+Edb(a.d[c.i.p])+c.n.b+c.a.b;return e-d}\nfunction xhb(a,b,c){var d,e;d=xbb(c,Yje);for(e=0;ybb(d,0)!=0&&e0&&(BCb(0,b.length),b.charCodeAt(0)==43)?b.substr(1):b))}\nfunction T9d(a){var b;return a==null?null:new Ygb((b=Qge(a,true),b.length>0&&(BCb(0,b.length),b.charCodeAt(0)==43)?b.substr(1):b))}\nfunction xud(a,b){var c;if(a.i>0){if(b.lengtha.i&&NC(b,a.i,null);return b}\nfunction Sxd(a,b,c){var d,e,f;if(a.ej()){d=a.i;f=a.fj();kud(a,d,b);e=a.Zi(3,null,b,d,f);!c?(c=e):c.Ei(e)}else{kud(a,a.i,b)}return c}\nfunction HMd(a,b,c){var d,e;d=new pSd(a.e,4,10,(e=b.c,JD(e,88)?BD(e,26):(jGd(),_Fd)),null,HLd(a,b),false);!c?(c=d):c.Ei(d);return c}\nfunction GMd(a,b,c){var d,e;d=new pSd(a.e,3,10,null,(e=b.c,JD(e,88)?BD(e,26):(jGd(),_Fd)),HLd(a,b),false);!c?(c=d):c.Ei(d);return c}\nfunction _Jb(a){$Jb();var b;b=new g7c(BD(a.e.We((Y9c(),_8c)),8));if(a.B.Hc((Idd(),Bdd))){b.a<=0&&(b.a=20);b.b<=0&&(b.b=20)}return b}\nfunction Lzc(a){Izc();var b;(!a.q?(mmb(),mmb(),kmb):a.q)._b((Nyc(),Cxc))?(b=BD(vNb(a,Cxc),197)):(b=BD(vNb(Q_b(a),Dxc),197));return b}\nfunction pBc(a,b){var c,d;d=null;if(wNb(a,(Nyc(),qyc))){c=BD(vNb(a,qyc),94);c.Xe(b)&&(d=c.We(b))}d==null&&(d=vNb(Q_b(a),b));return d}\nfunction Ze(a,b){var c,d,e;if(JD(b,42)){c=BD(b,42);d=c.cd();e=Hv(a.Rc(),d);return Hb(e,c.dd())&&(e!=null||a.Rc()._b(d))}return false}\nfunction qAd(a,b){var c,d,e;if(a.f>0){a.qj();d=b==null?0:tb(b);e=(d&Ohe)%a.d.length;c=xAd(a,e,d,b);return c!=-1}else{return false}}\nfunction AAd(a,b){var c,d,e;if(a.f>0){a.qj();d=b==null?0:tb(b);e=(d&Ohe)%a.d.length;c=wAd(a,e,d,b);if(c){return c.dd()}}return null}\nfunction R2d(a,b){var c,d,e,f;f=S6d(a.e.Tg(),b);c=BD(a.g,119);for(e=0;e1?Mbb(Nbb(b.a[1],32),xbb(b.a[0],Yje)):xbb(b.a[0],Yje),Sbb(Ibb(b.e,c))))}\nfunction Hbb(a,b){var c;if(Fbb(a)&&Fbb(b)){c=a%b;if(Kje>5;b&=31;e=a.d+c+(b==0?0:1);d=KC(WD,oje,25,e,15,1);jhb(d,a.a,c,b);f=new Vgb(a.e,e,d);Jgb(f);return f}\nfunction Ofe(a,b,c){var d,e;d=BD(Phb(Zee,b),117);e=BD(Phb($ee,b),117);if(c){Shb(Zee,a,d);Shb($ee,a,e)}else{Shb($ee,a,d);Shb(Zee,a,e)}}\nfunction Cwb(a,b,c){var d,e,f;e=null;f=a.b;while(f){d=a.a.ue(b,f.d);if(c&&d==0){return f}if(d>=0){f=f.a[1]}else{e=f;f=f.a[0]}}return e}\nfunction Dwb(a,b,c){var d,e,f;e=null;f=a.b;while(f){d=a.a.ue(b,f.d);if(c&&d==0){return f}if(d<=0){f=f.a[0]}else{e=f;f=f.a[1]}}return e}\nfunction Nic(a,b,c,d){var e,f,g;e=false;if(fjc(a.f,c,d)){ijc(a.f,a.a[b][c],a.a[b][d]);f=a.a[b];g=f[d];f[d]=f[c];f[c]=g;e=true}return e}\nfunction QHc(a,b,c,d,e){var f,g,h;g=e;while(b.b!=b.c){f=BD(fkb(b),10);h=BD(V_b(f,d).Xb(0),11);a.d[h.p]=g++;c.c[c.c.length]=h}return g}\nfunction hBc(a,b,c){var d,e,f,g,h;g=a.k;h=b.k;d=c[g.g][h.g];e=ED(pBc(a,d));f=ED(pBc(b,d));return $wnd.Math.max((uCb(e),e),(uCb(f),f))}\nfunction zZc(a,b,c){var d,e,f,g;d=c/a.c.length;e=0;for(g=new olb(a);g.a2000){yz=a;zz=$wnd.setTimeout(Iz,10)}}if(xz++==0){Lz((Kz(),Jz));return true}return false}\nfunction wCc(a,b){var c,d,e;for(d=new Sr(ur(U_b(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),17);e=c.d.i;if(e.c==b){return false}}return true}\nfunction Ek(b,c){var d,e;if(JD(c,245)){e=BD(c,245);try{d=b.vd(e);return d==0}catch(a){a=ubb(a);if(!JD(a,205))throw vbb(a)}}return false}\nfunction Xz(){if(Error.stackTraceLimit>0){$wnd.Error.stackTraceLimit=Error.stackTraceLimit=64;return true}return 'stack' in new Error}\nfunction BDb(a,b){return Iy(),Iy(),My(Qie),($wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b)))>0}\nfunction DDb(a,b){return Iy(),Iy(),My(Qie),($wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b)))<0}\nfunction CDb(a,b){return Iy(),Iy(),My(Qie),($wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b)))<=0}\nfunction ydb(a,b){var c=0;while(!b[c]||b[c]==''){c++}var d=b[c++];for(;cWje){return c.fh()}d=c.Zg();if(!!d||c==a){break}}}return d}\nfunction fvd(a){evd();if(JD(a,156)){return BD(Ohb(cvd,hK),288).vg(a)}if(Mhb(cvd,rb(a))){return BD(Ohb(cvd,rb(a)),288).vg(a)}return null}\nfunction fZd(a){if(efb(kse,a)){return Bcb(),Acb}else if(efb(lse,a)){return Bcb(),zcb}else{throw vbb(new Wdb('Expecting true or false'))}}\nfunction uDc(a,b){if(b.c==a){return b.d}else if(b.d==a){return b.c}throw vbb(new Wdb('Input edge is not connected to the input port.'))}\nfunction Igb(a,b){if(a.e>b.e){return 1}if(a.eb.d){return a.e}if(a.d=48&&a<48+$wnd.Math.min(10,10)){return a-48}if(a>=97&&a<97){return a-97+10}if(a>=65&&a<65){return a-65+10}return -1}\nfunction Ue(a,b){var c;if(PD(b)===PD(a)){return true}if(!JD(b,21)){return false}c=BD(b,21);if(c.gc()!=a.gc()){return false}return a.Ic(c)}\nfunction ekb(a,b){var c,d,e,f;d=a.a.length-1;c=b-a.b&d;f=a.c-b&d;e=a.c-a.b&d;mkb(c=f){hkb(a,b);return -1}else{ikb(a,b);return 1}}\nfunction lA(a,b){var c,d;c=(BCb(b,a.length),a.charCodeAt(b));d=b+1;while(db.e){return 1}else if(a.fb.f){return 1}return tb(a)-tb(b)}\nfunction efb(a,b){uCb(a);if(b==null){return false}if(dfb(a,b)){return true}return a.length==b.length&&dfb(a.toLowerCase(),b.toLowerCase())}\nfunction x6d(a,b){var c,d,e,f;for(d=0,e=b.gc();d0&&ybb(a,128)<0){b=Tbb(a)+128;c=(Ceb(),Beb)[b];!c&&(c=Beb[b]=new teb(a));return c}return new teb(a)}\nfunction _0d(a,b){var c,d;c=b.Hh(a.a);if(c){d=GD(AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),fue));if(d!=null){return d}}return b.ne()}\nfunction a1d(a,b){var c,d;c=b.Hh(a.a);if(c){d=GD(AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),fue));if(d!=null){return d}}return b.ne()}\nfunction FMc(a,b){wMc();var c,d;for(d=new Sr(ur(O_b(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),17);if(c.d.i==b||c.c.i==b){return c}}return null}\nfunction HUb(a,b,c){this.c=a;this.f=new Rkb;this.e=new d7c;this.j=new IVb;this.n=new IVb;this.b=b;this.g=new J6c(b.c,b.d,b.b,b.a);this.a=c}\nfunction gVb(a){var b,c,d,e;this.a=new zsb;this.d=new Tqb;this.e=0;for(c=a,d=0,e=c.length;d0}else{return false}}\nfunction q2c(a){var b;if(PD(hkd(a,(Y9c(),J8c)))===PD((hbd(),fbd))){if(!Xod(a)){jkd(a,J8c,gbd)}else{b=BD(hkd(Xod(a),J8c),334);jkd(a,J8c,b)}}}\nfunction ijc(a,b,c){var d,e;bIc(a.e,b,c,(Ucd(),Tcd));bIc(a.i,b,c,zcd);if(a.a){e=BD(vNb(b,(wtc(),$sc)),11);d=BD(vNb(c,$sc),11);cIc(a.g,e,d)}}\nfunction OEc(a,b,c){var d,e,f;d=b.c.p;f=b.p;a.b[d][f]=new $Ec(a,b);if(c){a.a[d][f]=new FEc(b);e=BD(vNb(b,(wtc(),Psc)),10);!!e&&Rc(a.d,e,b)}}\nfunction TPb(a,b){var c,d,e;Ekb(PPb,a);b.Fc(a);c=BD(Ohb(OPb,a),21);if(c){for(e=c.Kc();e.Ob();){d=BD(e.Pb(),33);Jkb(PPb,d,0)!=-1||TPb(d,b)}}}\nfunction tyb(a,b,c){var d;(jyb?(ryb(a),true):kyb?($xb(),true):nyb?($xb(),true):myb&&($xb(),false))&&(d=new iyb(b),d.b=c,pyb(a,d),undefined)}\nfunction xKb(a,b){var c;c=!a.A.Hc((tdd(),sdd))||a.q==(dcd(),$bd);a.u.Hc((rcd(),ncd))?c?vKb(a,b):zKb(a,b):a.u.Hc(pcd)&&(c?wKb(a,b):AKb(a,b))}\nfunction b0d(a,b){var c,d;++a.j;if(b!=null){c=(d=a.a.Cb,JD(d,97)?BD(d,97).Jg():null);if(xlb(b,c)){Cjd(a.a,4,c);return}}Cjd(a.a,4,BD(b,126))}\nfunction dYb(a,b,c){return new J6c($wnd.Math.min(a.a,b.a)-c/2,$wnd.Math.min(a.b,b.b)-c/2,$wnd.Math.abs(a.a-b.a)+c,$wnd.Math.abs(a.b-b.b)+c)}\nfunction k4b(a,b){var c,d;c=beb(a.a.c.p,b.a.c.p);if(c!=0){return c}d=beb(a.a.d.i.p,b.a.d.i.p);if(d!=0){return d}return beb(b.a.d.p,a.a.d.p)}\nfunction _Dc(a,b,c){var d,e,f,g;f=b.j;g=c.j;if(f!=g){return f.g-g.g}else{d=a.f[b.p];e=a.f[c.p];return d==0&&e==0?0:d==0?-1:e==0?1:Kdb(d,e)}}\nfunction HFb(a,b,c){var d,e,f;if(c[b.d]){return}c[b.d]=true;for(e=new olb(LFb(b));e.a=e)return e;for(b=b>0?b:0;bd&&NC(b,d,null);return b}\nfunction _lb(a,b){var c,d;d=a.a.length;b.lengthd&&NC(b,d,null);return b}\nfunction Xrb(a,b,c){var d,e,f;e=BD(Ohb(a.e,b),387);if(!e){d=new lsb(a,b,c);Rhb(a.e,b,d);isb(d);return null}else{f=ijb(e,c);Yrb(a,e);return f}}\nfunction P9d(a){var b;if(a==null)return null;b=ide(Qge(a,true));if(b==null){throw vbb(new n8d(\"Invalid hexBinary value: '\"+a+\"'\"))}return b}\nfunction ghb(a){Hgb();if(ybb(a,0)<0){if(ybb(a,-1)!=0){return new Wgb(-1,Jbb(a))}return Bgb}else return ybb(a,10)<=0?Dgb[Tbb(a)]:new Wgb(1,a)}\nfunction wJb(){qJb();return OC(GC(DN,1),Kie,159,0,[nJb,mJb,oJb,eJb,dJb,fJb,iJb,hJb,gJb,lJb,kJb,jJb,bJb,aJb,cJb,$Ib,ZIb,_Ib,XIb,WIb,YIb,pJb])}\nfunction vjc(a){var b;this.d=new Rkb;this.j=new d7c;this.g=new d7c;b=a.g.b;this.f=BD(vNb(Q_b(b),(Nyc(),Lwc)),103);this.e=Edb(ED(c_b(b,ryc)))}\nfunction Pjc(a){this.b=new Rkb;this.e=new Rkb;this.d=a;this.a=!WAb(JAb(new YAb(null,new Lub(new b1b(a.b))),new Xxb(new Qjc))).sd((EAb(),DAb))}\nfunction N5c(){N5c=ccb;L5c=new O5c('PARENTS',0);K5c=new O5c('NODES',1);I5c=new O5c('EDGES',2);M5c=new O5c('PORTS',3);J5c=new O5c('LABELS',4)}\nfunction Tbd(){Tbd=ccb;Qbd=new Ubd('DISTRIBUTED',0);Sbd=new Ubd('JUSTIFIED',1);Obd=new Ubd('BEGIN',2);Pbd=new Ubd(gle,3);Rbd=new Ubd('END',4)}\nfunction UMd(a){var b;b=a.yi(null);switch(b){case 10:return 0;case 15:return 1;case 14:return 2;case 11:return 3;case 21:return 4;}return -1}\nfunction cYb(a){switch(a.g){case 1:return ead(),dad;case 4:return ead(),aad;case 2:return ead(),bad;case 3:return ead(),_9c;}return ead(),cad}\nfunction kA(a,b,c){var d;d=c.q.getFullYear()-nje+nje;d<0&&(d=-d);switch(b){case 1:a.a+=d;break;case 2:EA(a,d%100,2);break;default:EA(a,d,b);}}\nfunction Jsb(a,b){var c,d;wCb(b,a.b);if(b>=a.b>>1){d=a.c;for(c=a.b;c>b;--c){d=d.b}}else{d=a.a.a;for(c=0;c=64&&b<128&&(e=Mbb(e,Nbb(1,b-64)))}return e}\nfunction c_b(a,b){var c,d;d=null;if(wNb(a,(Y9c(),O9c))){c=BD(vNb(a,O9c),94);c.Xe(b)&&(d=c.We(b))}d==null&&!!Q_b(a)&&(d=vNb(Q_b(a),b));return d}\nfunction oQc(a,b){var c,d,e;e=b.d.i;d=e.k;if(d==(j0b(),h0b)||d==d0b){return}c=new Sr(ur(U_b(e).a.Kc(),new Sq));Qr(c)&&Rhb(a.k,b,BD(Rr(c),17))}\nfunction mid(a,b){var c,d,e;d=XKd(a.Tg(),b);c=b-a.Ah();return c<0?(e=a.Yg(d),e>=0?a.lh(e):tid(a,d)):c<0?tid(a,d):BD(d,66).Nj().Sj(a,a.yh(),c)}\nfunction Ksd(a){var b;if(JD(a.a,4)){b=fvd(a.a);if(b==null){throw vbb(new Zdb(mse+a.b+\"'. \"+ise+(fdb(Y3),Y3.k)+jse))}return b}else{return a.a}}\nfunction L9d(a){var b;if(a==null)return null;b=bde(Qge(a,true));if(b==null){throw vbb(new n8d(\"Invalid base64Binary value: '\"+a+\"'\"))}return b}\nfunction Dyd(b){var c;try{c=b.i.Xb(b.e);b.mj();b.g=b.e++;return c}catch(a){a=ubb(a);if(JD(a,73)){b.mj();throw vbb(new utb)}else throw vbb(a)}}\nfunction Zyd(b){var c;try{c=b.c.ki(b.e);b.mj();b.g=b.e++;return c}catch(a){a=ubb(a);if(JD(a,73)){b.mj();throw vbb(new utb)}else throw vbb(a)}}\nfunction CPb(){CPb=ccb;BPb=(Y9c(),K9c);vPb=G8c;qPb=r8c;wPb=f9c;zPb=(fFb(),bFb);yPb=_Eb;APb=dFb;xPb=$Eb;sPb=(nPb(),jPb);rPb=iPb;tPb=lPb;uPb=mPb}\nfunction NWb(a){LWb();this.c=new Rkb;this.d=a;switch(a.g){case 0:case 2:this.a=tmb(KWb);this.b=Pje;break;case 3:case 1:this.a=KWb;this.b=Qje;}}\nfunction ued(a,b,c){var d,e;if(a.c){dld(a.c,a.c.i+b);eld(a.c,a.c.j+c)}else{for(e=new olb(a.b);e.a0){Ekb(a.b,new WA(b.a,c));d=b.a.length;0d&&(b.a+=yfb(KC(TD,$ie,25,-d,15,1)))}}\nfunction JKb(a,b){var c,d,e;c=a.o;for(e=BD(BD(Qc(a.r,b),21),84).Kc();e.Ob();){d=BD(e.Pb(),111);d.e.a=DKb(d,c.a);d.e.b=c.b*Edb(ED(d.b.We(BKb)))}}\nfunction S5b(a,b){var c,d,e,f;e=a.k;c=Edb(ED(vNb(a,(wtc(),htc))));f=b.k;d=Edb(ED(vNb(b,htc)));return f!=(j0b(),e0b)?-1:e!=e0b?1:c==d?0:c=0){return a.hh(b,c,d)}else{!!a.eh()&&(d=(e=a.Vg(),e>=0?a.Qg(d):a.eh().ih(a,-1-e,null,d)));return a.Sg(b,c,d)}}\nfunction zld(a,b){switch(b){case 7:!a.e&&(a.e=new y5d(B2,a,7,4));Uxd(a.e);return;case 8:!a.d&&(a.d=new y5d(B2,a,8,5));Uxd(a.d);return;}$kd(a,b)}\nfunction Ut(b,c){var d;d=b.Zc(c);try{return d.Pb()}catch(a){a=ubb(a);if(JD(a,109)){throw vbb(new qcb(\"Can't get element \"+c))}else throw vbb(a)}}\nfunction Tgb(a,b){this.e=a;if(b=0&&(c.d=a.t);break;case 3:a.t>=0&&(c.a=a.t);}if(a.C){c.b=a.C.b;c.c=a.C.c}}\nfunction RMb(){RMb=ccb;OMb=new SMb(xle,0);NMb=new SMb(yle,1);PMb=new SMb(zle,2);QMb=new SMb(Ale,3);OMb.a=false;NMb.a=true;PMb.a=false;QMb.a=true}\nfunction ROb(){ROb=ccb;OOb=new SOb(xle,0);NOb=new SOb(yle,1);POb=new SOb(zle,2);QOb=new SOb(Ale,3);OOb.a=false;NOb.a=true;POb.a=false;QOb.a=true}\nfunction dac(a){var b;b=a.a;do{b=BD(Rr(new Sr(ur(R_b(b).a.Kc(),new Sq))),17).c.i;b.k==(j0b(),g0b)&&a.b.Fc(b)}while(b.k==(j0b(),g0b));a.b=Su(a.b)}\nfunction CDc(a){var b,c,d;d=a.c.a;a.p=(Qb(d),new Tkb(d));for(c=new olb(d);c.ac.b){return true}}}return false}\nfunction AD(a,b){if(ND(a)){return !!zD[b]}else if(a.hm){return !!a.hm[b]}else if(LD(a)){return !!yD[b]}else if(KD(a)){return !!xD[b]}return false}\nfunction jkd(a,b,c){c==null?(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),LAd(a.o,b)):(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),HAd(a.o,b,c));return a}\nfunction jKb(a,b,c,d){var e,f;f=b.Xe((Y9c(),W8c))?BD(b.We(W8c),21):a.j;e=uJb(f);if(e==(qJb(),pJb)){return}if(c&&!sJb(e)){return}UHb(lKb(a,e,d),b)}\nfunction fid(a,b,c,d){var e,f,g;f=XKd(a.Tg(),b);e=b-a.Ah();return e<0?(g=a.Yg(f),g>=0?a._g(g,c,true):sid(a,f,c)):BD(f,66).Nj().Pj(a,a.yh(),e,c,d)}\nfunction u6d(a,b,c,d){var e,f,g;if(c.mh(b)){Q6d();if(YId(b)){e=BD(c.ah(b),153);x6d(a,e)}else{f=(g=b,!g?null:BD(d,49).xh(g));!!f&&v6d(c.ah(b),f)}}}\nfunction H3b(a){switch(a.g){case 1:return vLb(),uLb;case 3:return vLb(),rLb;case 2:return vLb(),tLb;case 4:return vLb(),sLb;default:return null;}}\nfunction kCb(a){switch(typeof(a)){case Mhe:return LCb(a);case Lhe:return QD(a);case Khe:return Bcb(),a?1231:1237;default:return a==null?0:FCb(a);}}\nfunction Gic(a,b,c){if(a.e){switch(a.b){case 1:oic(a.c,b,c);break;case 0:pic(a.c,b,c);}}else{mic(a.c,b,c)}a.a[b.p][c.p]=a.c.i;a.a[c.p][b.p]=a.c.e}\nfunction lHc(a){var b,c;if(a==null){return null}c=KC(OQ,nie,193,a.length,0,2);for(b=0;b=0)return e;if(a.Fk()){for(d=0;d=e)throw vbb(new Cyd(b,e));if(a.hi()){d=a.Xc(c);if(d>=0&&d!=b){throw vbb(new Wdb(kue))}}return a.mi(b,c)}\nfunction gx(a,b){this.a=BD(Qb(a),245);this.b=BD(Qb(b),245);if(a.vd(b)>0||a==(Lk(),Kk)||b==(_k(),$k)){throw vbb(new Wdb('Invalid range: '+nx(a,b)))}}\nfunction mYb(a){var b,c;this.b=new Rkb;this.c=a;this.a=false;for(c=new olb(a.a);c.a0);if((b&-b)==b){return QD(b*Cub(a,31)*4.6566128730773926E-10)}do{c=Cub(a,31);d=c%b}while(c-d+(b-1)<0);return QD(d)}\nfunction LCb(a){JCb();var b,c,d;c=':'+a;d=ICb[c];if(d!=null){return QD((uCb(d),d))}d=GCb[c];b=d==null?KCb(a):QD((uCb(d),d));MCb();ICb[c]=b;return b}\nfunction qZb(a,b,c){Odd(c,'Compound graph preprocessor',1);a.a=new Hp;vZb(a,b,null);pZb(a,b);uZb(a);yNb(b,(wtc(),zsc),a.a);a.a=null;Uhb(a.b);Qdd(c)}\nfunction X$b(a,b,c){switch(c.g){case 1:a.a=b.a/2;a.b=0;break;case 2:a.a=b.a;a.b=b.b/2;break;case 3:a.a=b.a/2;a.b=b.b;break;case 4:a.a=0;a.b=b.b/2;}}\nfunction tkc(a){var b,c,d;for(d=BD(Qc(a.a,(Xjc(),Vjc)),15).Kc();d.Ob();){c=BD(d.Pb(),101);b=Bkc(c);kkc(a,c,b[0],(Fkc(),Ckc),0);kkc(a,c,b[1],Ekc,1)}}\nfunction ukc(a){var b,c,d;for(d=BD(Qc(a.a,(Xjc(),Wjc)),15).Kc();d.Ob();){c=BD(d.Pb(),101);b=Bkc(c);kkc(a,c,b[0],(Fkc(),Ckc),0);kkc(a,c,b[1],Ekc,1)}}\nfunction tXc(a){switch(a.g){case 0:return null;case 1:return new $Xc;case 2:return new QXc;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}}\nfunction OZc(a,b,c){var d,e;FZc(a,b-a.s,c-a.t);for(e=new olb(a.n);e.a1&&(f=GFb(a,b));return f}\nfunction dmd(a){var b;if(!!a.f&&a.f.kh()){b=BD(a.f,49);a.f=BD(xid(a,b),82);a.f!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,8,b,a.f))}return a.f}\nfunction emd(a){var b;if(!!a.i&&a.i.kh()){b=BD(a.i,49);a.i=BD(xid(a,b),82);a.i!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,7,b,a.i))}return a.i}\nfunction zUd(a){var b;if(!!a.b&&(a.b.Db&64)!=0){b=a.b;a.b=BD(xid(a,b),18);a.b!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,21,b,a.b))}return a.b}\nfunction uAd(a,b){var c,d,e;if(a.d==null){++a.e;++a.f}else{d=b.Sh();BAd(a,a.f+1);e=(d&Ohe)%a.d.length;c=a.d[e];!c&&(c=a.d[e]=a.uj());c.Fc(b);++a.f}}\nfunction m3d(a,b,c){var d;if(b.Kj()){return false}else if(b.Zj()!=-2){d=b.zj();return d==null?c==null:pb(d,c)}else return b.Hj()==a.e.Tg()&&c==null}\nfunction wo(){var a;Xj(16,Hie);a=Kp(16);this.b=KC(GF,Gie,317,a,0,1);this.c=KC(GF,Gie,317,a,0,1);this.a=null;this.e=null;this.i=0;this.f=a-1;this.g=0}\nfunction b0b(a){n_b.call(this);this.k=(j0b(),h0b);this.j=(Xj(6,Jie),new Skb(6));this.b=(Xj(2,Jie),new Skb(2));this.d=new L_b;this.f=new s0b;this.a=a}\nfunction Scc(a){var b,c;if(a.c.length<=1){return}b=Pcc(a,(Ucd(),Rcd));Rcc(a,BD(b.a,19).a,BD(b.b,19).a);c=Pcc(a,Tcd);Rcc(a,BD(c.a,19).a,BD(c.b,19).a)}\nfunction Vzc(){Vzc=ccb;Uzc=new Xzc('SIMPLE',0);Rzc=new Xzc(Tne,1);Szc=new Xzc('LINEAR_SEGMENTS',2);Qzc=new Xzc('BRANDES_KOEPF',3);Tzc=new Xzc(Aqe,4)}\nfunction XDc(a,b,c){if(!ecd(BD(vNb(b,(Nyc(),Vxc)),98))){WDc(a,b,Y_b(b,c));WDc(a,b,Y_b(b,(Ucd(),Rcd)));WDc(a,b,Y_b(b,Acd));mmb();Okb(b.j,new jEc(a))}}\nfunction HVc(a,b,c,d){var e,f,g;e=d?BD(Qc(a.a,b),21):BD(Qc(a.b,b),21);for(g=e.Kc();g.Ob();){f=BD(g.Pb(),33);if(BVc(a,c,f)){return true}}return false}\nfunction FMd(a){var b,c;for(c=new Fyd(a);c.e!=c.i.gc();){b=BD(Dyd(c),87);if(!!b.e||(!b.d&&(b.d=new xMd(j5,b,1)),b.d).i!=0){return true}}return false}\nfunction QTd(a){var b,c;for(c=new Fyd(a);c.e!=c.i.gc();){b=BD(Dyd(c),87);if(!!b.e||(!b.d&&(b.d=new xMd(j5,b,1)),b.d).i!=0){return true}}return false}\nfunction FDc(a){var b,c,d;b=0;for(d=new olb(a.c.a);d.a102)return -1;if(a<=57)return a-48;if(a<65)return -1;if(a<=70)return a-65+10;if(a<97)return -1;return a-97+10}\nfunction Wj(a,b){if(a==null){throw vbb(new Heb('null key in entry: null='+b))}else if(b==null){throw vbb(new Heb('null value in entry: '+a+'=null'))}}\nfunction kr(a,b){var c,d;while(a.Ob()){if(!b.Ob()){return false}c=a.Pb();d=b.Pb();if(!(PD(c)===PD(d)||c!=null&&pb(c,d))){return false}}return !b.Ob()}\nfunction jIb(a,b){var c;c=OC(GC(UD,1),Vje,25,15,[pHb(a.a[0],b),pHb(a.a[1],b),pHb(a.a[2],b)]);if(a.d){c[0]=$wnd.Math.max(c[0],c[2]);c[2]=c[0]}return c}\nfunction kIb(a,b){var c;c=OC(GC(UD,1),Vje,25,15,[qHb(a.a[0],b),qHb(a.a[1],b),qHb(a.a[2],b)]);if(a.d){c[0]=$wnd.Math.max(c[0],c[2]);c[2]=c[0]}return c}\nfunction mqc(){mqc=ccb;iqc=new oqc('GREEDY',0);hqc=new oqc(Une,1);kqc=new oqc(Tne,2);lqc=new oqc('MODEL_ORDER',3);jqc=new oqc('GREEDY_MODEL_ORDER',4)}\nfunction iUc(a,b){var c,d,e;a.b[b.g]=1;for(d=Jsb(b.d,0);d.b!=d.d.c;){c=BD(Xsb(d),188);e=c.c;a.b[e.g]==1?Dsb(a.a,c):a.b[e.g]==2?(a.b[e.g]=1):iUc(a,e)}}\nfunction V9b(a,b){var c,d,e;e=new Skb(b.gc());for(d=b.Kc();d.Ob();){c=BD(d.Pb(),286);c.c==c.f?K9b(a,c,c.c):L9b(a,c)||(e.c[e.c.length]=c,true)}return e}\nfunction IZc(a,b,c){var d,e,f,g,h;h=a.r+b;a.r+=b;a.d+=c;d=c/a.n.c.length;e=0;for(g=new olb(a.n);g.af&&NC(b,f,null);return b}\nfunction Lu(a,b){var c,d;d=a.gc();if(b==null){for(c=0;c0&&(i+=e);j[k]=g;g+=h*(i+d)}}\nfunction Uoc(a){var b,c,d;d=a.f;a.n=KC(UD,Vje,25,d,15,1);a.d=KC(UD,Vje,25,d,15,1);for(b=0;b0?a.c:0);++e}a.b=d;a.d=f}\nfunction BZc(a,b){var c,d,e,f,g;d=0;e=0;c=0;for(g=new olb(b);g.a0?a.g:0);++c}a.c=e;a.d=d}\nfunction AHb(a,b){var c;c=OC(GC(UD,1),Vje,25,15,[zHb(a,(gHb(),dHb),b),zHb(a,eHb,b),zHb(a,fHb,b)]);if(a.f){c[0]=$wnd.Math.max(c[0],c[2]);c[2]=c[0]}return c}\nfunction lNb(b,c,d){var e;try{aNb(b,c+b.j,d+b.k,false,true)}catch(a){a=ubb(a);if(JD(a,73)){e=a;throw vbb(new qcb(e.g+Gle+c+She+d+').'))}else throw vbb(a)}}\nfunction mNb(b,c,d){var e;try{aNb(b,c+b.j,d+b.k,true,false)}catch(a){a=ubb(a);if(JD(a,73)){e=a;throw vbb(new qcb(e.g+Gle+c+She+d+').'))}else throw vbb(a)}}\nfunction d5b(a){var b;if(!wNb(a,(Nyc(),xxc))){return}b=BD(vNb(a,xxc),21);if(b.Hc((Hbd(),zbd))){b.Mc(zbd);b.Fc(Bbd)}else if(b.Hc(Bbd)){b.Mc(Bbd);b.Fc(zbd)}}\nfunction e5b(a){var b;if(!wNb(a,(Nyc(),xxc))){return}b=BD(vNb(a,xxc),21);if(b.Hc((Hbd(),Gbd))){b.Mc(Gbd);b.Fc(Ebd)}else if(b.Hc(Ebd)){b.Mc(Ebd);b.Fc(Gbd)}}\nfunction udc(a,b,c){Odd(c,'Self-Loop ordering',1);MAb(NAb(JAb(JAb(LAb(new YAb(null,new Kub(b.b,16)),new ydc),new Adc),new Cdc),new Edc),new Gdc(a));Qdd(c)}\nfunction ikc(a,b,c,d){var e,f;for(e=b;e0&&(e.b+=b);return e}\nfunction GXb(a,b){var c,d,e;e=new d7c;for(d=a.Kc();d.Ob();){c=BD(d.Pb(),37);uXb(c,0,e.b);e.b+=c.f.b+b;e.a=$wnd.Math.max(e.a,c.f.a)}e.a>0&&(e.a+=b);return e}\nfunction d_b(a){var b,c,d;d=Ohe;for(c=new olb(a.a);c.a>16==6){return a.Cb.ih(a,5,o5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?a.zh():c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)}\nfunction Wz(a){Rz();var b=a.e;if(b&&b.stack){var c=b.stack;var d=b+'\\n';c.substring(0,d.length)==d&&(c=c.substring(d.length));return c.split('\\n')}return []}\nfunction jeb(a){var b;b=(qeb(),peb);return b[a>>>28]|b[a>>24&15]<<4|b[a>>20&15]<<8|b[a>>16&15]<<12|b[a>>12&15]<<16|b[a>>8&15]<<20|b[a>>4&15]<<24|b[a&15]<<28}\nfunction _jb(a){var b,c,d;if(a.b!=a.c){return}d=a.a.length;c=geb($wnd.Math.max(8,d))<<1;if(a.b!=0){b=_Bb(a.a,c);$jb(a,b,d);a.a=b;a.b=0}else{dCb(a.a,c)}a.c=d}\nfunction DKb(a,b){var c;c=a.b;return c.Xe((Y9c(),s9c))?c.Hf()==(Ucd(),Tcd)?-c.rf().a-Edb(ED(c.We(s9c))):b+Edb(ED(c.We(s9c))):c.Hf()==(Ucd(),Tcd)?-c.rf().a:b}\nfunction P_b(a){var b;if(a.b.c.length!=0&&!!BD(Ikb(a.b,0),70).a){return BD(Ikb(a.b,0),70).a}b=JZb(a);if(b!=null){return b}return ''+(!a.c?-1:Jkb(a.c.a,a,0))}\nfunction C0b(a){var b;if(a.f.c.length!=0&&!!BD(Ikb(a.f,0),70).a){return BD(Ikb(a.f,0),70).a}b=JZb(a);if(b!=null){return b}return ''+(!a.i?-1:Jkb(a.i.j,a,0))}\nfunction Ogc(a,b){var c,d;if(b<0||b>=a.gc()){return null}for(c=b;c0?a.c:0);e=$wnd.Math.max(e,b.d);++d}a.e=f;a.b=e}\nfunction shd(a){var b,c;if(!a.b){a.b=Qu(BD(a.f,118).Ag().i);for(c=new Fyd(BD(a.f,118).Ag());c.e!=c.i.gc();){b=BD(Dyd(c),137);Ekb(a.b,new dhd(b))}}return a.b}\nfunction Ctd(a,b){var c,d,e;if(b.dc()){return LCd(),LCd(),KCd}else{c=new zyd(a,b.gc());for(e=new Fyd(a);e.e!=e.i.gc();){d=Dyd(e);b.Hc(d)&&wtd(c,d)}return c}}\nfunction bkd(a,b,c,d){if(b==0){return d?(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),a.o):(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),FAd(a.o))}return fid(a,b,c,d)}\nfunction Tnd(a){var b,c;if(a.rb){for(b=0,c=a.rb.i;b>22);e+=d>>22;if(e<0){return false}a.l=c&Eje;a.m=d&Eje;a.h=e&Fje;return true}\nfunction Fwb(a,b,c,d,e,f,g){var h,i;if(b.Ae()&&(i=a.a.ue(c,d),i<0||!e&&i==0)){return false}if(b.Be()&&(h=a.a.ue(c,f),h>0||!g&&h==0)){return false}return true}\nfunction Vcc(a,b){Occ();var c;c=a.j.g-b.j.g;if(c!=0){return 0}switch(a.j.g){case 2:return Ycc(b,Ncc)-Ycc(a,Ncc);case 4:return Ycc(a,Mcc)-Ycc(b,Mcc);}return 0}\nfunction Tqc(a){switch(a.g){case 0:return Mqc;case 1:return Nqc;case 2:return Oqc;case 3:return Pqc;case 4:return Qqc;case 5:return Rqc;default:return null;}}\nfunction End(a,b,c){var d,e;d=(e=new rUd,yId(e,b),pnd(e,c),wtd((!a.c&&(a.c=new cUd(p5,a,12,10)),a.c),e),e);AId(d,0);DId(d,1);CId(d,true);BId(d,true);return d}\nfunction tud(a,b){var c,d;if(b>=a.i)throw vbb(new $zd(b,a.i));++a.j;c=a.g[b];d=a.i-b-1;d>0&&$fb(a.g,b+1,a.g,b,d);NC(a.g,--a.i,null);a.fi(b,c);a.ci();return c}\nfunction UId(a,b){var c,d;if(a.Db>>16==17){return a.Cb.ih(a,21,c5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?a.zh():c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)}\nfunction iDb(a){var b,c,d,e;mmb();Okb(a.c,a.a);for(e=new olb(a.c);e.ac.a.c.length)){throw vbb(new Wdb('index must be >= 0 and <= layer node count'))}!!a.c&&Lkb(a.c.a,a);a.c=c;!!c&&Dkb(c.a,b,a)}\nfunction p7b(a,b){var c,d,e;for(d=new Sr(ur(O_b(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),17);e=BD(b.Kb(c),10);return new cc(Qb(e.n.b+e.o.b/2))}return wb(),wb(),vb}\nfunction rMc(a,b){this.c=new Lqb;this.a=a;this.b=b;this.d=BD(vNb(a,(wtc(),otc)),304);PD(vNb(a,(Nyc(),yxc)))===PD((_qc(),Zqc))?(this.e=new bNc):(this.e=new WMc)}\nfunction $dd(a,b){var c,d,e,f;f=0;for(d=new olb(a);d.a>16==6){return a.Cb.ih(a,6,B2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Lhd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)}\nfunction Eod(a,b){var c,d;if(a.Db>>16==7){return a.Cb.ih(a,1,C2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Nhd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)}\nfunction lpd(a,b){var c,d;if(a.Db>>16==9){return a.Cb.ih(a,9,E2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Phd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)}\nfunction mQd(a,b){var c,d;if(a.Db>>16==5){return a.Cb.ih(a,9,h5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),VFd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)}\nfunction KHd(a,b){var c,d;if(a.Db>>16==3){return a.Cb.ih(a,0,k5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),OFd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)}\nfunction Snd(a,b){var c,d;if(a.Db>>16==7){return a.Cb.ih(a,6,o5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),cGd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)}\nfunction ird(){this.a=new bqd;this.g=new wo;this.j=new wo;this.b=new Lqb;this.d=new wo;this.i=new wo;this.k=new Lqb;this.c=new Lqb;this.e=new Lqb;this.f=new Lqb}\nfunction MCd(a,b,c){var d,e,f;c<0&&(c=0);f=a.i;for(e=c;eWje){return p6d(a,d)}if(d==a){return true}}}return false}\nfunction HKb(a){CKb();switch(a.q.g){case 5:EKb(a,(Ucd(),Acd));EKb(a,Rcd);break;case 4:FKb(a,(Ucd(),Acd));FKb(a,Rcd);break;default:GKb(a,(Ucd(),Acd));GKb(a,Rcd);}}\nfunction LKb(a){CKb();switch(a.q.g){case 5:IKb(a,(Ucd(),zcd));IKb(a,Tcd);break;case 4:JKb(a,(Ucd(),zcd));JKb(a,Tcd);break;default:KKb(a,(Ucd(),zcd));KKb(a,Tcd);}}\nfunction XQb(a){var b,c;b=BD(vNb(a,(wSb(),pSb)),19);if(b){c=b.a;c==0?yNb(a,(HSb(),GSb),new Gub):yNb(a,(HSb(),GSb),new Hub(c))}else{yNb(a,(HSb(),GSb),new Hub(1))}}\nfunction V$b(a,b){var c;c=a.i;switch(b.g){case 1:return -(a.n.b+a.o.b);case 2:return a.n.a-c.o.a;case 3:return a.n.b-c.o.b;case 4:return -(a.n.a+a.o.a);}return 0}\nfunction hbc(a,b){switch(a.g){case 0:return b==(Ctc(),ytc)?dbc:ebc;case 1:return b==(Ctc(),ytc)?dbc:cbc;case 2:return b==(Ctc(),ytc)?cbc:ebc;default:return cbc;}}\nfunction v$c(a,b){var c,d,e;Lkb(a.a,b);a.e-=b.r+(a.a.c.length==0?0:a.c);e=ere;for(d=new olb(a.a);d.a>16==3){return a.Cb.ih(a,12,E2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Khd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)}\nfunction Uod(a,b){var c,d;if(a.Db>>16==11){return a.Cb.ih(a,10,E2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Ohd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)}\nfunction PSd(a,b){var c,d;if(a.Db>>16==10){return a.Cb.ih(a,11,c5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),aGd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)}\nfunction qUd(a,b){var c,d;if(a.Db>>16==10){return a.Cb.ih(a,12,n5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),dGd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)}\nfunction wId(a){var b;if((a.Bb&1)==0&&!!a.r&&a.r.kh()){b=BD(a.r,49);a.r=BD(xid(a,b),138);a.r!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,8,b,a.r))}return a.r}\nfunction yHb(a,b,c){var d;d=OC(GC(UD,1),Vje,25,15,[BHb(a,(gHb(),dHb),b,c),BHb(a,eHb,b,c),BHb(a,fHb,b,c)]);if(a.f){d[0]=$wnd.Math.max(d[0],d[2]);d[2]=d[0]}return d}\nfunction O9b(a,b){var c,d,e;e=V9b(a,b);if(e.c.length==0){return}Okb(e,new pac);c=e.c.length;for(d=0;d>19;j=b.h>>19;if(i!=j){return j-i}e=a.h;h=b.h;if(e!=h){return e-h}d=a.m;g=b.m;if(d!=g){return d-g}c=a.l;f=b.l;return c-f}\nfunction fFb(){fFb=ccb;eFb=(rFb(),oFb);dFb=new Nsd(Yke,eFb);cFb=(UEb(),TEb);bFb=new Nsd(Zke,cFb);aFb=(MEb(),LEb);_Eb=new Nsd($ke,aFb);$Eb=new Nsd(_ke,(Bcb(),true))}\nfunction cfc(a,b,c){var d,e;d=b*c;if(JD(a.g,145)){e=ugc(a);if(e.f.d){e.f.a||(a.d.a+=d+ple)}else{a.d.d-=d+ple;a.d.a+=d+ple}}else if(JD(a.g,10)){a.d.d-=d;a.d.a+=2*d}}\nfunction vmc(a,b,c){var d,e,f,g,h;e=a[c.g];for(h=new olb(b.d);h.a0?a.g:0);++c}b.b=d;b.e=e}\nfunction to(a){var b,c,d;d=a.b;if(Lp(a.i,d.length)){c=d.length*2;a.b=KC(GF,Gie,317,c,0,1);a.c=KC(GF,Gie,317,c,0,1);a.f=c-1;a.i=0;for(b=a.a;b;b=b.c){po(a,b,b)}++a.g}}\nfunction cNb(a,b,c,d){var e,f,g,h;for(e=0;eg&&(h=g/d);e>f&&(i=f/e);Y6c(a,$wnd.Math.min(h,i));return a}\nfunction ond(){Smd();var b,c;try{c=BD(mUd((yFd(),xFd),yte),2014);if(c){return c}}catch(a){a=ubb(a);if(JD(a,102)){b=a;uvd((h0d(),b))}else throw vbb(a)}return new knd}\nfunction Y9d(){A9d();var b,c;try{c=BD(mUd((yFd(),xFd),Ewe),2024);if(c){return c}}catch(a){a=ubb(a);if(JD(a,102)){b=a;uvd((h0d(),b))}else throw vbb(a)}return new U9d}\nfunction qZd(){Smd();var b,c;try{c=BD(mUd((yFd(),xFd),_ve),1941);if(c){return c}}catch(a){a=ubb(a);if(JD(a,102)){b=a;uvd((h0d(),b))}else throw vbb(a)}return new mZd}\nfunction HQd(a,b,c){var d,e;e=a.e;a.e=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,4,e,b);!c?(c=d):c.Ei(d)}e!=b&&(b?(c=QQd(a,MQd(a,b),c)):(c=QQd(a,a.a,c)));return c}\nfunction nB(){eB.call(this);this.e=-1;this.a=false;this.p=Rie;this.k=-1;this.c=-1;this.b=-1;this.g=false;this.f=-1;this.j=-1;this.n=-1;this.i=-1;this.d=-1;this.o=Rie}\nfunction qEb(a,b){var c,d,e;d=a.b.d.d;a.a||(d+=a.b.d.a);e=b.b.d.d;b.a||(e+=b.b.d.a);c=Kdb(d,e);if(c==0){if(!a.a&&b.a){return -1}else if(!b.a&&a.a){return 1}}return c}\nfunction eOb(a,b){var c,d,e;d=a.b.b.d;a.a||(d+=a.b.b.a);e=b.b.b.d;b.a||(e+=b.b.b.a);c=Kdb(d,e);if(c==0){if(!a.a&&b.a){return -1}else if(!b.a&&a.a){return 1}}return c}\nfunction PVb(a,b){var c,d,e;d=a.b.g.d;a.a||(d+=a.b.g.a);e=b.b.g.d;b.a||(e+=b.b.g.a);c=Kdb(d,e);if(c==0){if(!a.a&&b.a){return -1}else if(!b.a&&a.a){return 1}}return c}\nfunction ZTb(){ZTb=ccb;WTb=c3c(e3c(e3c(e3c(new j3c,(qUb(),oUb),(S8b(),m8b)),oUb,q8b),pUb,x8b),pUb,a8b);YTb=e3c(e3c(new j3c,oUb,S7b),oUb,b8b);XTb=c3c(new j3c,pUb,d8b)}\nfunction s3b(a){var b,c,d,e,f;b=BD(vNb(a,(wtc(),Csc)),83);f=a.n;for(d=b.Cc().Kc();d.Ob();){c=BD(d.Pb(),306);e=c.i;e.c+=f.a;e.d+=f.b;c.c?VHb(c):XHb(c)}yNb(a,Csc,null)}\nfunction qmc(a,b,c){var d,e;e=a.b;d=e.d;switch(b.g){case 1:return -d.d-c;case 2:return e.o.a+d.c+c;case 3:return e.o.b+d.a+c;case 4:return -d.b-c;default:return -1;}}\nfunction BXc(a){var b,c,d,e,f;d=0;e=dme;if(a.b){for(b=0;b<360;b++){c=b*0.017453292519943295;zXc(a,a.d,0,0,dre,c);f=a.b.ig(a.d);if(f0){g=(f&Ohe)%a.d.length;e=wAd(a,g,f,b);if(e){h=e.ed(c);return h}}d=a.tj(f,b,c);a.c.Fc(d);return null}\nfunction t1d(a,b){var c,d,e,f;switch(o1d(a,b)._k()){case 3:case 2:{c=OKd(b);for(e=0,f=c.i;e=0;d--){if(dfb(a[d].d,b)||dfb(a[d].d,c)){a.length>=d+1&&a.splice(0,d+1);break}}return a}\nfunction Abb(a,b){var c;if(Fbb(a)&&Fbb(b)){c=a/b;if(Kje0){a.b+=2;a.a+=d}}else{a.b+=1;a.a+=$wnd.Math.min(d,e)}}\nfunction Rpd(a,b){var c,d;d=false;if(ND(b)){d=true;Qpd(a,new yC(GD(b)))}if(!d){if(JD(b,236)){d=true;Qpd(a,(c=Kcb(BD(b,236)),new TB(c)))}}if(!d){throw vbb(new vcb(Ute))}}\nfunction IMd(a,b,c,d){var e,f,g;e=new pSd(a.e,1,10,(g=b.c,JD(g,88)?BD(g,26):(jGd(),_Fd)),(f=c.c,JD(f,88)?BD(f,26):(jGd(),_Fd)),HLd(a,b),false);!d?(d=e):d.Ei(e);return d}\nfunction T_b(a){var b,c;switch(BD(vNb(Q_b(a),(Nyc(),ixc)),420).g){case 0:b=a.n;c=a.o;return new f7c(b.a+c.a/2,b.b+c.b/2);case 1:return new g7c(a.n);default:return null;}}\nfunction lrc(){lrc=ccb;irc=new mrc(ane,0);hrc=new mrc('LEFTUP',1);krc=new mrc('RIGHTUP',2);grc=new mrc('LEFTDOWN',3);jrc=new mrc('RIGHTDOWN',4);frc=new mrc('BALANCED',5)}\nfunction FFc(a,b,c){var d,e,f;d=Kdb(a.a[b.p],a.a[c.p]);if(d==0){e=BD(vNb(b,(wtc(),Qsc)),15);f=BD(vNb(c,Qsc),15);if(e.Hc(c)){return -1}else if(f.Hc(b)){return 1}}return d}\nfunction jXc(a){switch(a.g){case 1:return new XVc;case 2:return new ZVc;case 3:return new VVc;case 0:return null;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}}\nfunction Ikd(a,b,c){switch(b){case 1:!a.n&&(a.n=new cUd(D2,a,1,7));Uxd(a.n);!a.n&&(a.n=new cUd(D2,a,1,7));ytd(a.n,BD(c,14));return;case 2:Lkd(a,GD(c));return;}ekd(a,b,c)}\nfunction Zkd(a,b,c){switch(b){case 3:ald(a,Edb(ED(c)));return;case 4:cld(a,Edb(ED(c)));return;case 5:dld(a,Edb(ED(c)));return;case 6:eld(a,Edb(ED(c)));return;}Ikd(a,b,c)}\nfunction Fnd(a,b,c){var d,e,f;f=(d=new rUd,d);e=xId(f,b,null);!!e&&e.Fi();pnd(f,c);wtd((!a.c&&(a.c=new cUd(p5,a,12,10)),a.c),f);AId(f,0);DId(f,1);CId(f,true);BId(f,true)}\nfunction mUd(a,b){var c,d,e;c=Crb(a.g,b);if(JD(c,235)){e=BD(c,235);e.Qh()==null&&undefined;return e.Nh()}else if(JD(c,498)){d=BD(c,1938);e=d.b;return e}else{return null}}\nfunction Ui(a,b,c,d){var e,f;Qb(b);Qb(c);f=BD(tn(a.d,b),19);Ob(!!f,'Row %s not in %s',b,a.e);e=BD(tn(a.b,c),19);Ob(!!e,'Column %s not in %s',c,a.c);return Wi(a,f.a,e.a,d)}\nfunction JC(a,b,c,d,e,f,g){var h,i,j,k,l;k=e[f];j=f==g-1;h=j?d:0;l=LC(h,k);d!=10&&OC(GC(a,g-f),b[f],c[f],h,l);if(!j){++f;for(i=0;i1||h==-1){f=BD(i,15);e.Wb(t6d(a,f))}else{e.Wb(s6d(a,BD(i,56)))}}}}\nfunction Zbb(b,c,d,e){Ybb();var f=Wbb;$moduleName=c;$moduleBase=d;tbb=e;function g(){for(var a=0;aOqe){return c}else e>-1.0E-6&&++c}return c}\nfunction PQd(a,b){var c;if(b!=a.b){c=null;!!a.b&&(c=lid(a.b,a,-4,c));!!b&&(c=kid(b,a,-4,c));c=GQd(a,b,c);!!c&&c.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,b,b))}\nfunction SQd(a,b){var c;if(b!=a.f){c=null;!!a.f&&(c=lid(a.f,a,-1,c));!!b&&(c=kid(b,a,-1,c));c=IQd(a,b,c);!!c&&c.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,0,b,b))}\nfunction E9d(a){var b,c,d;if(a==null)return null;c=BD(a,15);if(c.dc())return '';d=new Hfb;for(b=c.Kc();b.Ob();){Efb(d,(Q8d(),GD(b.Pb())));d.a+=' '}return lcb(d,d.a.length-1)}\nfunction I9d(a){var b,c,d;if(a==null)return null;c=BD(a,15);if(c.dc())return '';d=new Hfb;for(b=c.Kc();b.Ob();){Efb(d,(Q8d(),GD(b.Pb())));d.a+=' '}return lcb(d,d.a.length-1)}\nfunction qEc(a,b,c){var d,e;d=a.c[b.c.p][b.p];e=a.c[c.c.p][c.p];if(d.a!=null&&e.a!=null){return Ddb(d.a,e.a)}else if(d.a!=null){return -1}else if(e.a!=null){return 1}return 0}\nfunction zqd(a,b){var c,d,e,f,g,h;if(b){f=b.a.length;c=new Yge(f);for(h=(c.b-c.a)*c.c<0?(Xge(),Wge):new she(c);h.Ob();){g=BD(h.Pb(),19);e=Zpd(b,g.a);d=new Crd(a);Aqd(d.a,e)}}}\nfunction Qqd(a,b){var c,d,e,f,g,h;if(b){f=b.a.length;c=new Yge(f);for(h=(c.b-c.a)*c.c<0?(Xge(),Wge):new she(c);h.Ob();){g=BD(h.Pb(),19);e=Zpd(b,g.a);d=new lrd(a);nqd(d.a,e)}}}\nfunction eFd(b){var c;if(b!=null&&b.length>0&&bfb(b,b.length-1)==33){try{c=PEd(qfb(b,0,b.length-1));return c.e==null}catch(a){a=ubb(a);if(!JD(a,32))throw vbb(a)}}return false}\nfunction h3d(a,b,c){var d,e,f;d=b.ak();f=b.dd();e=d.$j()?H2d(a,3,d,null,f,M2d(a,d,f,JD(d,99)&&(BD(d,18).Bb&Tje)!=0),true):H2d(a,1,d,d.zj(),f,-1,true);c?c.Ei(e):(c=e);return c}\nfunction Vee(){var a,b,c;b=0;for(a=0;a<'X'.length;a++){c=Uee((BCb(a,'X'.length),'X'.charCodeAt(a)));if(c==0)throw vbb(new mde('Unknown Option: '+'X'.substr(a)));b|=c}return b}\nfunction mZb(a,b,c){var d,e,f;d=Q_b(b);e=a_b(d);f=new H0b;F0b(f,b);switch(c.g){case 1:G0b(f,Wcd(Zcd(e)));break;case 2:G0b(f,Zcd(e));}yNb(f,(Nyc(),Uxc),ED(vNb(a,Uxc)));return f}\nfunction U9b(a){var b,c;b=BD(Rr(new Sr(ur(R_b(a.a).a.Kc(),new Sq))),17);c=BD(Rr(new Sr(ur(U_b(a.a).a.Kc(),new Sq))),17);return Ccb(DD(vNb(b,(wtc(),ltc))))||Ccb(DD(vNb(c,ltc)))}\nfunction Xjc(){Xjc=ccb;Tjc=new Yjc('ONE_SIDE',0);Vjc=new Yjc('TWO_SIDES_CORNER',1);Wjc=new Yjc('TWO_SIDES_OPPOSING',2);Ujc=new Yjc('THREE_SIDES',3);Sjc=new Yjc('FOUR_SIDES',4)}\nfunction jkc(a,b,c,d,e){var f,g;f=BD(GAb(JAb(b.Oc(),new _kc),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)]))),15);g=BD(Si(a.b,c,d),15);e==0?g.Wc(0,f):g.Gc(f)}\nfunction KDc(a,b){var c,d,e,f,g;for(f=new olb(b.a);f.a0&&ric(this,this.c-1,(Ucd(),zcd));this.c0&&a[0].length>0&&(this.c=Ccb(DD(vNb(Q_b(a[0][0]),(wtc(),Rsc)))));this.a=KC(CX,nie,2018,a.length,0,2);this.b=KC(FX,nie,2019,a.length,0,2);this.d=new ss}\nfunction tKc(a){if(a.c.length==0){return false}if((tCb(0,a.c.length),BD(a.c[0],17)).c.i.k==(j0b(),g0b)){return true}return FAb(NAb(new YAb(null,new Kub(a,16)),new wKc),new yKc)}\nfunction rRc(a,b,c){Odd(c,'Tree layout',1);H2c(a.b);K2c(a.b,(yRc(),uRc),uRc);K2c(a.b,vRc,vRc);K2c(a.b,wRc,wRc);K2c(a.b,xRc,xRc);a.a=F2c(a.b,b);sRc(a,b,Udd(c,1));Qdd(c);return b}\nfunction HXc(a,b){var c,d,e,f,g,h,i;h=gVc(b);f=b.f;i=b.g;g=$wnd.Math.sqrt(f*f+i*i);e=0;for(d=new olb(h);d.a=0){c=Abb(a,Jje);d=Hbb(a,Jje)}else{b=Pbb(a,1);c=Abb(b,500000000);d=Hbb(b,500000000);d=wbb(Nbb(d,1),xbb(a,1))}return Mbb(Nbb(d,32),xbb(c,Yje))}\nfunction oQb(a,b,c){var d,e;d=(sCb(b.b!=0),BD(Nsb(b,b.a.a),8));switch(c.g){case 0:d.b=0;break;case 2:d.b=a.f;break;case 3:d.a=0;break;default:d.a=a.g;}e=Jsb(b,0);Vsb(e,d);return b}\nfunction pmc(a,b,c,d){var e,f,g,h,i;i=a.b;f=b.d;g=f.j;h=umc(g,i.d[g.g],c);e=P6c(R6c(f.n),f.a);switch(f.j.g){case 1:case 3:h.a+=e.a;break;case 2:case 4:h.b+=e.b;}Gsb(d,h,d.c.b,d.c)}\nfunction yJc(a,b,c){var d,e,f,g;g=Jkb(a.e,b,0);f=new zJc;f.b=c;d=new Bib(a.e,g);while(d.b1;b>>=1){(b&1)!=0&&(d=Ogb(d,c));c.d==1?(c=Ogb(c,c)):(c=new Xgb(Lhb(c.a,c.d,KC(WD,oje,25,c.d<<1,15,1))))}d=Ogb(d,c);return d}\nfunction zub(){zub=ccb;var a,b,c,d;wub=KC(UD,Vje,25,25,15,1);xub=KC(UD,Vje,25,33,15,1);d=1.52587890625E-5;for(b=32;b>=0;b--){xub[b]=d;d*=0.5}c=1;for(a=24;a>=0;a--){wub[a]=c;c*=0.5}}\nfunction S1b(a){var b,c;if(Ccb(DD(hkd(a,(Nyc(),fxc))))){for(c=new Sr(ur(_sd(a).a.Kc(),new Sq));Qr(c);){b=BD(Rr(c),79);if(Qld(b)){if(Ccb(DD(hkd(b,gxc)))){return true}}}}return false}\nfunction kjc(a,b){var c,d,e;if(Qqb(a.f,b)){b.b=a;d=b.c;Jkb(a.j,d,0)!=-1||Ekb(a.j,d);e=b.d;Jkb(a.j,e,0)!=-1||Ekb(a.j,e);c=b.a.b;if(c.c.length!=0){!a.i&&(a.i=new vjc(a));qjc(a.i,c)}}}\nfunction rmc(a){var b,c,d,e,f;c=a.c.d;d=c.j;e=a.d.d;f=e.j;if(d==f){return c.p=0&&dfb(a.substr(b,'GMT'.length),'GMT')){c[0]=b+3;return tA(a,c,d)}if(b>=0&&dfb(a.substr(b,'UTC'.length),'UTC')){c[0]=b+3;return tA(a,c,d)}return tA(a,c,d)}\nfunction tjc(a,b){var c,d,e,f,g;f=a.g.a;g=a.g.b;for(d=new olb(a.d);d.ac;f--){a[f]|=b[f-c-1]>>>g;a[f-1]=b[f-c-1]<=a.f){break}f.c[f.c.length]=c}return f}\nfunction sfd(a){var b,c,d,e;b=null;for(e=new olb(a.wf());e.a0&&$fb(a.g,b,a.g,b+d,h);g=c.Kc();a.i+=d;for(e=0;ef&&nfb(j,sfb(c[h],ltb))){e=h;f=i}}e>=0&&(d[0]=b+f);return e}\nfunction MIb(a,b){var c;c=NIb(a.b.Hf(),b.b.Hf());if(c!=0){return c}switch(a.b.Hf().g){case 1:case 2:return beb(a.b.sf(),b.b.sf());case 3:case 4:return beb(b.b.sf(),a.b.sf());}return 0}\nfunction iRb(a){var b,c,d;d=a.e.c.length;a.a=IC(WD,[nie,oje],[48,25],15,[d,d],2);for(c=new olb(a.c);c.a>4&15;f=a[d]&15;g[e++]=Qmd[c];g[e++]=Qmd[f]}return zfb(g,0,g.length)}}\nfunction j3d(a,b,c){var d,e,f;d=b.ak();f=b.dd();e=d.$j()?H2d(a,4,d,f,null,M2d(a,d,f,JD(d,99)&&(BD(d,18).Bb&Tje)!=0),true):H2d(a,d.Kj()?2:1,d,f,d.zj(),-1,true);c?c.Ei(e):(c=e);return c}\nfunction wfb(a){var b,c;if(a>=Tje){b=Uje+(a-Tje>>10&1023)&aje;c=56320+(a-Tje&1023)&aje;return String.fromCharCode(b)+(''+String.fromCharCode(c))}else{return String.fromCharCode(a&aje)}}\nfunction bKb(a,b){$Jb();var c,d,e,f;e=BD(BD(Qc(a.r,b),21),84);if(e.gc()>=2){d=BD(e.Kc().Pb(),111);c=a.u.Hc((rcd(),mcd));f=a.u.Hc(qcd);return !d.a&&!c&&(e.gc()==2||f)}else{return false}}\nfunction IVc(a,b,c,d,e){var f,g,h;f=JVc(a,b,c,d,e);h=false;while(!f){AVc(a,e,true);h=true;f=JVc(a,b,c,d,e)}h&&AVc(a,e,false);g=dVc(e);if(g.c.length!=0){!!a.d&&a.d.lg(g);IVc(a,e,c,d,g)}}\nfunction Mad(){Mad=ccb;Kad=new Nad(ane,0);Iad=new Nad('DIRECTED',1);Lad=new Nad('UNDIRECTED',2);Gad=new Nad('ASSOCIATION',3);Jad=new Nad('GENERALIZATION',4);Had=new Nad('DEPENDENCY',5)}\nfunction kfd(a,b){var c;if(!mpd(a)){throw vbb(new Zdb(Sse))}c=mpd(a);switch(b.g){case 1:return -(a.j+a.f);case 2:return a.i-c.g;case 3:return a.j-c.f;case 4:return -(a.i+a.g);}return 0}\nfunction cub(a,b){var c,d;uCb(b);d=a.b.c.length;Ekb(a.b,b);while(d>0){c=d;d=(d-1)/2|0;if(a.a.ue(Ikb(a.b,d),b)<=0){Nkb(a.b,c,b);return true}Nkb(a.b,c,Ikb(a.b,d))}Nkb(a.b,d,b);return true}\nfunction BHb(a,b,c,d){var e,f;e=0;if(!c){for(f=0;f=h}\nfunction Tpd(a,b,c,d){var e;e=false;if(ND(d)){e=true;Upd(b,c,GD(d))}if(!e){if(KD(d)){e=true;Tpd(a,b,c,d)}}if(!e){if(JD(d,236)){e=true;Spd(b,c,BD(d,236))}}if(!e){throw vbb(new vcb(Ute))}}\nfunction W0d(a,b){var c,d,e;c=b.Hh(a.a);if(c){e=AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),Sve);if(e!=null){for(d=1;d<(O6d(),K6d).length;++d){if(dfb(K6d[d],e)){return d}}}}return 0}\nfunction X0d(a,b){var c,d,e;c=b.Hh(a.a);if(c){e=AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),Sve);if(e!=null){for(d=1;d<(O6d(),L6d).length;++d){if(dfb(L6d[d],e)){return d}}}}return 0}\nfunction Ve(a,b){var c,d,e,f;uCb(b);f=a.a.gc();if(f0?1:0;while(f.a[e]!=c){f=f.a[e];e=a.a.ue(c.d,f.d)>0?1:0}f.a[e]=d;d.b=c.b;d.a[0]=c.a[0];d.a[1]=c.a[1];c.a[0]=null;c.a[1]=null}\nfunction ucd(a){rcd();var b,c;b=qqb(ncd,OC(GC(E1,1),Kie,273,0,[pcd]));if(Ox(Cx(b,a))>1){return false}c=qqb(mcd,OC(GC(E1,1),Kie,273,0,[lcd,qcd]));if(Ox(Cx(c,a))>1){return false}return true}\nfunction fod(a,b){var c;c=Phb((yFd(),xFd),a);JD(c,498)?Shb(xFd,a,new bUd(this,b)):Shb(xFd,a,this);bod(this,b);if(b==(LFd(),KFd)){this.wb=BD(this,1939);BD(b,1941)}else{this.wb=(NFd(),MFd)}}\nfunction lZd(b){var c,d,e;if(b==null){return null}c=null;for(d=0;d=_ie?'error':d>=900?'warn':d>=800?'info':'log');gCb(c,a.a);!!a.b&&hCb(b,c,a.b,'Exception: ',true)}\nfunction vNb(a,b){var c,d;d=(!a.q&&(a.q=new Lqb),Ohb(a.q,b));if(d!=null){return d}c=b.wg();JD(c,4)&&(c==null?(!a.q&&(a.q=new Lqb),Thb(a.q,b)):(!a.q&&(a.q=new Lqb),Rhb(a.q,b,c)),a);return c}\nfunction qUb(){qUb=ccb;lUb=new rUb('P1_CYCLE_BREAKING',0);mUb=new rUb('P2_LAYERING',1);nUb=new rUb('P3_NODE_ORDERING',2);oUb=new rUb('P4_NODE_PLACEMENT',3);pUb=new rUb('P5_EDGE_ROUTING',4)}\nfunction SUb(a,b){var c,d,e,f,g;e=b==1?KUb:JUb;for(d=e.a.ec().Kc();d.Ob();){c=BD(d.Pb(),103);for(g=BD(Qc(a.f.c,c),21).Kc();g.Ob();){f=BD(g.Pb(),46);Lkb(a.b.b,f.b);Lkb(a.b.a,BD(f.b,81).d)}}}\nfunction IWb(a,b){AWb();var c;if(a.c==b.c){if(a.b==b.b||pWb(a.b,b.b)){c=mWb(a.b)?1:-1;if(a.a&&!b.a){return c}else if(!a.a&&b.a){return -c}}return beb(a.b.g,b.b.g)}else{return Kdb(a.c,b.c)}}\nfunction y6b(a,b){var c;Odd(b,'Hierarchical port position processing',1);c=a.b;c.c.length>0&&x6b((tCb(0,c.c.length),BD(c.c[0],29)),a);c.c.length>1&&x6b(BD(Ikb(c,c.c.length-1),29),a);Qdd(b)}\nfunction RVc(a,b){var c,d,e;if(CVc(a,b)){return true}for(d=new olb(b);d.a=e||b<0)throw vbb(new qcb(lue+b+mue+e));if(c>=e||c<0)throw vbb(new qcb(nue+c+mue+e));b!=c?(d=(f=a.Ti(c),a.Hi(b,f),f)):(d=a.Oi(c));return d}\nfunction m6d(a){var b,c,d;d=a;if(a){b=0;for(c=a.Ug();c;c=c.Ug()){if(++b>Wje){return m6d(c)}d=c;if(c==a){throw vbb(new Zdb('There is a cycle in the containment hierarchy of '+a))}}}return d}\nfunction Fe(a){var b,c,d;d=new xwb(She,'[',']');for(c=a.Kc();c.Ob();){b=c.Pb();uwb(d,PD(b)===PD(a)?'(this Collection)':b==null?Xhe:fcb(b))}return !d.a?d.c:d.e.length==0?d.a.a:d.a.a+(''+d.e)}\nfunction CVc(a,b){var c,d;d=false;if(b.gc()<2){return false}for(c=0;cd&&(BCb(b-1,a.length),a.charCodeAt(b-1)<=32)){--b}return d>0||b1&&(a.j.b+=a.e)}else{a.j.a+=c.a;a.j.b=$wnd.Math.max(a.j.b,c.b);a.d.c.length>1&&(a.j.a+=a.e)}}\nfunction gkc(){gkc=ccb;dkc=OC(GC(F1,1),bne,61,0,[(Ucd(),Acd),zcd,Rcd]);ckc=OC(GC(F1,1),bne,61,0,[zcd,Rcd,Tcd]);ekc=OC(GC(F1,1),bne,61,0,[Rcd,Tcd,Acd]);fkc=OC(GC(F1,1),bne,61,0,[Tcd,Acd,zcd])}\nfunction omc(a,b,c,d){var e,f,g,h,i,j,k;g=a.c.d;h=a.d.d;if(g.j==h.j){return}k=a.b;e=g.j;i=null;while(e!=h.j){i=b==0?Xcd(e):Vcd(e);f=umc(e,k.d[e.g],c);j=umc(i,k.d[i.g],c);Dsb(d,P6c(f,j));e=i}}\nfunction oFc(a,b,c,d){var e,f,g,h,i;g=JHc(a.a,b,c);h=BD(g.a,19).a;f=BD(g.b,19).a;if(d){i=BD(vNb(b,(wtc(),gtc)),10);e=BD(vNb(c,gtc),10);if(!!i&&!!e){mic(a.b,i,e);h+=a.b.i;f+=a.b.e}}return h>f}\nfunction oHc(a){var b,c,d,e,f,g,h,i,j;this.a=lHc(a);this.b=new Rkb;for(c=a,d=0,e=c.length;dwic(a.d).c){a.i+=a.g.c;yic(a.d)}else if(wic(a.d).c>wic(a.g).c){a.e+=a.d.c;yic(a.g)}else{a.i+=vic(a.g);a.e+=vic(a.d);yic(a.g);yic(a.d)}}}\nfunction XOc(a,b,c){var d,e,f,g;f=b.q;g=b.r;new DOc((HOc(),FOc),b,f,1);new DOc(FOc,f,g,1);for(e=new olb(c);e.ah&&(i=h/d);e>f&&(j=f/e);g=$wnd.Math.min(i,j);a.a+=g*(b.a-a.a);a.b+=g*(b.b-a.b)}\nfunction sZc(a,b,c,d,e){var f,g;g=false;f=BD(Ikb(c.b,0),33);while(yZc(a,b,f,d,e)){g=true;NZc(c,f);if(c.b.c.length==0){break}f=BD(Ikb(c.b,0),33)}c.b.c.length==0&&v$c(c.j,c);g&&a$c(b.q);return g}\nfunction t6c(a,b){i6c();var c,d,e,f;if(b.b<2){return false}f=Jsb(b,0);c=BD(Xsb(f),8);d=c;while(f.b!=f.d.c){e=BD(Xsb(f),8);if(s6c(a,d,e)){return true}d=e}if(s6c(a,d,c)){return true}return false}\nfunction ckd(a,b,c,d){var e,f;if(c==0){return !a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),bId(a.o,b,d)}return f=BD(XKd((e=BD(Ajd(a,16),26),!e?a.zh():e),c),66),f.Nj().Rj(a,yjd(a),c-aLd(a.zh()),b,d)}\nfunction bod(a,b){var c;if(b!=a.sb){c=null;!!a.sb&&(c=BD(a.sb,49).ih(a,1,i5,c));!!b&&(c=BD(b,49).gh(a,1,i5,c));c=Jnd(a,b,c);!!c&&c.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,4,b,b))}\nfunction yqd(a,b){var c,d,e,f;if(b){e=Xpd(b,'x');c=new zrd(a);hmd(c.a,(uCb(e),e));f=Xpd(b,'y');d=new Ard(a);imd(d.a,(uCb(f),f))}else{throw vbb(new cqd('All edge sections need an end point.'))}}\nfunction wqd(a,b){var c,d,e,f;if(b){e=Xpd(b,'x');c=new wrd(a);omd(c.a,(uCb(e),e));f=Xpd(b,'y');d=new xrd(a);pmd(d.a,(uCb(f),f))}else{throw vbb(new cqd('All edge sections need a start point.'))}}\nfunction pyb(a,b){var c,d,e,f,g,h,i;for(d=syb(a),f=0,h=d.length;f>22-b;e=a.h<>22-b}else if(b<44){c=0;d=a.l<>44-b}else{c=0;d=0;e=a.l<a){throw vbb(new Wdb('k must be smaller than n'))}else return b==0||b==a?1:a==0?0:q6c(a)/(q6c(b)*q6c(a-b))}\nfunction jfd(a,b){var c,d,e,f;c=new _ud(a);while(c.g==null&&!c.c?Uud(c):c.g==null||c.i!=0&&BD(c.g[c.i-1],47).Ob()){f=BD(Vud(c),56);if(JD(f,160)){d=BD(f,160);for(e=0;e>4];b[c*2+1]=gde[f&15]}return zfb(b,0,b.length)}\nfunction fn(a){Vm();var b,c,d;d=a.c.length;switch(d){case 0:return Um;case 1:b=BD(qr(new olb(a)),42);return ln(b.cd(),b.dd());default:c=BD(Qkb(a,KC(CK,zie,42,a.c.length,0,1)),165);return new wx(c);}}\nfunction ITb(a){var b,c,d,e,f,g;b=new jkb;c=new jkb;Wjb(b,a);Wjb(c,a);while(c.b!=c.c){e=BD(fkb(c),37);for(g=new olb(e.a);g.a0&&WGc(a,c,b);return e}return TGc(a,b,c)}\nfunction MSc(a,b,c){var d,e,f,g;if(b.b!=0){d=new Psb;for(g=Jsb(b,0);g.b!=g.d.c;){f=BD(Xsb(g),86);ye(d,URc(f));e=f.e;e.a=BD(vNb(f,(mTc(),kTc)),19).a;e.b=BD(vNb(f,lTc),19).a}MSc(a,d,Udd(c,d.b/a.a|0))}}\nfunction JZc(a,b){var c,d,e,f,g;if(a.e<=b){return a.g}if(LZc(a,a.g,b)){return a.g}f=a.r;d=a.g;g=a.r;e=(f-d)/2+d;while(d+11&&(a.e.b+=a.a)}else{a.e.a+=c.a;a.e.b=$wnd.Math.max(a.e.b,c.b);a.d.c.length>1&&(a.e.a+=a.a)}}\nfunction cmc(a){var b,c,d,e;e=a.i;b=e.b;d=e.j;c=e.g;switch(e.a.g){case 0:c.a=(a.g.b.o.a-d.a)/2;break;case 1:c.a=b.d.n.a+b.d.a.a;break;case 2:c.a=b.d.n.a+b.d.a.a-d.a;break;case 3:c.b=b.d.n.b+b.d.a.b;}}\nfunction Q6c(a,b,c,d,e){if(dd&&(a.a=d);a.be&&(a.b=e);return a}\nfunction lsd(a){if(JD(a,149)){return esd(BD(a,149))}else if(JD(a,229)){return fsd(BD(a,229))}else if(JD(a,23)){return gsd(BD(a,23))}else{throw vbb(new Wdb(Xte+Fe(new amb(OC(GC(SI,1),Uhe,1,5,[a])))))}}\nfunction mhb(a,b,c,d,e){var f,g,h;f=true;for(g=0;g>>e|c[g+d+1]<>>e;++g}return f}\nfunction zMc(a,b,c,d){var e,f,g;if(b.k==(j0b(),g0b)){for(f=new Sr(ur(R_b(b).a.Kc(),new Sq));Qr(f);){e=BD(Rr(f),17);g=e.c.i.k;if(g==g0b&&a.c.a[e.c.i.c.p]==d&&a.c.a[b.c.p]==c){return true}}}return false}\nfunction mD(a,b){var c,d,e,f;b&=63;c=a.h&Fje;if(b<22){f=c>>>b;e=a.m>>b|c<<22-b;d=a.l>>b|a.m<<22-b}else if(b<44){f=0;e=c>>>b-22;d=a.m>>b-22|a.h<<44-b}else{f=0;e=0;d=c>>>b-44}return TC(d&Eje,e&Eje,f&Fje)}\nfunction Iic(a,b,c,d){var e;this.b=d;this.e=a==(rGc(),pGc);e=b[c];this.d=IC(sbb,[nie,dle],[177,25],16,[e.length,e.length],2);this.a=IC(WD,[nie,oje],[48,25],15,[e.length,e.length],2);this.c=new sic(b,c)}\nfunction ljc(a){var b,c,d;a.k=new Ki((Ucd(),OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])).length,a.j.c.length);for(d=new olb(a.j);d.a=c){K9b(a,b,d.p);return true}}return false}\nfunction Iod(a){var b;if((a.Db&64)!=0)return fld(a);b=new Wfb(dte);!a.a||Qfb(Qfb((b.a+=' \"',b),a.a),'\"');Qfb(Lfb(Qfb(Lfb(Qfb(Lfb(Qfb(Lfb((b.a+=' (',b),a.i),','),a.j),' | '),a.g),','),a.f),')');return b.a}\nfunction Z2d(a,b,c){var d,e,f,g,h;h=S6d(a.e.Tg(),b);e=BD(a.g,119);d=0;for(g=0;gc){return Jb(a,c,'start index')}if(b<0||b>c){return Jb(b,c,'end index')}return hc('end index (%s) must not be less than start index (%s)',OC(GC(SI,1),Uhe,1,5,[meb(b),meb(a)]))}\nfunction Pz(b,c){var d,e,f,g;for(e=0,f=b.length;e0&&iCc(a,f,c))}}b.p=0}\nfunction p5c(a){var b;this.c=new Psb;this.f=a.e;this.e=a.d;this.i=a.g;this.d=a.c;this.b=a.b;this.k=a.j;this.a=a.a;!a.i?(this.j=(b=BD(gdb(e1),9),new xqb(b,BD(_Bb(b,b.length),9),0))):(this.j=a.i);this.g=a.f}\nfunction Wb(a){var b,c,d,e;b=Kfb(Qfb(new Wfb('Predicates.'),'and'),40);c=true;for(e=new vib(a);e.b0?h[g-1]:KC(OQ,kne,10,0,0,1);e=h[g];j=g=0?a.Bh(e):vid(a,d)}else{throw vbb(new Wdb(ite+d.ne()+jte))}}else{eid(a,c,d)}}\nfunction aqd(a){var b,c;c=null;b=false;if(JD(a,204)){b=true;c=BD(a,204).a}if(!b){if(JD(a,258)){b=true;c=''+BD(a,258).a}}if(!b){if(JD(a,483)){b=true;c=''+BD(a,483).a}}if(!b){throw vbb(new vcb(Ute))}return c}\nfunction ORd(a,b){var c,d;if(a.f){while(b.Ob()){c=BD(b.Pb(),72);d=c.ak();if(JD(d,99)&&(BD(d,18).Bb&ote)!=0&&(!a.e||d.Gj()!=x2||d.aj()!=0)&&c.dd()!=null){b.Ub();return true}}return false}else{return b.Ob()}}\nfunction QRd(a,b){var c,d;if(a.f){while(b.Sb()){c=BD(b.Ub(),72);d=c.ak();if(JD(d,99)&&(BD(d,18).Bb&ote)!=0&&(!a.e||d.Gj()!=x2||d.aj()!=0)&&c.dd()!=null){b.Pb();return true}}return false}else{return b.Sb()}}\nfunction I2d(a,b,c){var d,e,f,g,h,i;i=S6d(a.e.Tg(),b);d=0;h=a.i;e=BD(a.g,119);for(g=0;g1&&(b.c[b.c.length]=f,true)}}\nfunction TJc(a){var b,c,d,e;c=new Psb;ye(c,a.o);d=new twb;while(c.b!=0){b=BD(c.b==0?null:(sCb(c.b!=0),Nsb(c,c.a.a)),508);e=KJc(a,b,true);e&&Ekb(d.a,b)}while(d.a.c.length!=0){b=BD(rwb(d),508);KJc(a,b,false)}}\nfunction _5c(){_5c=ccb;$5c=new a6c(ole,0);T5c=new a6c('BOOLEAN',1);X5c=new a6c('INT',2);Z5c=new a6c('STRING',3);U5c=new a6c('DOUBLE',4);V5c=new a6c('ENUM',5);W5c=new a6c('ENUMSET',6);Y5c=new a6c('OBJECT',7)}\nfunction H6c(a,b){var c,d,e,f,g;d=$wnd.Math.min(a.c,b.c);f=$wnd.Math.min(a.d,b.d);e=$wnd.Math.max(a.c+a.b,b.c+b.b);g=$wnd.Math.max(a.d+a.a,b.d+b.a);if(e=(e/2|0)){this.e=!d?null:d.c;this.d=e;while(c++0){uu(this)}}this.b=b;this.a=null}\nfunction rEb(a,b){var c,d;b.a?sEb(a,b):(c=BD(Exb(a.b,b.b),57),!!c&&c==a.a[b.b.f]&&!!c.a&&c.a!=b.b.a&&c.c.Fc(b.b),d=BD(Dxb(a.b,b.b),57),!!d&&a.a[d.f]==b.b&&!!d.a&&d.a!=b.b.a&&b.b.c.Fc(d),Fxb(a.b,b.b),undefined)}\nfunction FJb(a,b){var c,d;c=BD(Mpb(a.b,b),124);if(BD(BD(Qc(a.r,b),21),84).dc()){c.n.b=0;c.n.c=0;return}c.n.b=a.C.b;c.n.c=a.C.c;a.A.Hc((tdd(),sdd))&&KJb(a,b);d=JJb(a,b);KIb(a,b)==(Tbd(),Qbd)&&(d+=2*a.w);c.a.a=d}\nfunction OKb(a,b){var c,d;c=BD(Mpb(a.b,b),124);if(BD(BD(Qc(a.r,b),21),84).dc()){c.n.d=0;c.n.a=0;return}c.n.d=a.C.d;c.n.a=a.C.a;a.A.Hc((tdd(),sdd))&&SKb(a,b);d=RKb(a,b);KIb(a,b)==(Tbd(),Qbd)&&(d+=2*a.w);c.a.b=d}\nfunction cOb(a,b){var c,d,e,f;f=new Rkb;for(d=new olb(b);d.ac.a&&(d.Hc((i8c(),c8c))?(e=(b.a-c.a)/2):d.Hc(e8c)&&(e=b.a-c.a));b.b>c.b&&(d.Hc((i8c(),g8c))?(f=(b.b-c.b)/2):d.Hc(f8c)&&(f=b.b-c.b));Efd(a,e,f)}\nfunction aod(a,b,c,d,e,f,g,h,i,j,k,l,m){JD(a.Cb,88)&&XMd($Kd(BD(a.Cb,88)),4);pnd(a,c);a.f=g;dJd(a,h);fJd(a,i);ZId(a,j);eJd(a,k);CId(a,l);aJd(a,m);BId(a,true);AId(a,e);a.ok(f);yId(a,b);d!=null&&(a.i=null,_Id(a,d))}\nfunction PRd(a){var b,c;if(a.f){while(a.n>0){b=BD(a.k.Xb(a.n-1),72);c=b.ak();if(JD(c,99)&&(BD(c,18).Bb&ote)!=0&&(!a.e||c.Gj()!=x2||c.aj()!=0)&&b.dd()!=null){return true}else{--a.n}}return false}else{return a.n>0}}\nfunction Jb(a,b,c){if(a<0){return hc(The,OC(GC(SI,1),Uhe,1,5,[c,meb(a)]))}else if(b<0){throw vbb(new Wdb(Vhe+b))}else{return hc('%s (%s) must not be greater than size (%s)',OC(GC(SI,1),Uhe,1,5,[c,meb(a),meb(b)]))}}\nfunction Llb(a,b,c,d,e,f){var g,h,i,j;g=d-c;if(g<7){Ilb(b,c,d,f);return}i=c+e;h=d+e;j=i+(h-i>>1);Llb(b,a,i,j,-e,f);Llb(b,a,j,h,-e,f);if(f.ue(a[j-1],a[j])<=0){while(c=0?a.sh(f,c):uid(a,e,c)}else{throw vbb(new Wdb(ite+e.ne()+jte))}}else{did(a,d,e,c)}}\nfunction q6d(b){var c,d,e,f;d=BD(b,49).qh();if(d){try{e=null;c=nUd((yFd(),xFd),LEd(MEd(d)));if(c){f=c.rh();!!f&&(e=f.Wk(tfb(d.e)))}if(!!e&&e!=b){return q6d(e)}}catch(a){a=ubb(a);if(!JD(a,60))throw vbb(a)}}return b}\nfunction jrb(a,b,c){var d,e,f,g;g=b==null?0:a.b.se(b);e=(d=a.a.get(g),d==null?new Array:d);if(e.length==0){a.a.set(g,e)}else{f=grb(a,b,e);if(f){return f.ed(c)}}NC(e,e.length,new pjb(b,c));++a.c;zpb(a.b);return null}\nfunction YUc(a,b){var c,d;H2c(a.a);K2c(a.a,(PUc(),NUc),NUc);K2c(a.a,OUc,OUc);d=new j3c;e3c(d,OUc,(tVc(),sVc));PD(hkd(b,(ZWc(),LWc)))!==PD((pWc(),mWc))&&e3c(d,OUc,qVc);e3c(d,OUc,rVc);E2c(a.a,d);c=F2c(a.a,b);return c}\nfunction uC(a){if(!a){return OB(),NB}var b=a.valueOf?a.valueOf():a;if(b!==a){var c=qC[typeof b];return c?c(b):xC(typeof b)}else if(a instanceof Array||a instanceof $wnd.Array){return new xB(a)}else{return new fC(a)}}\nfunction RJb(a,b,c){var d,e,f;f=a.o;d=BD(Mpb(a.p,c),244);e=d.i;e.b=gIb(d);e.a=fIb(d);e.b=$wnd.Math.max(e.b,f.a);e.b>f.a&&!b&&(e.b=f.a);e.c=-(e.b-f.a)/2;switch(c.g){case 1:e.d=-e.a;break;case 3:e.d=f.b;}hIb(d);iIb(d)}\nfunction SJb(a,b,c){var d,e,f;f=a.o;d=BD(Mpb(a.p,c),244);e=d.i;e.b=gIb(d);e.a=fIb(d);e.a=$wnd.Math.max(e.a,f.b);e.a>f.b&&!b&&(e.a=f.b);e.d=-(e.a-f.b)/2;switch(c.g){case 4:e.c=-e.b;break;case 2:e.c=f.a;}hIb(d);iIb(d)}\nfunction Jgc(a,b){var c,d,e,f,g;if(b.dc()){return}e=BD(b.Xb(0),128);if(b.gc()==1){Igc(a,e,e,1,0,b);return}c=1;while(c0){try{f=Icb(c,Rie,Ohe)}catch(a){a=ubb(a);if(JD(a,127)){e=a;throw vbb(new rFd(e))}else throw vbb(a)}}d=(!b.a&&(b.a=new z0d(b)),b.a);return f=0?BD(qud(d,f),56):null}\nfunction Ib(a,b){if(a<0){return hc(The,OC(GC(SI,1),Uhe,1,5,['index',meb(a)]))}else if(b<0){throw vbb(new Wdb(Vhe+b))}else{return hc('%s (%s) must be less than size (%s)',OC(GC(SI,1),Uhe,1,5,['index',meb(a),meb(b)]))}}\nfunction Slb(a){var b,c,d,e,f;if(a==null){return Xhe}f=new xwb(She,'[',']');for(c=a,d=0,e=c.length;d0){g=a.c.d;h=a.d.d;e=Y6c(c7c(new f7c(h.a,h.b),g),1/(d+1));f=new f7c(g.a,g.b);for(c=new olb(a.a);c.a';throw vbb(new Wdb(d.a))}\nfunction lt(a,b){var c;b.d?(b.d.b=b.b):(a.a=b.b);b.b?(b.b.d=b.d):(a.e=b.d);if(!b.e&&!b.c){c=BD(Thb(a.b,b.a),283);c.a=0;++a.c}else{c=BD(Ohb(a.b,b.a),283);--c.a;!b.e?(c.b=b.c):(b.e.c=b.c);!b.c?(c.c=b.e):(b.c.e=b.e)}--a.d}\nfunction OA(a){var b,c;c=-a.a;b=OC(GC(TD,1),$ie,25,15,[43,48,48,48,48]);if(c<0){b[0]=45;c=-c}b[1]=b[1]+((c/60|0)/10|0)&aje;b[2]=b[2]+(c/60|0)%10&aje;b[3]=b[3]+(c%60/10|0)&aje;b[4]=b[4]+c%10&aje;return zfb(b,0,b.length)}\nfunction uRb(a,b,c){var d,e;d=b.d;e=c.d;while(d.a-e.a==0&&d.b-e.b==0){d.a+=Cub(a,26)*ike+Cub(a,27)*jke-0.5;d.b+=Cub(a,26)*ike+Cub(a,27)*jke-0.5;e.a+=Cub(a,26)*ike+Cub(a,27)*jke-0.5;e.b+=Cub(a,26)*ike+Cub(a,27)*jke-0.5}}\nfunction N_b(a){var b,c,d,e;a.g=new Rpb(BD(Qb(F1),290));d=0;c=(Ucd(),Acd);b=0;for(;b=0?a._g(c,true,true):sid(a,e,true),153));BD(d,215).ol(b)}else{throw vbb(new Wdb(ite+b.ne()+jte))}}\nfunction ugb(a){var b,c;if(a>-140737488355328&&a<140737488355328){if(a==0){return 0}b=a<0;b&&(a=-a);c=QD($wnd.Math.floor($wnd.Math.log(a)/0.6931471805599453));(!b||a!=$wnd.Math.pow(2,c))&&++c;return c}return vgb(Cbb(a))}\nfunction QOc(a){var b,c,d,e,f,g,h;f=new zsb;for(c=new olb(a);c.a2&&h.e.b+h.j.b<=2){e=h;d=g}f.a.zc(e,f);e.q=d}return f}\nfunction K5b(a,b){var c,d,e;d=new b0b(a);tNb(d,b);yNb(d,(wtc(),Gsc),b);yNb(d,(Nyc(),Vxc),(dcd(),$bd));yNb(d,mwc,(F7c(),B7c));__b(d,(j0b(),e0b));c=new H0b;F0b(c,d);G0b(c,(Ucd(),Tcd));e=new H0b;F0b(e,d);G0b(e,zcd);return d}\nfunction Spc(a){switch(a.g){case 0:return new fGc((rGc(),oGc));case 1:return new CFc;case 2:return new fHc;default:throw vbb(new Wdb('No implementation is available for the crossing minimizer '+(a.f!=null?a.f:''+a.g)));}}\nfunction tDc(a,b){var c,d,e,f,g;a.c[b.p]=true;Ekb(a.a,b);for(g=new olb(b.j);g.a=f){g.$b()}else{e=g.Kc();for(d=0;d0?zh():g<0&&Bw(a,b,-g);return true}else{return false}}\nfunction fIb(a){var b,c,d,e,f,g,h;h=0;if(a.b==0){g=jIb(a,true);b=0;for(d=g,e=0,f=d.length;e0){h+=c;++b}}b>1&&(h+=a.c*(b-1))}else{h=Mtb(Zzb(OAb(JAb(Plb(a.a),new xIb),new zIb)))}return h>0?h+a.n.d+a.n.a:0}\nfunction gIb(a){var b,c,d,e,f,g,h;h=0;if(a.b==0){h=Mtb(Zzb(OAb(JAb(Plb(a.a),new tIb),new vIb)))}else{g=kIb(a,true);b=0;for(d=g,e=0,f=d.length;e0){h+=c;++b}}b>1&&(h+=a.c*(b-1))}return h>0?h+a.n.b+a.n.c:0}\nfunction MJb(a,b){var c,d,e,f;f=BD(Mpb(a.b,b),124);c=f.a;for(e=BD(BD(Qc(a.r,b),21),84).Kc();e.Ob();){d=BD(e.Pb(),111);!!d.c&&(c.a=$wnd.Math.max(c.a,ZHb(d.c)))}if(c.a>0){switch(b.g){case 2:f.n.c=a.s;break;case 4:f.n.b=a.s;}}}\nfunction NQb(a,b){var c,d,e;c=BD(vNb(b,(wSb(),oSb)),19).a-BD(vNb(a,oSb),19).a;if(c==0){d=c7c(R6c(BD(vNb(a,(HSb(),DSb)),8)),BD(vNb(a,ESb),8));e=c7c(R6c(BD(vNb(b,DSb),8)),BD(vNb(b,ESb),8));return Kdb(d.a*d.b,e.a*e.b)}return c}\nfunction iRc(a,b){var c,d,e;c=BD(vNb(b,(JTc(),ETc)),19).a-BD(vNb(a,ETc),19).a;if(c==0){d=c7c(R6c(BD(vNb(a,(mTc(),VSc)),8)),BD(vNb(a,WSc),8));e=c7c(R6c(BD(vNb(b,VSc),8)),BD(vNb(b,WSc),8));return Kdb(d.a*d.b,e.a*e.b)}return c}\nfunction TZb(a){var b,c;c=new Ufb;c.a+='e_';b=KZb(a);b!=null&&(c.a+=''+b,c);if(!!a.c&&!!a.d){Qfb((c.a+=' ',c),C0b(a.c));Qfb(Pfb((c.a+='[',c),a.c.i),']');Qfb((c.a+=gne,c),C0b(a.d));Qfb(Pfb((c.a+='[',c),a.d.i),']')}return c.a}\nfunction zRc(a){switch(a.g){case 0:return new lUc;case 1:return new sUc;case 2:return new CUc;case 3:return new IUc;default:throw vbb(new Wdb('No implementation is available for the layout phase '+(a.f!=null?a.f:''+a.g)));}}\nfunction mfd(a,b,c,d,e){var f;f=0;switch(e.g){case 1:f=$wnd.Math.max(0,b.b+a.b-(c.b+d));break;case 3:f=$wnd.Math.max(0,-a.b-d);break;case 2:f=$wnd.Math.max(0,-a.a-d);break;case 4:f=$wnd.Math.max(0,b.a+a.a-(c.a+d));}return f}\nfunction mqd(a,b,c){var d,e,f,g,h;if(c){e=c.a.length;d=new Yge(e);for(h=(d.b-d.a)*d.c<0?(Xge(),Wge):new she(d);h.Ob();){g=BD(h.Pb(),19);f=Zpd(c,g.a);Lte in f.a||Mte in f.a?$qd(a,f,b):erd(a,f,b);otd(BD(Ohb(a.b,Wpd(f)),79))}}}\nfunction LJd(a){var b,c;switch(a.b){case -1:{return true}case 0:{c=a.t;if(c>1||c==-1){a.b=-1;return true}else{b=wId(a);if(!!b&&(Q6d(),b.Cj()==Bve)){a.b=-1;return true}else{a.b=1;return false}}}default:case 1:{return false}}}\nfunction k1d(a,b){var c,d,e,f,g;d=(!b.s&&(b.s=new cUd(t5,b,21,17)),b.s);f=null;for(e=0,g=d.i;e=0&&f=0?a._g(c,true,true):sid(a,e,true),153));return BD(d,215).ll(b)}else{throw vbb(new Wdb(ite+b.ne()+lte))}}\nfunction BZd(){tZd();var a;if(sZd)return BD(nUd((yFd(),xFd),_ve),1939);rEd(CK,new J_d);CZd();a=BD(JD(Phb((yFd(),xFd),_ve),547)?Phb(xFd,_ve):new AZd,547);sZd=true;yZd(a);zZd(a);Rhb((JFd(),IFd),a,new EZd);Shb(xFd,_ve,a);return a}\nfunction v2d(a,b){var c,d,e,f;a.j=-1;if(oid(a.e)){c=a.i;f=a.i!=0;lud(a,b);d=new pSd(a.e,3,a.c,null,b,c,f);e=b.Qk(a.e,a.c,null);e=h3d(a,b,e);if(!e){Uhd(a.e,d)}else{e.Ei(d);e.Fi()}}else{lud(a,b);e=b.Qk(a.e,a.c,null);!!e&&e.Fi()}}\nfunction rA(a,b){var c,d,e;e=0;d=b[0];if(d>=a.length){return -1}c=(BCb(d,a.length),a.charCodeAt(d));while(c>=48&&c<=57){e=e*10+(c-48);++d;if(d>=a.length){break}c=(BCb(d,a.length),a.charCodeAt(d))}d>b[0]?(b[0]=d):(e=-1);return e}\nfunction vMb(a){var b,c,d,e,f;e=BD(a.a,19).a;f=BD(a.b,19).a;c=e;d=f;b=$wnd.Math.max($wnd.Math.abs(e),$wnd.Math.abs(f));if(e<=0&&e==f){c=0;d=f-1}else{if(e==-b&&f!=b){c=f;d=e;f>=0&&++c}else{c=-f;d=e}}return new vgd(meb(c),meb(d))}\nfunction fNb(a,b,c,d){var e,f,g,h,i,j;for(e=0;e=0&&j>=0&&i=a.i)throw vbb(new qcb(lue+b+mue+a.i));if(c>=a.i)throw vbb(new qcb(nue+c+mue+a.i));d=a.g[c];if(b!=c){b>16);b=d>>16&16;c=16-b;a=a>>b;d=a-256;b=d>>16&8;c+=b;a<<=b;d=a-Rje;b=d>>16&4;c+=b;a<<=b;d=a-oie;b=d>>16&2;c+=b;a<<=b;d=a>>14;b=d&~(d>>1);return c+2-b}}\nfunction $Pb(a){QPb();var b,c,d,e;PPb=new Rkb;OPb=new Lqb;NPb=new Rkb;b=(!a.a&&(a.a=new cUd(E2,a,10,11)),a.a);SPb(b);for(e=new Fyd(b);e.e!=e.i.gc();){d=BD(Dyd(e),33);if(Jkb(PPb,d,0)==-1){c=new Rkb;Ekb(NPb,c);TPb(d,c)}}return NPb}\nfunction BQb(a,b,c){var d,e,f,g;a.a=c.b.d;if(JD(b,352)){e=itd(BD(b,79),false,false);f=ofd(e);d=new FQb(a);reb(f,d);ifd(f,e);b.We((Y9c(),Q8c))!=null&&reb(BD(b.We(Q8c),74),d)}else{g=BD(b,470);g.Hg(g.Dg()+a.a.a);g.Ig(g.Eg()+a.a.b)}}\nfunction _5b(a,b){var c,d,e,f,g,h,i,j;j=Edb(ED(vNb(b,(Nyc(),zyc))));i=a[0].n.a+a[0].o.a+a[0].d.c+j;for(h=1;h=0){return c}h=U6c(c7c(new f7c(g.c+g.b/2,g.d+g.a/2),new f7c(f.c+f.b/2,f.d+f.a/2)));return -(xOb(f,g)-1)*h}\nfunction ufd(a,b,c){var d;MAb(new YAb(null,(!c.a&&(c.a=new cUd(A2,c,6,6)),new Kub(c.a,16))),new Mfd(a,b));MAb(new YAb(null,(!c.n&&(c.n=new cUd(D2,c,1,7)),new Kub(c.n,16))),new Ofd(a,b));d=BD(hkd(c,(Y9c(),Q8c)),74);!!d&&p7c(d,a,b)}\nfunction sid(a,b,c){var d,e,f;f=e1d((O6d(),M6d),a.Tg(),b);if(f){Q6d();BD(f,66).Oj()||(f=_1d(q1d(M6d,f)));e=(d=a.Yg(f),BD(d>=0?a._g(d,true,true):sid(a,f,true),153));return BD(e,215).hl(b,c)}else{throw vbb(new Wdb(ite+b.ne()+lte))}}\nfunction wAd(a,b,c,d){var e,f,g,h,i;e=a.d[b];if(e){f=e.g;i=e.i;if(d!=null){for(h=0;h=c){d=b;j=(i.c+i.a)/2;g=j-c;if(i.c<=j-c){e=new bPc(i.c,g);Dkb(a,d++,e)}h=j+c;if(h<=i.a){f=new bPc(h,i.a);wCb(d,a.c.length);aCb(a.c,d,f)}}}\nfunction u0d(a){var b;if(!a.c&&a.g==null){a.d=a.si(a.f);wtd(a,a.d);b=a.d}else{if(a.g==null){return true}else if(a.i==0){return false}else{b=BD(a.g[a.i-1],47)}}if(b==a.b&&null.km>=null.jm()){Vud(a);return u0d(a)}else{return b.Ob()}}\nfunction KTb(a,b,c){var d,e,f,g,h;h=c;!h&&(h=Ydd(new Zdd,0));Odd(h,Vme,1);aUb(a.c,b);g=EYb(a.a,b);if(g.gc()==1){MTb(BD(g.Xb(0),37),h)}else{f=1/g.gc();for(e=g.Kc();e.Ob();){d=BD(e.Pb(),37);MTb(d,Udd(h,f))}}CYb(a.a,g,b);NTb(b);Qdd(h)}\nfunction qYb(a){this.a=a;if(a.c.i.k==(j0b(),e0b)){this.c=a.c;this.d=BD(vNb(a.c.i,(wtc(),Hsc)),61)}else if(a.d.i.k==e0b){this.c=a.d;this.d=BD(vNb(a.d.i,(wtc(),Hsc)),61)}else{throw vbb(new Wdb('Edge '+a+' is not an external edge.'))}}\nfunction oQd(a,b){var c,d,e;e=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,e,a.b));if(!b){pnd(a,null);qQd(a,0);pQd(a,null)}else if(b!=a){pnd(a,b.zb);qQd(a,b.d);c=(d=b.c,d==null?b.zb:d);pQd(a,c==null||dfb(c,b.zb)?null:c)}}\nfunction NRd(a){var b,c;if(a.f){while(a.n=g)throw vbb(new Cyd(b,g));e=c[b];if(g==1){d=null}else{d=KC($3,hve,415,g-1,0,1);$fb(c,0,d,0,b);f=g-b-1;f>0&&$fb(c,b+1,d,b,f)}b0d(a,d);a0d(a,b,e);return e}\nfunction m8d(){m8d=ccb;k8d=BD(qud(ZKd((r8d(),q8d).qb),6),34);h8d=BD(qud(ZKd(q8d.qb),3),34);i8d=BD(qud(ZKd(q8d.qb),4),34);j8d=BD(qud(ZKd(q8d.qb),5),18);XId(k8d);XId(h8d);XId(i8d);XId(j8d);l8d=new amb(OC(GC(t5,1),Mve,170,0,[k8d,h8d]))}\nfunction AJb(a,b){var c;this.d=new H_b;this.b=b;this.e=new g7c(b.qf());c=a.u.Hc((rcd(),ocd));a.u.Hc(ncd)?a.D?(this.a=c&&!b.If()):(this.a=true):a.u.Hc(pcd)?c?(this.a=!(b.zf().Kc().Ob()||b.Bf().Kc().Ob())):(this.a=false):(this.a=false)}\nfunction IKb(a,b){var c,d,e,f;c=a.o.a;for(f=BD(BD(Qc(a.r,b),21),84).Kc();f.Ob();){e=BD(f.Pb(),111);e.e.a=(d=e.b,d.Xe((Y9c(),s9c))?d.Hf()==(Ucd(),Tcd)?-d.rf().a-Edb(ED(d.We(s9c))):c+Edb(ED(d.We(s9c))):d.Hf()==(Ucd(),Tcd)?-d.rf().a:c)}}\nfunction Q1b(a,b){var c,d,e,f;c=BD(vNb(a,(Nyc(),Lwc)),103);f=BD(hkd(b,$xc),61);e=BD(vNb(a,Vxc),98);if(e!=(dcd(),bcd)&&e!=ccd){if(f==(Ucd(),Scd)){f=lfd(b,c);f==Scd&&(f=Zcd(c))}}else{d=M1b(b);d>0?(f=Zcd(c)):(f=Wcd(Zcd(c)))}jkd(b,$xc,f)}\nfunction olc(a,b){var c,d,e,f,g;g=a.j;b.a!=b.b&&Okb(g,new Ulc);e=g.c.length/2|0;for(d=0;d0&&WGc(a,c,b);return f}else if(d.a!=null){WGc(a,b,c);return -1}else if(e.a!=null){WGc(a,c,b);return 1}return 0}\nfunction swd(a,b){var c,d,e,f;if(a.ej()){c=a.Vi();f=a.fj();++a.j;a.Hi(c,a.oi(c,b));d=a.Zi(3,null,b,c,f);if(a.bj()){e=a.cj(b,null);if(!e){a.$i(d)}else{e.Ei(d);e.Fi()}}else{a.$i(d)}}else{Bvd(a,b);if(a.bj()){e=a.cj(b,null);!!e&&e.Fi()}}}\nfunction D2d(a,b){var c,d,e,f,g;g=S6d(a.e.Tg(),b);e=new yud;c=BD(a.g,119);for(f=a.i;--f>=0;){d=c[f];g.rl(d.ak())&&wtd(e,d)}!Yxd(a,e)&&oid(a.e)&&GLd(a,b.$j()?H2d(a,6,b,(mmb(),jmb),null,-1,false):H2d(a,b.Kj()?2:1,b,null,null,-1,false))}\nfunction Dhb(){Dhb=ccb;var a,b;Bhb=KC(cJ,nie,91,32,0,1);Chb=KC(cJ,nie,91,32,0,1);a=1;for(b=0;b<=18;b++){Bhb[b]=ghb(a);Chb[b]=ghb(Nbb(a,b));a=Ibb(a,5)}for(;bg){return false}}if(b.q){d=b.C;g=d.c.c.a-d.o.a/2;e=d.n.a-c;if(e>g){return false}}return true}\nfunction wcc(a,b){var c;Odd(b,'Partition preprocessing',1);c=BD(GAb(JAb(LAb(JAb(new YAb(null,new Kub(a.a,16)),new Acc),new Ccc),new Ecc),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)]))),15);MAb(c.Oc(),new Gcc);Qdd(b)}\nfunction DMc(a){wMc();var b,c,d,e,f,g,h;c=new $rb;for(e=new olb(a.e.b);e.a1?(a.e*=Edb(a.a)):(a.f/=Edb(a.a));DOb(a);EOb(a);AOb(a);yNb(a.b,(CPb(),uPb),a.g)}\nfunction Y5b(a,b,c){var d,e,f,g,h,i;d=0;i=c;if(!b){d=c*(a.c.length-1);i*=-1}for(f=new olb(a);f.a=0){if(!b){b=new Ifb;d>0&&Efb(b,a.substr(0,d))}b.a+='\\\\';Afb(b,c&aje)}else !!b&&Afb(b,c&aje)}return b?b.a:a}\nfunction l5c(a){var b;if(!a.a){throw vbb(new Zdb('IDataType class expected for layout option '+a.f))}b=gvd(a.a);if(b==null){throw vbb(new Zdb(\"Couldn't create new instance of property '\"+a.f+\"'. \"+ise+(fdb(Y3),Y3.k)+jse))}return BD(b,414)}\nfunction aid(a){var b,c,d,e,f;f=a.eh();if(f){if(f.kh()){e=xid(a,f);if(e!=f){c=a.Vg();d=(b=a.Vg(),b>=0?a.Qg(null):a.eh().ih(a,-1-b,null,null));a.Rg(BD(e,49),c);!!d&&d.Fi();a.Lg()&&a.Mg()&&c>-1&&Uhd(a,new nSd(a,9,c,f,e));return e}}}return f}\nfunction nTb(a){var b,c,d,e,f,g,h,i;g=0;f=a.f.e;for(d=0;d>5;if(e>=a.d){return a.e<0}c=a.a[e];b=1<<(b&31);if(a.e<0){d=Mgb(a);if(e>16)),15).Xc(f);if(h0){!(fad(a.a.c)&&b.n.d)&&!(gad(a.a.c)&&b.n.b)&&(b.g.d+=$wnd.Math.max(0,d/2-0.5));!(fad(a.a.c)&&b.n.a)&&!(gad(a.a.c)&&b.n.c)&&(b.g.a-=d-1)}}}\nfunction N3b(a){var b,c,d,e,f;e=new Rkb;f=O3b(a,e);b=BD(vNb(a,(wtc(),gtc)),10);if(b){for(d=new olb(b.j);d.a>b;f=a.m>>b|c<<22-b;e=a.l>>b|a.m<<22-b}else if(b<44){g=d?Fje:0;f=c>>b-22;e=a.m>>b-22|c<<44-b}else{g=d?Fje:0;f=d?Eje:0;e=c>>b-44}return TC(e&Eje,f&Eje,g&Fje)}\nfunction XOb(a){var b,c,d,e,f,g;this.c=new Rkb;this.d=a;d=Pje;e=Pje;b=Qje;c=Qje;for(g=Jsb(a,0);g.b!=g.d.c;){f=BD(Xsb(g),8);d=$wnd.Math.min(d,f.a);e=$wnd.Math.min(e,f.b);b=$wnd.Math.max(b,f.a);c=$wnd.Math.max(c,f.b)}this.a=new J6c(d,e,b-d,c-e)}\nfunction Dac(a,b){var c,d,e,f,g,h;for(f=new olb(a.b);f.a0&&JD(b,42)){a.a.qj();j=BD(b,42);i=j.cd();f=i==null?0:tb(i);g=DAd(a.a,f);c=a.a.d[g];if(c){d=BD(c.g,367);k=c.i;for(h=0;h=2){c=e.Kc();b=ED(c.Pb());while(c.Ob()){f=b;b=ED(c.Pb());d=$wnd.Math.min(d,(uCb(b),b)-(uCb(f),f))}}return d}\nfunction gUc(a,b){var c,d,e,f,g;d=new Psb;Gsb(d,b,d.c.b,d.c);do{c=(sCb(d.b!=0),BD(Nsb(d,d.a.a),86));a.b[c.g]=1;for(f=Jsb(c.d,0);f.b!=f.d.c;){e=BD(Xsb(f),188);g=e.c;a.b[g.g]==1?Dsb(a.a,e):a.b[g.g]==2?(a.b[g.g]=1):Gsb(d,g,d.c.b,d.c)}}while(d.b!=0)}\nfunction Ju(a,b){var c,d,e;if(PD(b)===PD(Qb(a))){return true}if(!JD(b,15)){return false}d=BD(b,15);e=a.gc();if(e!=d.gc()){return false}if(JD(d,54)){for(c=0;c0&&(e=c);for(g=new olb(a.f.e);g.a0){b-=1;c-=1}else{if(d>=0&&e<0){b+=1;c+=1}else{if(d>0&&e>=0){b-=1;c+=1}else{b+=1;c-=1}}}}}return new vgd(meb(b),meb(c))}\nfunction PIc(a,b){if(a.cb.c){return 1}else if(a.bb.b){return 1}else if(a.a!=b.a){return tb(a.a)-tb(b.a)}else if(a.d==(UIc(),TIc)&&b.d==SIc){return -1}else if(a.d==SIc&&b.d==TIc){return 1}return 0}\nfunction aNc(a,b){var c,d,e,f,g;f=b.a;f.c.i==b.b?(g=f.d):(g=f.c);f.c.i==b.b?(d=f.c):(d=f.d);e=NLc(a.a,g,d);if(e>0&&e0}else if(e<0&&-e0}return false}\nfunction RZc(a,b,c,d){var e,f,g,h,i,j,k,l;e=(b-a.d)/a.c.c.length;f=0;a.a+=c;a.d=b;for(l=new olb(a.c);l.a>24}return g}\nfunction vdb(a){if(a.pe()){var b=a.c;b.qe()?(a.o='['+b.n):!b.pe()?(a.o='[L'+b.ne()+';'):(a.o='['+b.ne());a.b=b.me()+'[]';a.k=b.oe()+'[]';return}var c=a.j;var d=a.d;d=d.split('/');a.o=ydb('.',[c,ydb('$',d)]);a.b=ydb('.',[c,ydb('.',d)]);a.k=d[d.length-1]}\nfunction qGb(a,b){var c,d,e,f,g;g=null;for(f=new olb(a.e.a);f.a=0;b-=2){for(c=0;c<=b;c+=2){if(a.b[c]>a.b[c+2]||a.b[c]===a.b[c+2]&&a.b[c+1]>a.b[c+3]){d=a.b[c+2];a.b[c+2]=a.b[c];a.b[c]=d;d=a.b[c+3];a.b[c+3]=a.b[c+1];a.b[c+1]=d}}}a.c=true}\nfunction UUb(a,b){var c,d,e,f,g,h,i,j;g=b==1?KUb:JUb;for(f=g.a.ec().Kc();f.Ob();){e=BD(f.Pb(),103);for(i=BD(Qc(a.f.c,e),21).Kc();i.Ob();){h=BD(i.Pb(),46);d=BD(h.b,81);j=BD(h.a,189);c=j.c;switch(e.g){case 2:case 1:d.g.d+=c;break;case 4:case 3:d.g.c+=c;}}}}\nfunction PFc(a,b){var c,d,e,f,g,h,i,j,k;j=-1;k=0;for(g=a,h=0,i=g.length;h0&&++k}}++j}return k}\nfunction Eid(a){var b,c;c=new Wfb(hdb(a.gm));c.a+='@';Qfb(c,(b=tb(a)>>>0,b.toString(16)));if(a.kh()){c.a+=' (eProxyURI: ';Pfb(c,a.qh());if(a.$g()){c.a+=' eClass: ';Pfb(c,a.$g())}c.a+=')'}else if(a.$g()){c.a+=' (eClass: ';Pfb(c,a.$g());c.a+=')'}return c.a}\nfunction TDb(a){var b,c,d,e;if(a.e){throw vbb(new Zdb((fdb(TM),Jke+TM.k+Kke)))}a.d==(ead(),cad)&&SDb(a,aad);for(c=new olb(a.a.a);c.a>24}return c}\nfunction lKb(a,b,c){var d,e,f;e=BD(Mpb(a.i,b),306);if(!e){e=new bIb(a.d,b,c);Npb(a.i,b,e);if(sJb(b)){CHb(a.a,b.c,b.b,e)}else{f=rJb(b);d=BD(Mpb(a.p,f),244);switch(f.g){case 1:case 3:e.j=true;lIb(d,b.b,e);break;case 4:case 2:e.k=true;lIb(d,b.c,e);}}}return e}\nfunction r3d(a,b,c,d){var e,f,g,h,i,j;h=new yud;i=S6d(a.e.Tg(),b);e=BD(a.g,119);Q6d();if(BD(b,66).Oj()){for(g=0;g=0){return e}else{f=1;for(h=new olb(b.j);h.a0&&b.ue((tCb(e-1,a.c.length),BD(a.c[e-1],10)),f)>0){Nkb(a,e,(tCb(e-1,a.c.length),BD(a.c[e-1],10)));--e}tCb(e,a.c.length);a.c[e]=f}c.a=new Lqb;c.b=new Lqb}\nfunction n5c(a,b,c){var d,e,f,g,h,i,j,k;k=(d=BD(b.e&&b.e(),9),new xqb(d,BD(_Bb(d,d.length),9),0));i=mfb(c,'[\\\\[\\\\]\\\\s,]+');for(f=i,g=0,h=f.length;g0){!(fad(a.a.c)&&b.n.d)&&!(gad(a.a.c)&&b.n.b)&&(b.g.d-=$wnd.Math.max(0,d/2-0.5));!(fad(a.a.c)&&b.n.a)&&!(gad(a.a.c)&&b.n.c)&&(b.g.a+=$wnd.Math.max(0,d-1))}}}\nfunction Hac(a,b,c){var d,e;if((a.c-a.b&a.a.length-1)==2){if(b==(Ucd(),Acd)||b==zcd){xac(BD(bkb(a),15),(rbd(),nbd));xac(BD(bkb(a),15),obd)}else{xac(BD(bkb(a),15),(rbd(),obd));xac(BD(bkb(a),15),nbd)}}else{for(e=new xkb(a);e.a!=e.b;){d=BD(vkb(e),15);xac(d,c)}}}\nfunction htd(a,b){var c,d,e,f,g,h,i;e=Nu(new qtd(a));h=new Bib(e,e.c.length);f=Nu(new qtd(b));i=new Bib(f,f.c.length);g=null;while(h.b>0&&i.b>0){c=(sCb(h.b>0),BD(h.a.Xb(h.c=--h.b),33));d=(sCb(i.b>0),BD(i.a.Xb(i.c=--i.b),33));if(c==d){g=c}else{break}}return g}\nfunction Cub(a,b){var c,d,e,f,g,h;f=a.a*kke+a.b*1502;h=a.b*kke+11;c=$wnd.Math.floor(h*lke);f+=c;h-=c*mke;f%=mke;a.a=f;a.b=h;if(b<=24){return $wnd.Math.floor(a.a*wub[b])}else{e=a.a*(1<=2147483648&&(d-=Zje);return d}}\nfunction Zic(a,b,c){var d,e,f,g;if(bjc(a,b)>bjc(a,c)){d=V_b(c,(Ucd(),zcd));a.d=d.dc()?0:B0b(BD(d.Xb(0),11));g=V_b(b,Tcd);a.b=g.dc()?0:B0b(BD(g.Xb(0),11))}else{e=V_b(c,(Ucd(),Tcd));a.d=e.dc()?0:B0b(BD(e.Xb(0),11));f=V_b(b,zcd);a.b=f.dc()?0:B0b(BD(f.Xb(0),11))}}\nfunction l6d(a){var b,c,d,e,f,g,h;if(a){b=a.Hh(_ve);if(b){g=GD(AAd((!b.b&&(b.b=new sId((jGd(),fGd),x6,b)),b.b),'conversionDelegates'));if(g!=null){h=new Rkb;for(d=mfb(g,'\\\\w+'),e=0,f=d.length;ea.c){break}else if(e.a>=a.s){f<0&&(f=g);h=g}}i=(a.s+a.c)/2;if(f>=0){d=NOc(a,b,f,h);i=$Oc((tCb(d,b.c.length),BD(b.c[d],329)));YOc(b,d,c)}return i}\nfunction lZc(){lZc=ccb;RYc=new Osd((Y9c(),r8c),1.3);VYc=I8c;gZc=new q0b(15);fZc=new Osd(f9c,gZc);jZc=new Osd(T9c,15);SYc=w8c;_Yc=Y8c;aZc=_8c;bZc=b9c;$Yc=W8c;cZc=e9c;hZc=x9c;eZc=(OYc(),KYc);ZYc=IYc;dZc=JYc;iZc=MYc;WYc=HYc;XYc=O8c;YYc=P8c;UYc=GYc;TYc=FYc;kZc=NYc}\nfunction Bnd(a,b,c){var d,e,f,g,h,i,j;g=(f=new RHd,f);PHd(g,(uCb(b),b));j=(!g.b&&(g.b=new sId((jGd(),fGd),x6,g)),g.b);for(i=1;i0&&JPb(this,e)}}\nfunction IQb(a,b,c,d,e,f){var g,h,i;if(!e[b.b]){e[b.b]=true;g=d;!g&&(g=new kRb);Ekb(g.e,b);for(i=f[b.b].Kc();i.Ob();){h=BD(i.Pb(),282);if(h.d==c||h.c==c){continue}h.c!=b&&IQb(a,h.c,b,g,e,f);h.d!=b&&IQb(a,h.d,b,g,e,f);Ekb(g.c,h);Gkb(g.d,h.b)}return g}return null}\nfunction e4b(a){var b,c,d,e,f,g,h;b=0;for(e=new olb(a.e);e.a=2}\nfunction gec(a,b){var c,d,e,f;Odd(b,'Self-Loop pre-processing',1);for(d=new olb(a.a);d.a1){return false}b=qqb(zbd,OC(GC(B1,1),Kie,93,0,[ybd,Bbd]));if(Ox(Cx(b,a))>1){return false}d=qqb(Gbd,OC(GC(B1,1),Kie,93,0,[Fbd,Ebd]));if(Ox(Cx(d,a))>1){return false}return true}\nfunction U0d(a,b){var c,d,e;c=b.Hh(a.a);if(c){e=GD(AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),'affiliation'));if(e!=null){d=kfb(e,wfb(35));return d==-1?l1d(a,u1d(a,bKd(b.Hj())),e):d==0?l1d(a,null,e.substr(1)):l1d(a,e.substr(0,d),e.substr(d+1))}}return null}\nfunction ic(b){var c,d,e;try{return b==null?Xhe:fcb(b)}catch(a){a=ubb(a);if(JD(a,102)){c=a;e=hdb(rb(b))+'@'+(d=(Zfb(),kCb(b))>>>0,d.toString(16));tyb(xyb(),($xb(),'Exception during lenientFormat for '+e),c);return '<'+e+' threw '+hdb(c.gm)+'>'}else throw vbb(a)}}\nfunction mzc(a){switch(a.g){case 0:return new xDc;case 1:return new ZCc;case 2:return new DCc;case 3:return new QCc;case 4:return new LDc;case 5:return new iDc;default:throw vbb(new Wdb('No implementation is available for the layerer '+(a.f!=null?a.f:''+a.g)));}}\nfunction AQc(a,b,c){var d,e,f;for(f=new olb(a.t);f.a0){d.b.n-=d.c;d.b.n<=0&&d.b.u>0&&Dsb(b,d.b)}}for(e=new olb(a.i);e.a0){d.a.u-=d.c;d.a.u<=0&&d.a.n>0&&Dsb(c,d.a)}}}\nfunction Vud(a){var b,c,d,e,f;if(a.g==null){a.d=a.si(a.f);wtd(a,a.d);if(a.c){f=a.f;return f}}b=BD(a.g[a.i-1],47);e=b.Pb();a.e=b;c=a.si(e);if(c.Ob()){a.d=c;wtd(a,c)}else{a.d=null;while(!b.Ob()){NC(a.g,--a.i,null);if(a.i==0){break}d=BD(a.g[a.i-1],47);b=d}}return e}\nfunction r2d(a,b){var c,d,e,f,g,h;d=b;e=d.ak();if(T6d(a.e,e)){if(e.hi()&&E2d(a,e,d.dd())){return false}}else{h=S6d(a.e.Tg(),e);c=BD(a.g,119);for(f=0;f1||c>1){return 2}}if(b+c==1){return 2}return 0}\nfunction WQb(a,b,c){var d,e,f,g,h;Odd(c,'ELK Force',1);Ccb(DD(hkd(b,(wSb(),jSb))))||$Cb((d=new _Cb((Pgd(),new bhd(b))),d));h=TQb(b);XQb(h);YQb(a,BD(vNb(h,fSb),424));g=LQb(a.a,h);for(f=g.Kc();f.Ob();){e=BD(f.Pb(),231);tRb(a.b,e,Udd(c,1/g.gc()))}h=KQb(g);SQb(h);Qdd(c)}\nfunction yoc(a,b){var c,d,e,f,g;Odd(b,'Breaking Point Processor',1);xoc(a);if(Ccb(DD(vNb(a,(Nyc(),Jyc))))){for(e=new olb(a.b);e.a=0?a._g(d,true,true):sid(a,f,true),153));BD(e,215).ml(b,c)}else{throw vbb(new Wdb(ite+b.ne()+jte))}}\nfunction ROc(a,b){var c,d,e,f,g;c=new Rkb;e=LAb(new YAb(null,new Kub(a,16)),new iPc);f=LAb(new YAb(null,new Kub(a,16)),new kPc);g=aAb(_zb(OAb(ty(OC(GC(xM,1),Uhe,833,0,[e,f])),new mPc)));for(d=1;d=2*b&&Ekb(c,new bPc(g[d-1]+b,g[d]-b))}return c}\nfunction AXc(a,b,c){Odd(c,'Eades radial',1);c.n&&!!b&&Tdd(c,i6d(b),(pgd(),mgd));a.d=BD(hkd(b,(MUc(),LUc)),33);a.c=Edb(ED(hkd(b,(ZWc(),VWc))));a.e=tXc(BD(hkd(b,WWc),293));a.a=gWc(BD(hkd(b,YWc),426));a.b=jXc(BD(hkd(b,RWc),340));BXc(a);c.n&&!!b&&Tdd(c,i6d(b),(pgd(),mgd))}\nfunction Fqd(a,b,c){var d,e,f,g,h,j,k,l;if(c){f=c.a.length;d=new Yge(f);for(h=(d.b-d.a)*d.c<0?(Xge(),Wge):new she(d);h.Ob();){g=BD(h.Pb(),19);e=Zpd(c,g.a);!!e&&(i=null,j=Uqd(a,(k=(Fhd(),l=new ppd,l),!!b&&npd(k,b),k),e),Lkd(j,_pd(e,Vte)),grd(e,j),hrd(e,j),crd(a,e,j))}}}\nfunction UKd(a){var b,c,d,e,f,g;if(!a.j){g=new HPd;b=KKd;f=b.a.zc(a,b);if(f==null){for(d=new Fyd(_Kd(a));d.e!=d.i.gc();){c=BD(Dyd(d),26);e=UKd(c);ytd(g,e);wtd(g,c)}b.a.Bc(a)!=null}vud(g);a.j=new nNd((BD(qud(ZKd((NFd(),MFd).o),11),18),g.i),g.g);$Kd(a).b&=-33}return a.j}\nfunction O9d(a){var b,c,d,e;if(a==null){return null}else{d=Qge(a,true);e=Nwe.length;if(dfb(d.substr(d.length-e,e),Nwe)){c=d.length;if(c==4){b=(BCb(0,d.length),d.charCodeAt(0));if(b==43){return z9d}else if(b==45){return y9d}}else if(c==3){return z9d}}return new Odb(d)}}\nfunction _C(a){var b,c,d;c=a.l;if((c&c-1)!=0){return -1}d=a.m;if((d&d-1)!=0){return -1}b=a.h;if((b&b-1)!=0){return -1}if(b==0&&d==0&&c==0){return -1}if(b==0&&d==0&&c!=0){return ieb(c)}if(b==0&&d!=0&&c==0){return ieb(d)+22}if(b!=0&&d==0&&c==0){return ieb(b)+44}return -1}\nfunction qbc(a,b){var c,d,e,f,g;Odd(b,'Edge joining',1);c=Ccb(DD(vNb(a,(Nyc(),Byc))));for(e=new olb(a.b);e.a1){for(e=new olb(a.a);e.a0);f.a.Xb(f.c=--f.b);Aib(f,e);sCb(f.b3&&EA(a,0,b-3)}}\nfunction cUb(a){var b,c,d,e;if(PD(vNb(a,(Nyc(),axc)))===PD((hbd(),ebd))){return !a.e&&PD(vNb(a,Cwc))!==PD((Xrc(),Urc))}d=BD(vNb(a,Dwc),292);e=Ccb(DD(vNb(a,Hwc)))||PD(vNb(a,Iwc))===PD((Rpc(),Opc));b=BD(vNb(a,Bwc),19).a;c=a.a.c.length;return !e&&d!=(Xrc(),Urc)&&(b==0||b>c)}\nfunction lkc(a){var b,c;c=0;for(;c0){break}}if(c>0&&c0){break}}if(b>0&&c>16!=6&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+qmd(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?cmd(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,6,d));d=bmd(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,6,b,b))}\nfunction npd(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=9&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+opd(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?lpd(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,9,d));d=kpd(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,9,b,b))}\nfunction Rld(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=3&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+Sld(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?Lld(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,12,d));d=Kld(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,b,b))}\nfunction VId(b){var c,d,e,f,g;e=wId(b);g=b.j;if(g==null&&!!e){return b.$j()?null:e.zj()}else if(JD(e,148)){d=e.Aj();if(d){f=d.Nh();if(f!=b.i){c=BD(e,148);if(c.Ej()){try{b.g=f.Kh(c,g)}catch(a){a=ubb(a);if(JD(a,78)){b.g=null}else throw vbb(a)}}b.i=f}}return b.g}return null}\nfunction wOb(a){var b;b=new Rkb;Ekb(b,new aDb(new f7c(a.c,a.d),new f7c(a.c+a.b,a.d)));Ekb(b,new aDb(new f7c(a.c,a.d),new f7c(a.c,a.d+a.a)));Ekb(b,new aDb(new f7c(a.c+a.b,a.d+a.a),new f7c(a.c+a.b,a.d)));Ekb(b,new aDb(new f7c(a.c+a.b,a.d+a.a),new f7c(a.c,a.d+a.a)));return b}\nfunction IJc(a,b,c,d){var e,f,g;g=LZb(b,c);d.c[d.c.length]=b;if(a.j[g.p]==-1||a.j[g.p]==2||a.a[b.p]){return d}a.j[g.p]=-1;for(f=new Sr(ur(O_b(g).a.Kc(),new Sq));Qr(f);){e=BD(Rr(f),17);if(!(!OZb(e)&&!(!OZb(e)&&e.c.i.c==e.d.i.c))||e==b){continue}return IJc(a,e,g,d)}return d}\nfunction vQb(a,b,c){var d,e,f;for(f=b.a.ec().Kc();f.Ob();){e=BD(f.Pb(),79);d=BD(Ohb(a.b,e),266);!d&&(Xod(jtd(e))==Xod(ltd(e))?uQb(a,e,c):jtd(e)==Xod(ltd(e))?Ohb(a.c,e)==null&&Ohb(a.b,ltd(e))!=null&&xQb(a,e,c,false):Ohb(a.d,e)==null&&Ohb(a.b,jtd(e))!=null&&xQb(a,e,c,true))}}\nfunction jcc(a,b){var c,d,e,f,g,h,i;for(e=a.Kc();e.Ob();){d=BD(e.Pb(),10);h=new H0b;F0b(h,d);G0b(h,(Ucd(),zcd));yNb(h,(wtc(),ftc),(Bcb(),true));for(g=b.Kc();g.Ob();){f=BD(g.Pb(),10);i=new H0b;F0b(i,f);G0b(i,Tcd);yNb(i,ftc,true);c=new UZb;yNb(c,ftc,true);QZb(c,h);RZb(c,i)}}}\nfunction jnc(a,b,c,d){var e,f,g,h;e=hnc(a,b,c);f=hnc(a,c,b);g=BD(Ohb(a.c,b),112);h=BD(Ohb(a.c,c),112);if(ed.b.g&&(f.c[f.c.length]=d,true)}}return f}\nfunction k$c(){k$c=ccb;g$c=new l$c('CANDIDATE_POSITION_LAST_PLACED_RIGHT',0);f$c=new l$c('CANDIDATE_POSITION_LAST_PLACED_BELOW',1);i$c=new l$c('CANDIDATE_POSITION_WHOLE_DRAWING_RIGHT',2);h$c=new l$c('CANDIDATE_POSITION_WHOLE_DRAWING_BELOW',3);j$c=new l$c('WHOLE_DRAWING',4)}\nfunction Xqd(a,b){if(JD(b,239)){return iqd(a,BD(b,33))}else if(JD(b,186)){return jqd(a,BD(b,118))}else if(JD(b,354)){return hqd(a,BD(b,137))}else if(JD(b,352)){return gqd(a,BD(b,79))}else if(b){return null}else{throw vbb(new Wdb(Xte+Fe(new amb(OC(GC(SI,1),Uhe,1,5,[b])))))}}\nfunction aic(a){var b,c,d,e,f,g,h;f=new Psb;for(e=new olb(a.d.a);e.a1){b=nGb((c=new pGb,++a.b,c),a.d);for(h=Jsb(f,0);h.b!=h.d.c;){g=BD(Xsb(h),121);AFb(DFb(CFb(EFb(BFb(new FFb,1),0),b),g))}}}\nfunction $od(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=11&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+_od(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?Uod(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,10,d));d=Tod(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,11,b,b))}\nfunction uZb(a){var b,c,d,e;for(d=new nib((new eib(a.b)).a);d.b;){c=lib(d);e=BD(c.cd(),11);b=BD(c.dd(),10);yNb(b,(wtc(),$sc),e);yNb(e,gtc,b);yNb(e,Nsc,(Bcb(),true));G0b(e,BD(vNb(b,Hsc),61));vNb(b,Hsc);yNb(e.i,(Nyc(),Vxc),(dcd(),acd));BD(vNb(Q_b(e.i),Ksc),21).Fc((Orc(),Krc))}}\nfunction G4b(a,b,c){var d,e,f,g,h,i;f=0;g=0;if(a.c){for(i=new olb(a.d.i.j);i.af.a){return -1}else if(e.ai){k=a.d;a.d=KC(y4,jve,63,2*i+4,0,1);for(f=0;f=9223372036854775807){return wD(),sD}e=false;if(a<0){e=true;a=-a}d=0;if(a>=Ije){d=QD(a/Ije);a-=d*Ije}c=0;if(a>=Hje){c=QD(a/Hje);a-=c*Hje}b=QD(a);f=TC(b,c,d);e&&ZC(f);return f}\nfunction rKb(a,b){var c,d,e,f;c=!b||!a.u.Hc((rcd(),ncd));f=0;for(e=new olb(a.e.Cf());e.a=-b&&d==b){return new vgd(meb(c-1),meb(d))}return new vgd(meb(c),meb(d-1))}\nfunction W8b(){S8b();return OC(GC(AS,1),Kie,77,0,[Y7b,V7b,Z7b,n8b,G8b,r8b,M8b,w8b,E8b,i8b,A8b,v8b,F8b,e8b,O8b,P7b,z8b,I8b,o8b,H8b,Q8b,C8b,Q7b,D8b,R8b,K8b,P8b,p8b,b8b,q8b,m8b,N8b,T7b,_7b,t8b,S7b,u8b,k8b,f8b,x8b,h8b,W7b,U7b,l8b,g8b,y8b,L8b,R7b,B8b,j8b,s8b,c8b,a8b,J8b,$7b,d8b,X7b])}\nfunction Yic(a,b,c){a.d=0;a.b=0;b.k==(j0b(),i0b)&&c.k==i0b&&BD(vNb(b,(wtc(),$sc)),10)==BD(vNb(c,$sc),10)&&(ajc(b).j==(Ucd(),Acd)?Zic(a,b,c):Zic(a,c,b));b.k==i0b&&c.k==g0b?ajc(b).j==(Ucd(),Acd)?(a.d=1):(a.b=1):c.k==i0b&&b.k==g0b&&(ajc(c).j==(Ucd(),Acd)?(a.b=1):(a.d=1));cjc(a,b,c)}\nfunction esd(a){var b,c,d,e,f,g,h,i,j,k,l;l=hsd(a);b=a.a;i=b!=null;i&&Upd(l,'category',a.a);e=Fhe(new Pib(a.d));g=!e;if(g){j=new wB;cC(l,'knownOptions',j);c=new msd(j);reb(new Pib(a.d),c)}f=Fhe(a.g);h=!f;if(h){k=new wB;cC(l,'supportedFeatures',k);d=new osd(k);reb(a.g,d)}return l}\nfunction ty(a){var b,c,d,e,f,g,h,i,j;d=false;b=336;c=0;f=new Xp(a.length);for(h=a,i=0,j=h.length;i>16!=7&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+Iod(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?Eod(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=BD(b,49).gh(a,1,C2,d));d=Dod(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,7,b,b))}\nfunction NHd(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=3&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+QHd(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?KHd(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=BD(b,49).gh(a,0,k5,d));d=JHd(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,b,b))}\nfunction Ehb(a,b){Dhb();var c,d,e,f,g,h,i,j,k;if(b.d>a.d){h=a;a=b;b=h}if(b.d<63){return Ihb(a,b)}g=(a.d&-2)<<4;j=Rgb(a,g);k=Rgb(b,g);d=yhb(a,Qgb(j,g));e=yhb(b,Qgb(k,g));i=Ehb(j,k);c=Ehb(d,e);f=Ehb(yhb(j,d),yhb(e,k));f=thb(thb(f,i),c);f=Qgb(f,g);i=Qgb(i,g<<1);return thb(thb(i,f),c)}\nfunction aGc(a,b,c){var d,e,f,g,h;g=CHc(a,c);h=KC(OQ,kne,10,b.length,0,1);d=0;for(f=g.Kc();f.Ob();){e=BD(f.Pb(),11);Ccb(DD(vNb(e,(wtc(),Nsc))))&&(h[d++]=BD(vNb(e,gtc),10))}if(d=0;f+=c?1:-1){g=g|b.c.Sf(i,f,c,d&&!Ccb(DD(vNb(b.j,(wtc(),Jsc))))&&!Ccb(DD(vNb(b.j,(wtc(),mtc)))));g=g|b.q._f(i,f,c);g=g|cGc(a,i[f],c,d)}Qqb(a.c,b);return g}\nfunction o3b(a,b,c){var d,e,f,g,h,i,j,k,l,m;for(k=m_b(a.j),l=0,m=k.length;l1&&(a.a=true);ZNb(BD(c.b,65),P6c(R6c(BD(b.b,65).c),Y6c(c7c(R6c(BD(c.b,65).a),BD(b.b,65).a),e)));D1c(a,b);F1c(a,c)}}\nfunction rVb(a){var b,c,d,e,f,g,h;for(f=new olb(a.a.a);f.a0&&f>0?(g.p=b++):d>0?(g.p=c++):f>0?(g.p=e++):(g.p=c++);}}mmb();Okb(a.j,new fcc)}\nfunction Vec(a){var b,c;c=null;b=BD(Ikb(a.g,0),17);do{c=b.d.i;if(wNb(c,(wtc(),Wsc))){return BD(vNb(c,Wsc),11).i}if(c.k!=(j0b(),h0b)&&Qr(new Sr(ur(U_b(c).a.Kc(),new Sq)))){b=BD(Rr(new Sr(ur(U_b(c).a.Kc(),new Sq))),17)}else if(c.k!=h0b){return null}}while(!!c&&c.k!=(j0b(),h0b));return c}\nfunction Omc(a,b){var c,d,e,f,g,h,i,j,k;h=b.j;g=b.g;i=BD(Ikb(h,h.c.length-1),113);k=(tCb(0,h.c.length),BD(h.c[0],113));j=Kmc(a,g,i,k);for(f=1;fj){i=c;k=e;j=d}}b.a=k;b.c=i}\nfunction sEb(a,b){var c,d;d=Axb(a.b,b.b);if(!d){throw vbb(new Zdb('Invalid hitboxes for scanline constraint calculation.'))}(mEb(b.b,BD(Cxb(a.b,b.b),57))||mEb(b.b,BD(Bxb(a.b,b.b),57)))&&(Zfb(),b.b+' has overlap.');a.a[b.b.f]=BD(Exb(a.b,b.b),57);c=BD(Dxb(a.b,b.b),57);!!c&&(a.a[c.f]=b.b)}\nfunction AFb(a){if(!a.a.d||!a.a.e){throw vbb(new Zdb((fdb(fN),fN.k+' must have a source and target '+(fdb(jN),jN.k)+' specified.')))}if(a.a.d==a.a.e){throw vbb(new Zdb('Network simplex does not support self-loops: '+a.a+' '+a.a.d+' '+a.a.e))}NFb(a.a.d.g,a.a);NFb(a.a.e.b,a.a);return a.a}\nfunction HHc(a,b,c){var d,e,f,g,h,i,j;j=new Hxb(new tIc(a));for(g=OC(GC(aR,1),lne,11,0,[b,c]),h=0,i=g.length;hi-a.b&&hi-a.a&&h0&&++n}}}++m}return n}\nfunction hUc(a,b){var c,d,e,f,g;g=BD(vNb(b,(JTc(),FTc)),425);for(f=Jsb(b.b,0);f.b!=f.d.c;){e=BD(Xsb(f),86);if(a.b[e.g]==0){switch(g.g){case 0:iUc(a,e);break;case 1:gUc(a,e);}a.b[e.g]=2}}for(d=Jsb(a.a,0);d.b!=d.d.c;){c=BD(Xsb(d),188);ze(c.b.d,c,true);ze(c.c.b,c,true)}yNb(b,(mTc(),gTc),a.a)}\nfunction S6d(a,b){Q6d();var c,d,e,f;if(!b){return P6d}else if(b==(Q8d(),N8d)||(b==v8d||b==t8d||b==u8d)&&a!=s8d){return new Z6d(a,b)}else{d=BD(b,677);c=d.pk();if(!c){a2d(q1d((O6d(),M6d),b));c=d.pk()}f=(!c.i&&(c.i=new Lqb),c.i);e=BD(Wd(irb(f.f,a)),1942);!e&&Rhb(f,a,e=new Z6d(a,b));return e}}\nfunction Tbc(a,b){var c,d,e,f,g,h,i,j,k;i=BD(vNb(a,(wtc(),$sc)),11);j=l7c(OC(GC(m1,1),nie,8,0,[i.i.n,i.n,i.a])).a;k=a.i.n.b;c=k_b(a.e);for(e=c,f=0,g=e.length;f0){if(f.a){h=f.b.rf().a;if(c>h){e=(c-h)/2;f.d.b=e;f.d.c=e}}else{f.d.c=a.s+c}}else if(tcd(a.u)){d=sfd(f.b);d.c<0&&(f.d.b=-d.c);d.c+d.b>f.b.rf().a&&(f.d.c=d.c+d.b-f.b.rf().a)}}}\nfunction Eec(a,b){var c,d,e,f;Odd(b,'Semi-Interactive Crossing Minimization Processor',1);c=false;for(e=new olb(a.b);e.a=0){if(b==c){return new vgd(meb(-b-1),meb(-b-1))}if(b==-c){return new vgd(meb(-b),meb(c+1))}}if($wnd.Math.abs(b)>$wnd.Math.abs(c)){if(b<0){return new vgd(meb(-b),meb(c))}return new vgd(meb(-b),meb(c+1))}return new vgd(meb(b+1),meb(c))}\nfunction q5b(a){var b,c;c=BD(vNb(a,(Nyc(),mxc)),163);b=BD(vNb(a,(wtc(),Osc)),303);if(c==(Ctc(),ytc)){yNb(a,mxc,Btc);yNb(a,Osc,(esc(),dsc))}else if(c==Atc){yNb(a,mxc,Btc);yNb(a,Osc,(esc(),bsc))}else if(b==(esc(),dsc)){yNb(a,mxc,ytc);yNb(a,Osc,csc)}else if(b==bsc){yNb(a,mxc,Atc);yNb(a,Osc,csc)}}\nfunction FNc(){FNc=ccb;DNc=new RNc;zNc=e3c(new j3c,(qUb(),nUb),(S8b(),o8b));CNc=c3c(e3c(new j3c,nUb,C8b),pUb,B8b);ENc=b3c(b3c(g3c(c3c(e3c(new j3c,lUb,M8b),pUb,L8b),oUb),K8b),N8b);ANc=c3c(e3c(e3c(e3c(new j3c,mUb,r8b),oUb,t8b),oUb,u8b),pUb,s8b);BNc=c3c(e3c(e3c(new j3c,oUb,u8b),oUb,_7b),pUb,$7b)}\nfunction hQc(){hQc=ccb;cQc=e3c(c3c(new j3c,(qUb(),pUb),(S8b(),c8b)),nUb,o8b);gQc=b3c(b3c(g3c(c3c(e3c(new j3c,lUb,M8b),pUb,L8b),oUb),K8b),N8b);dQc=c3c(e3c(e3c(e3c(new j3c,mUb,r8b),oUb,t8b),oUb,u8b),pUb,s8b);fQc=e3c(e3c(new j3c,nUb,C8b),pUb,B8b);eQc=c3c(e3c(e3c(new j3c,oUb,u8b),oUb,_7b),pUb,$7b)}\nfunction GNc(a,b,c,d,e){var f,g;if((!OZb(b)&&b.c.i.c==b.d.i.c||!T6c(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])),c))&&!OZb(b)){b.c==e?St(b.a,0,new g7c(c)):Dsb(b.a,new g7c(c));if(d&&!Rqb(a.a,c)){g=BD(vNb(b,(Nyc(),jxc)),74);if(!g){g=new s7c;yNb(b,jxc,g)}f=new g7c(c);Gsb(g,f,g.c.b,g.c);Qqb(a.a,f)}}}\nfunction Qac(a){var b,c;for(c=new Sr(ur(R_b(a).a.Kc(),new Sq));Qr(c);){b=BD(Rr(c),17);if(b.c.i.k!=(j0b(),f0b)){throw vbb(new y2c(Fne+P_b(a)+\"' has its layer constraint set to FIRST, but has at least one incoming edge that \"+' does not come from a FIRST_SEPARATE node. That must not happen.'))}}}\nfunction vjd(a,b,c){var d,e,f,g,h,i,j;e=aeb(a.Db&254);if(e==0){a.Eb=c}else{if(e==1){h=KC(SI,Uhe,1,2,5,1);f=zjd(a,b);if(f==0){h[0]=c;h[1]=a.Eb}else{h[0]=a.Eb;h[1]=c}}else{h=KC(SI,Uhe,1,e+1,5,1);g=CD(a.Eb);for(d=2,i=0,j=0;d<=128;d<<=1){d==b?(h[j++]=c):(a.Db&d)!=0&&(h[j++]=g[i++])}}a.Eb=h}a.Db|=b}\nfunction ENb(a,b,c){var d,e,f,g;this.b=new Rkb;e=0;d=0;for(g=new olb(a);g.a0){f=BD(Ikb(this.b,0),167);e+=f.o;d+=f.p}e*=2;d*=2;b>1?(e=QD($wnd.Math.ceil(e*b))):(d=QD($wnd.Math.ceil(d/b)));this.a=new pNb(e,d)}\nfunction Igc(a,b,c,d,e,f){var g,h,i,j,k,l,m,n,o,p,q,r;k=d;if(b.j&&b.o){n=BD(Ohb(a.f,b.A),57);p=n.d.c+n.d.b;--k}else{p=b.a.c+b.a.b}l=e;if(c.q&&c.o){n=BD(Ohb(a.f,c.C),57);j=n.d.c;++l}else{j=c.a.c}q=j-p;i=$wnd.Math.max(2,l-k);h=q/i;o=p+h;for(m=k;m=0;g+=e?1:-1){h=b[g];i=d==(Ucd(),zcd)?e?V_b(h,d):Su(V_b(h,d)):e?Su(V_b(h,d)):V_b(h,d);f&&(a.c[h.p]=i.gc());for(l=i.Kc();l.Ob();){k=BD(l.Pb(),11);a.d[k.p]=j++}Gkb(c,i)}}\nfunction aQc(a,b,c){var d,e,f,g,h,i,j,k;f=Edb(ED(a.b.Kc().Pb()));j=Edb(ED(Pq(b.b)));d=Y6c(R6c(a.a),j-c);e=Y6c(R6c(b.a),c-f);k=P6c(d,e);Y6c(k,1/(j-f));this.a=k;this.b=new Rkb;h=true;g=a.b.Kc();g.Pb();while(g.Ob()){i=Edb(ED(g.Pb()));if(h&&i-c>Oqe){this.b.Fc(c);h=false}this.b.Fc(i)}h&&this.b.Fc(c)}\nfunction vGb(a){var b,c,d,e;yGb(a,a.n);if(a.d.c.length>0){Blb(a.c);while(GGb(a,BD(mlb(new olb(a.e.a)),121))>5;b&=31;if(d>=a.d){return a.e<0?(Hgb(),Bgb):(Hgb(),Ggb)}f=a.d-d;e=KC(WD,oje,25,f+1,15,1);mhb(e,f,a.a,d,b);if(a.e<0){for(c=0;c0&&a.a[c]<<32-b!=0){for(c=0;c=0){return false}else{c=e1d((O6d(),M6d),e,b);if(!c){return true}else{d=c.Zj();return (d>1||d==-1)&&$1d(q1d(M6d,c))!=3}}}}else{return false}}\nfunction R1b(a,b,c,d){var e,f,g,h,i;h=atd(BD(qud((!b.b&&(b.b=new y5d(z2,b,4,7)),b.b),0),82));i=atd(BD(qud((!b.c&&(b.c=new y5d(z2,b,5,8)),b.c),0),82));if(Xod(h)==Xod(i)){return null}if(ntd(i,h)){return null}g=Mld(b);if(g==c){return d}else{f=BD(Ohb(a.a,g),10);if(f){e=f.e;if(e){return e}}}return null}\nfunction Cac(a,b){var c;c=BD(vNb(a,(Nyc(),Rwc)),276);Odd(b,'Label side selection ('+c+')',1);switch(c.g){case 0:Dac(a,(rbd(),nbd));break;case 1:Dac(a,(rbd(),obd));break;case 2:Bac(a,(rbd(),nbd));break;case 3:Bac(a,(rbd(),obd));break;case 4:Eac(a,(rbd(),nbd));break;case 5:Eac(a,(rbd(),obd));}Qdd(b)}\nfunction bGc(a,b,c){var d,e,f,g,h,i;d=RFc(c,a.length);g=a[d];if(g[0].k!=(j0b(),e0b)){return}f=SFc(c,g.length);i=b.j;for(e=0;e0){c[0]+=a.d;g-=c[0]}if(c[2]>0){c[2]+=a.d;g-=c[2]}f=$wnd.Math.max(0,g);c[1]=$wnd.Math.max(c[1],g);vHb(a,eHb,e.c+d.b+c[0]-(c[1]-g)/2,c);if(b==eHb){a.c.b=f;a.c.c=e.c+d.b+(f-g)/2}}\nfunction AYb(){this.c=KC(UD,Vje,25,(Ucd(),OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])).length,15,1);this.b=KC(UD,Vje,25,OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd]).length,15,1);this.a=KC(UD,Vje,25,OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd]).length,15,1);zlb(this.c,Pje);zlb(this.b,Qje);zlb(this.a,Qje)}\nfunction Ufe(a,b,c){var d,e,f,g;if(b<=c){e=b;f=c}else{e=c;f=b}d=0;if(a.b==null){a.b=KC(WD,oje,25,2,15,1);a.b[0]=e;a.b[1]=f;a.c=true}else{d=a.b.length;if(a.b[d-1]+1==e){a.b[d-1]=f;return}g=KC(WD,oje,25,d+2,15,1);$fb(a.b,0,g,0,d);a.b=g;a.b[d-1]>=e&&(a.c=false,a.a=false);a.b[d++]=e;a.b[d]=f;a.c||Yfe(a)}}\nfunction inc(a,b,c){var d,e,f,g,h,i,j;j=b.d;a.a=new Skb(j.c.length);a.c=new Lqb;for(h=new olb(j);h.a=0?a._g(j,false,true):sid(a,c,false),58));n:for(f=l.Kc();f.Ob();){e=BD(f.Pb(),56);for(k=0;k1){Xxd(e,e.i-1)}}return d}}\nfunction Z2b(a,b){var c,d,e,f,g,h,i;Odd(b,'Comment post-processing',1);for(f=new olb(a.b);f.aa.d[g.p]){c+=zHc(a.b,f);Wjb(a.a,meb(f))}}while(!akb(a.a)){xHc(a.b,BD(fkb(a.a),19).a)}}return c}\nfunction o2c(a,b,c){var d,e,f,g;f=(!b.a&&(b.a=new cUd(E2,b,10,11)),b.a).i;for(e=new Fyd((!b.a&&(b.a=new cUd(E2,b,10,11)),b.a));e.e!=e.i.gc();){d=BD(Dyd(e),33);(!d.a&&(d.a=new cUd(E2,d,10,11)),d.a).i==0||(f+=o2c(a,d,false))}if(c){g=Xod(b);while(g){f+=(!g.a&&(g.a=new cUd(E2,g,10,11)),g.a).i;g=Xod(g)}}return f}\nfunction Xxd(a,b){var c,d,e,f;if(a.ej()){d=null;e=a.fj();a.ij()&&(d=a.kj(a.pi(b),null));c=a.Zi(4,f=tud(a,b),null,b,e);if(a.bj()&&f!=null){d=a.dj(f,d);if(!d){a.$i(c)}else{d.Ei(c);d.Fi()}}else{if(!d){a.$i(c)}else{d.Ei(c);d.Fi()}}return f}else{f=tud(a,b);if(a.bj()&&f!=null){d=a.dj(f,null);!!d&&d.Fi()}return f}}\nfunction UKb(a){var b,c,d,e,f,g,h,i,j,k;j=a.a;b=new Tqb;i=0;for(d=new olb(a.d);d.ah.d&&(k=h.d+h.a+j)}}c.c.d=k;b.a.zc(c,b);i=$wnd.Math.max(i,c.c.d+c.c.a)}return i}\nfunction Orc(){Orc=ccb;Frc=new Prc('COMMENTS',0);Hrc=new Prc('EXTERNAL_PORTS',1);Irc=new Prc('HYPEREDGES',2);Jrc=new Prc('HYPERNODES',3);Krc=new Prc('NON_FREE_PORTS',4);Lrc=new Prc('NORTH_SOUTH_PORTS',5);Nrc=new Prc(Wne,6);Erc=new Prc('CENTER_LABELS',7);Grc=new Prc('END_LABELS',8);Mrc=new Prc('PARTITIONS',9)}\nfunction gVc(a){var b,c,d,e,f;e=new Rkb;b=new Vqb((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));for(d=new Sr(ur(_sd(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),79);if(!JD(qud((!c.b&&(c.b=new y5d(z2,c,4,7)),c.b),0),186)){f=atd(BD(qud((!c.c&&(c.c=new y5d(z2,c,5,8)),c.c),0),82));b.a._b(f)||(e.c[e.c.length]=f,true)}}return e}\nfunction fVc(a){var b,c,d,e,f,g;f=new Tqb;b=new Vqb((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));for(e=new Sr(ur(_sd(a).a.Kc(),new Sq));Qr(e);){d=BD(Rr(e),79);if(!JD(qud((!d.b&&(d.b=new y5d(z2,d,4,7)),d.b),0),186)){g=atd(BD(qud((!d.c&&(d.c=new y5d(z2,d,5,8)),d.c),0),82));b.a._b(g)||(c=f.a.zc(g,f),c==null)}}return f}\nfunction zA(a,b,c,d,e){if(d<0){d=oA(a,e,OC(GC(ZI,1),nie,2,6,[bje,cje,dje,eje,fje,gje,hje,ije,jje,kje,lje,mje]),b);d<0&&(d=oA(a,e,OC(GC(ZI,1),nie,2,6,['Jan','Feb','Mar','Apr',fje,'Jun','Jul','Aug','Sep','Oct','Nov','Dec']),b));if(d<0){return false}c.k=d;return true}else if(d>0){c.k=d-1;return true}return false}\nfunction BA(a,b,c,d,e){if(d<0){d=oA(a,e,OC(GC(ZI,1),nie,2,6,[bje,cje,dje,eje,fje,gje,hje,ije,jje,kje,lje,mje]),b);d<0&&(d=oA(a,e,OC(GC(ZI,1),nie,2,6,['Jan','Feb','Mar','Apr',fje,'Jun','Jul','Aug','Sep','Oct','Nov','Dec']),b));if(d<0){return false}c.k=d;return true}else if(d>0){c.k=d-1;return true}return false}\nfunction DA(a,b,c,d,e,f){var g,h,i,j;h=32;if(d<0){if(b[0]>=a.length){return false}h=bfb(a,b[0]);if(h!=43&&h!=45){return false}++b[0];d=rA(a,b);if(d<0){return false}h==45&&(d=-d)}if(h==32&&b[0]-c==2&&e.b==2){i=new eB;j=i.q.getFullYear()-nje+nje-80;g=j%100;f.a=d==g;d+=(j/100|0)*100+(d=j&&(i=d)}!!i&&(k=$wnd.Math.max(k,i.a.o.a));if(k>m){l=j;m=k}}return l}\nfunction ode(a,b,c){var d,e,f;a.e=c;a.d=0;a.b=0;a.f=1;a.i=b;(a.e&16)==16&&(a.i=Xee(a.i));a.j=a.i.length;nde(a);f=rde(a);if(a.d!=a.j)throw vbb(new mde(tvd((h0d(),sue))));if(a.g){for(d=0;dvre?Okb(i,a.b):d<=vre&&d>wre?Okb(i,a.d):d<=wre&&d>xre?Okb(i,a.c):d<=xre&&Okb(i,a.a);f=ZXc(a,i,f)}return e}\nfunction Hgb(){Hgb=ccb;var a;Cgb=new Ugb(1,1);Egb=new Ugb(1,10);Ggb=new Ugb(0,0);Bgb=new Ugb(-1,1);Dgb=OC(GC(cJ,1),nie,91,0,[Ggb,Cgb,new Ugb(1,2),new Ugb(1,3),new Ugb(1,4),new Ugb(1,5),new Ugb(1,6),new Ugb(1,7),new Ugb(1,8),new Ugb(1,9),Egb]);Fgb=KC(cJ,nie,91,32,0,1);for(a=0;a1;if(h){d=new f7c(e,c.b);Dsb(b.a,d)}n7c(b.a,OC(GC(m1,1),nie,8,0,[m,l]))}\nfunction jdd(a){r4c(a,new E3c(P3c(M3c(O3c(N3c(new R3c,Rse),'ELK Randomizer'),'Distributes the nodes randomly on the plane, leading to very obfuscating layouts. Can be useful to demonstrate the power of \"real\" layout algorithms.'),new mdd)));p4c(a,Rse,ame,fdd);p4c(a,Rse,wme,15);p4c(a,Rse,yme,meb(0));p4c(a,Rse,_le,tme)}\nfunction hde(){hde=ccb;var a,b,c,d,e,f;fde=KC(SD,wte,25,255,15,1);gde=KC(TD,$ie,25,16,15,1);for(b=0;b<255;b++){fde[b]=-1}for(c=57;c>=48;c--){fde[c]=c-48<<24>>24}for(d=70;d>=65;d--){fde[d]=d-65+10<<24>>24}for(e=102;e>=97;e--){fde[e]=e-97+10<<24>>24}for(f=0;f<10;f++)gde[f]=48+f&aje;for(a=10;a<=15;a++)gde[a]=65+a-10&aje}\nfunction BVc(a,b,c){var d,e,f,g,h,i,j,k;h=b.i-a.g/2;i=c.i-a.g/2;j=b.j-a.g/2;k=c.j-a.g/2;f=b.g+a.g/2;g=c.g+a.g/2;d=b.f+a.g/2;e=c.f+a.g/2;if(h>19!=0){return '-'+qD(hD(a))}c=a;d='';while(!(c.l==0&&c.m==0&&c.h==0)){e=RC(Jje);c=UC(c,e,true);b=''+pD(QC);if(!(c.l==0&&c.m==0&&c.h==0)){f=9-b.length;for(;f>0;f--){b='0'+b}}d=b+d}return d}\nfunction xrb(){if(!Object.create||!Object.getOwnPropertyNames){return false}var a='__proto__';var b=Object.create(null);if(b[a]!==undefined){return false}var c=Object.getOwnPropertyNames(b);if(c.length!=0){return false}b[a]=42;if(b[a]!==42){return false}if(Object.getOwnPropertyNames(b).length==0){return false}return true}\nfunction Pgc(a){var b,c,d,e,f,g,h;b=false;c=0;for(e=new olb(a.d.b);e.a=a.a){return -1}if(!F6b(b,c)){return -1}if(Qq(BD(d.Kb(b),20))){return 1}e=0;for(g=BD(d.Kb(b),20).Kc();g.Ob();){f=BD(g.Pb(),17);i=f.c.i==b?f.d.i:f.c.i;h=G6b(a,i,c,d);if(h==-1){return -1}e=$wnd.Math.max(e,h);if(e>a.c-1){return -1}}return e+1}\nfunction Btd(a,b){var c,d,e,f,g,h;if(PD(b)===PD(a)){return true}if(!JD(b,15)){return false}d=BD(b,15);h=a.gc();if(d.gc()!=h){return false}g=d.Kc();if(a.ni()){for(c=0;c0){a.qj();if(b!=null){for(f=0;f>24}case 97:case 98:case 99:case 100:case 101:case 102:{return a-97+10<<24>>24}case 65:case 66:case 67:case 68:case 69:case 70:{return a-65+10<<24>>24}default:{throw vbb(new Oeb('Invalid hexadecimal'))}}}\nfunction AUc(a,b,c){var d,e,f,g;Odd(c,'Processor order nodes',2);a.a=Edb(ED(vNb(b,(JTc(),HTc))));e=new Psb;for(g=Jsb(b.b,0);g.b!=g.d.c;){f=BD(Xsb(g),86);Ccb(DD(vNb(f,(mTc(),jTc))))&&(Gsb(e,f,e.c.b,e.c),true)}d=(sCb(e.b!=0),BD(e.a.a.c,86));yUc(a,d);!c.b&&Rdd(c,1);BUc(a,d,0-Edb(ED(vNb(d,(mTc(),bTc))))/2,0);!c.b&&Rdd(c,1);Qdd(c)}\nfunction rFb(){rFb=ccb;qFb=new sFb('SPIRAL',0);lFb=new sFb('LINE_BY_LINE',1);mFb=new sFb('MANHATTAN',2);kFb=new sFb('JITTER',3);oFb=new sFb('QUADRANTS_LINE_BY_LINE',4);pFb=new sFb('QUADRANTS_MANHATTAN',5);nFb=new sFb('QUADRANTS_JITTER',6);jFb=new sFb('COMBINE_LINE_BY_LINE_MANHATTAN',7);iFb=new sFb('COMBINE_JITTER_MANHATTAN',8)}\nfunction roc(a,b,c,d){var e,f,g,h,i,j;i=woc(a,c);j=woc(b,c);e=false;while(!!i&&!!j){if(d||uoc(i,j,c)){g=woc(i,c);h=woc(j,c);zoc(b);zoc(a);f=i.c;sbc(i,false);sbc(j,false);if(c){Z_b(b,j.p,f);b.p=j.p;Z_b(a,i.p+1,f);a.p=i.p}else{Z_b(a,i.p,f);a.p=i.p;Z_b(b,j.p+1,f);b.p=j.p}$_b(i,null);$_b(j,null);i=g;j=h;e=true}else{break}}return e}\nfunction VDc(a,b,c,d){var e,f,g,h,i;e=false;f=false;for(h=new olb(d.j);h.a=b.length){throw vbb(new qcb('Greedy SwitchDecider: Free layer not in graph.'))}this.c=b[a];this.e=new dIc(d);THc(this.e,this.c,(Ucd(),Tcd));this.i=new dIc(d);THc(this.i,this.c,zcd);this.f=new ejc(this.c);this.a=!f&&e.i&&!e.s&&this.c[0].k==(j0b(),e0b);this.a&&hjc(this,a,b.length)}\nfunction hKb(a,b){var c,d,e,f,g,h;f=!a.B.Hc((Idd(),zdd));g=a.B.Hc(Cdd);a.a=new FHb(g,f,a.c);!!a.n&&u_b(a.a.n,a.n);lIb(a.g,(gHb(),eHb),a.a);if(!b){d=new mIb(1,f,a.c);d.n.a=a.k;Npb(a.p,(Ucd(),Acd),d);e=new mIb(1,f,a.c);e.n.d=a.k;Npb(a.p,Rcd,e);h=new mIb(0,f,a.c);h.n.c=a.k;Npb(a.p,Tcd,h);c=new mIb(0,f,a.c);c.n.b=a.k;Npb(a.p,zcd,c)}}\nfunction Vgc(a){var b,c,d;b=BD(vNb(a.d,(Nyc(),Swc)),218);switch(b.g){case 2:c=Ngc(a);break;case 3:c=(d=new Rkb,MAb(JAb(NAb(LAb(LAb(new YAb(null,new Kub(a.d.b,16)),new Shc),new Uhc),new Whc),new ehc),new Yhc(d)),d);break;default:throw vbb(new Zdb('Compaction not supported for '+b+' edges.'));}Ugc(a,c);reb(new Pib(a.g),new Ehc(a))}\nfunction a2c(a,b){var c;c=new zNb;!!b&&tNb(c,BD(Ohb(a.a,C2),94));JD(b,470)&&tNb(c,BD(Ohb(a.a,G2),94));if(JD(b,354)){tNb(c,BD(Ohb(a.a,D2),94));return c}JD(b,82)&&tNb(c,BD(Ohb(a.a,z2),94));if(JD(b,239)){tNb(c,BD(Ohb(a.a,E2),94));return c}if(JD(b,186)){tNb(c,BD(Ohb(a.a,F2),94));return c}JD(b,352)&&tNb(c,BD(Ohb(a.a,B2),94));return c}\nfunction wSb(){wSb=ccb;oSb=new Osd((Y9c(),D9c),meb(1));uSb=new Osd(T9c,80);tSb=new Osd(M9c,5);bSb=new Osd(r8c,tme);pSb=new Osd(E9c,meb(1));sSb=new Osd(H9c,(Bcb(),true));lSb=new q0b(50);kSb=new Osd(f9c,lSb);dSb=O8c;mSb=t9c;cSb=new Osd(B8c,false);jSb=e9c;iSb=b9c;hSb=Y8c;gSb=W8c;nSb=x9c;fSb=(SRb(),LRb);vSb=QRb;eSb=KRb;qSb=NRb;rSb=PRb}\nfunction ZXb(a){var b,c,d,e,f,g,h,i;i=new jYb;for(h=new olb(a.a);h.a0&&b=0){return false}else{b.p=c.b;Ekb(c.e,b)}if(e==(j0b(),g0b)||e==i0b){for(g=new olb(b.j);g.a