From 29bcdb84898f1d8f99f37d159882d884d7d30ec8 Mon Sep 17 00:00:00 2001 From: BasicPrimitives Date: Tue, 27 May 2025 00:39:09 -0400 Subject: [PATCH 1/6] Updated PDFKit integration description --- readme.md | 2 +- samples/FirstOrganizationalChart.md | 36 ++++++++++++++++++++++------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/readme.md b/readme.md index bf353b3..0bb5df7 100644 --- a/readme.md +++ b/readme.md @@ -16,7 +16,7 @@ Data visualization diagramming components library for dependencies visualization * Webpack [Tree Shaking](https://webpack.js.org/guides/tree-shaking/) support ### Basic Primitives Diagrams for [React](https://reactjs.org/) -* [create-react-app](https://github.com/facebook/create-react-app#readme) compatible +* [Vite](https://vite.dev/) Fast build tool for modern web development. * User [JSX](https://reactjs.org/docs/introducing-jsx.html) templates * 100% [Virtual DOM](https://reactjs.org/docs/faq-internals.html) rendering cycle * [react-dnd](http://react-dnd.github.io/react-dnd/about) & [React Context](https://reactjs.org/docs/context.html) compatible diff --git a/samples/FirstOrganizationalChart.md b/samples/FirstOrganizationalChart.md index 0c6bf71..19b463d 100644 --- a/samples/FirstOrganizationalChart.md +++ b/samples/FirstOrganizationalChart.md @@ -94,17 +94,16 @@ The control is an interactive component by design, so it needs to add event list control.destroy(); ``` -## PDFKit +## PDFKit Integration -Basic Primitives library provides plugins for [PDFkit](www.PDFkit.org) (MIT License) - it is JavaScript PDF generation library for NodeJS and client-side rendering in browser. +The Basic Primitives library offers plugins for [PDFKit](https://www.PDFkit.org) (MIT License), a robust JavaScript library designed for generating PDFs in Node.js and client-side rendering in browsers. -PDFKit library provides the complete experience for rendering documents in PDF format. Basic Primitives library has two plugins for PDFkit to generate Diagrams on PDF page: -* OrgDiagramPdfkit - Organizational Chart PDFkit Plugin -* FamDiagramPdfkit - Family Diagram PDFkit Plugin +PDFKit provides a comprehensive solution for rendering documents in PDF format. The Basic Primitives library includes two plugins for generating diagrams on PDF pages using PDFKit: +* **OrgDiagramPdfkit** – Organizational Chart PDFKit Plugin +* **FamDiagramPdfkit** – Family Diagram PDFKit Plugin -PDFkit Plugins are stand-alone products. They share many API options with Basic Primitives Controls, but they don't have any interactivity, and their rendering engine uses PDFkit's library vector graphics capabilities, see PDFkit site for reference. +These PDFKit plugins are standalone products. While they share many API options with Basic Primitives controls, they do not include interactivity. Instead, their rendering engine utilizes PDFKit’s vector graphics capabilities. For further reference, consult the PDFKit documentation. -The following example is a minimal code needed to create a new empty PDF file on the browser's client-side using the PDFkit library. ```JavaScript const PDFDocument = require('pdfkit'); @@ -186,4 +185,25 @@ Plugins are part of the Basic Primitives distribution package. [JavaScript](javascript.controls/CaseFirstOrganizationalChart.html) [PDFKit](pdfkit.plugins/FirstOrganizationalChart.html) -![Screenshot](javascript.controls/__image_snapshots__/CaseFirstOrganizationalChart-snap.png) \ No newline at end of file +![Screenshot](javascript.controls/__image_snapshots__/CaseFirstOrganizationalChart-snap.png) + +### Browser Usage: PDFKit and Recommended Setup + +For use in browser environments, especially in frameworks like **React** and **Angular**, PDFKit developers recommend using the standalone version of the library for optimal performance. + +1. **`pdfkit.standalone.js`** + This file contains the standalone version of [PDFKit](https://github.com/foliojs/pdfkit/releases), enabling PDF generation directly in the browser or on the server. It’s ideal for environments like React and Angular, where the regular Node.js version might not be compatible. + +2. **`blob-stream.js`** + This file is part of the [Blob Stream](https://github.com/devongovett/blob-stream/releases) library, which allows you to create binary blobs in the browser from streams. This is particularly useful when generating downloadable files such as PDFs. + +### React Demo Repository + +For a practical example, our **React-demo repository** includes a sample integration of **pdfkit.standalone.js** into a React application built with **Vite**. This demo showcases how to set up and use PDFKit in a modern React environment, providing a simple yet complete solution for PDF generation in client-side applications. + +You can explore the sample integration here: [React Demo Repository](https://github.com/BasicPrimitives/react-demo/blob/master/client/src/components/PdfViewDialog/PdfViewDialog.jsx) + +For further details on these libraries, you can refer to the following GitHub pages: + +- [PDFKit Releases](https://github.com/foliojs/pdfkit/releases) +- [Blob Stream Releases](https://github.com/devongovett/blob-stream/releases) \ No newline at end of file From 42bb25ad1d4256cd42fc571bfad7503b384f7d02 Mon Sep 17 00:00:00 2001 From: BasicPrimitives Date: Tue, 27 May 2025 00:45:03 -0400 Subject: [PATCH 2/6] Updated connector annotation sample description --- samples/ConnectorAnnotation.md | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/ConnectorAnnotation.md b/samples/ConnectorAnnotation.md index ddc42d1..fc14331 100644 --- a/samples/ConnectorAnnotation.md +++ b/samples/ConnectorAnnotation.md @@ -8,6 +8,7 @@ The following sample demonstrates connection annotation drawn in the offbeat sty ![Screenshot](javascript.controls/__image_snapshots__/CaseConnectorAnnotation-snap.png) +## Drag & Drop The following sample demonstrates how drag-and-drop can be used to create or modify connector annotations in a diagram. * Drag nodes to create new annotations. From 7f7ad36138ed134436eea5c64292ac056669dde2 Mon Sep 17 00:00:00 2001 From: BasicPrimitives Date: Sat, 14 Jun 2025 21:04:21 -0400 Subject: [PATCH 3/6] Reworked connector annotation control --- package.json | 2 +- src/ConnectorAnnotationControl.js | 132 ++---------------- src/RotatedTextControl.js | 4 - src/ShapeAnnotationControl.js | 60 +------- src/configs/RotatedTextControlConfig.js | 2 +- .../annotations/ConnectorAnnotation.js | 124 ++++++++++++++++ src/graphics/annotations/ShapeAnnotation.js | 56 ++++++++ src/graphics/shapes/ConnectorStraight.js | 5 +- src/graphics/structs/Vector.js | 2 +- src/index.js | 5 +- 10 files changed, 206 insertions(+), 186 deletions(-) create mode 100644 src/graphics/annotations/ConnectorAnnotation.js create mode 100644 src/graphics/annotations/ShapeAnnotation.js diff --git a/package.json b/package.json index e4ce295..f213461 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "basicprimitives", "sideEffects": false, "homepage": "https://www.basicprimitives.com/", - "version": "6.6.0", + "version": "6.6.1", "author": "Basic Primitives Inc. (https://www.basicprimitives.com)", "description": "Basic Primitives Diagrams for JavaScript - data visualization components library that implements organizational chart and multi-parent dependency diagrams, contains implementations of JavaScript Controls and PDF rendering plugins.", "repository": { diff --git a/src/ConnectorAnnotationControl.js b/src/ConnectorAnnotationControl.js index 1424c32..a967daf 100644 --- a/src/ConnectorAnnotationControl.js +++ b/src/ConnectorAnnotationControl.js @@ -1,17 +1,9 @@ import Rect from './graphics/structs/Rect'; -import PaletteItem from './graphics/structs/PaletteItem'; -import { ConnectorPlacementType } from './enums'; import createGraphics from './graphics/createGraphics'; -import { getFixOfPixelAlignment, getInnerSize, getElementOffset } from './graphics/dom'; +import { getFixOfPixelAlignment, getInnerSize } from './graphics/dom'; import JsonML from './common/jsonml-html'; -import Transform from './graphics/Transform'; -import PolylinesBuffer from './graphics/structs/PolylinesBuffer'; -import ConnectorAnnotationOffsetResolver from './tasks/renders/offsetResolver/ConnectorAnnotationOffsetResolver'; -import ConnectorOffbeat from './graphics/shapes/ConnectorOffbeat'; -import ConnectorStraight from './graphics/shapes/ConnectorStraight'; +import ConnectorAnnotation from './graphics/annotations/ConnectorAnnotation'; import AnnotationLabelTemplate from './templates/html/AnnotationLabelTemplate'; -import { isNullOrEmpty } from './common'; -import RenderEventArgs from './events/RenderEventArgs'; /** * Creates JavaScript Connector Annotation Control @@ -30,7 +22,8 @@ export default function ConnectorAnnotationControl(element, options) { placeholder: null, panelSize: null, graphics: null, - labelTemplate: null + labelTemplate: null, + connector: null }; if(!element) { @@ -70,6 +63,7 @@ export default function ConnectorAnnotationControl(element, options) { ); _data.graphics = createGraphics(_data.element); + _data.connector = new ConnectorAnnotation(); }; function cleanLayout() { @@ -106,127 +100,19 @@ export default function ConnectorAnnotationControl(element, options) { _data.labelTemplate = AnnotationLabelTemplate(_data.options); cleanLayout(); createLayout(); - redraw(); + _data.graphics.begin(); + _data.connector.draw(_data.options, _data.graphics, _data.panelSize, _data.labelTemplate); + _data.graphics.end(); } else { updateLayout(); _data.graphics.resize("placeholder", _data.panelSize.width, _data.panelSize.height); _data.graphics.begin(); - redraw(); + _data.connector.draw(_data.options, _data.graphics, _data.panelSize, _data.labelTemplate); _data.graphics.end(); } } - function redraw() { - var annotationConfig = _data.options, - shape, - uiHash, - transform = new Transform(), - panel = _data.graphics.activate("placeholder"), - buffer = new PolylinesBuffer(), - connectorAnnotationOffsetResolver = ConnectorAnnotationOffsetResolver(); - - transform.size = new Size(_data.panelSize.width, _data.panelSize.height); - transform.setOrientation(annotationConfig.orientationType); - - if (annotationConfig.fromRectangle != null && annotationConfig.toRectangle != null) { - var fromRect = annotationConfig.fromRectangle, - toRect = annotationConfig.toRectangle; - - /* translate rectangles to Top orientation */ - /* from rectangle */ - transform.transformRect(fromRect.x, fromRect.y, fromRect.width, fromRect.height, false, - this, function (x, y, width, height) { - fromRect = new Rect(x, y, width, height); - }); - - /* to rectangle */ - transform.transformRect(toRect.x, toRect.y, toRect.width, toRect.height, false, - this, function (x, y, width, height) { - toRect = new Rect(x, y, width, height); - }); - - switch (annotationConfig.connectorPlacementType) { - case ConnectorPlacementType.Offbeat: - shape = new ConnectorOffbeat(); - break; - case ConnectorPlacementType.Straight: - shape = new ConnectorStraight(); - break; - } - - /* rotate label size to user orientation */ - var labelSize; - transform.transformRect(0, 0, annotationConfig.labelSize.width, annotationConfig.labelSize.height, false, - this, function (x, y, width, height) { - labelSize = new Size(width, height); - }); - - /* rotate panel size to user orientation */ - var panelSize = null; - transform.transformRect(0, 0, panel.size.width, panel.size.height, false, - this, function (x, y, width, height) { - panelSize = new Size(width, height); - }); - - var linePaletteItem = new PaletteItem({ - lineColor: annotationConfig.color, - lineWidth: annotationConfig.lineWidth, - lineType: annotationConfig.lineType - }); - - var hasLabel = !isNullOrEmpty(annotationConfig.label); - - /* offset rectangles */ - fromRect = new Rect(fromRect).offset(annotationConfig.offset); - toRect = new Rect(toRect).offset(annotationConfig.offset); - - var linesOffset = annotationConfig.lineWidth * 6; - - /* create connection lines */ - shape.draw(buffer, linePaletteItem, fromRect, toRect, linesOffset, 0, labelSize, panelSize, - annotationConfig.connectorShapeType, annotationConfig.labelOffset, annotationConfig.labelPlacementType, hasLabel, - connectorAnnotationOffsetResolver, function (labelPlacement, labelConfig) { - var hasLabel = !isNullOrEmpty(labelConfig.label); - if (hasLabel && labelPlacement != null) { - /* translate result label placement back to users orientation */ - transform.transformRect(labelPlacement.x, labelPlacement.y, labelPlacement.width, labelPlacement.height, true, - self, function (x, y, width, height) { - labelPlacement = new Rect(x, y, width, height); - }); - - uiHash = new RenderEventArgs(); - uiHash.context = labelConfig; - - /* draw label */ - _data.graphics.template( - labelPlacement.x - , labelPlacement.y - , 0 - , 0 - , 0 - , 0 - , labelPlacement.width - , labelPlacement.height - , _data.labelTemplate.template() - , _data.labelTemplate.getHashCode() - , _data.labelTemplate.render - , uiHash - , null - ); - } - }, annotationConfig); - connectorAnnotationOffsetResolver.resolve(); - } - - /* translate result polylines back to users orientation */ - buffer.transform(transform, true); - /* draw background polylines */ - _data.graphics.polylinesBuffer(buffer); - - _data.graphics.end(); - } - function destroy() { cleanLayout(); }; diff --git a/src/RotatedTextControl.js b/src/RotatedTextControl.js index b5a4343..94e5a7a 100644 --- a/src/RotatedTextControl.js +++ b/src/RotatedTextControl.js @@ -2,11 +2,7 @@ import Rect from './graphics/structs/Rect'; import createGraphics from './graphics/createGraphics'; import { getFixOfPixelAlignment, getInnerSize } from './graphics/dom'; import JsonML from './common/jsonml-html'; -import Transform from './graphics/Transform'; -import Shape from './graphics/shapes/Shape'; import AnnotationLabelTemplate from './templates/html/AnnotationLabelTemplate'; -import { isNullOrEmpty } from './common'; -import RenderEventArgs from './events/RenderEventArgs'; /** * Creates JavaScript Rotated Text Control diff --git a/src/ShapeAnnotationControl.js b/src/ShapeAnnotationControl.js index 35f31a6..009d602 100644 --- a/src/ShapeAnnotationControl.js +++ b/src/ShapeAnnotationControl.js @@ -2,11 +2,8 @@ import Rect from './graphics/structs/Rect'; import createGraphics from './graphics/createGraphics'; import { getFixOfPixelAlignment, getInnerSize } from './graphics/dom'; import JsonML from './common/jsonml-html'; -import Transform from './graphics/Transform'; -import Shape from './graphics/shapes/Shape'; +import ShapeAnnotation from './graphics/annotations/ShapeAnnotation'; import AnnotationLabelTemplate from './templates/html/AnnotationLabelTemplate'; -import { isNullOrEmpty } from './common'; -import RenderEventArgs from './events/RenderEventArgs'; /** * Creates JavaScript Shape Annotation Control @@ -25,7 +22,8 @@ export default function ShapeAnnotationControl(element, options) { placeholder: null, panelSize: null, graphics: null, - labelTemplate: null + labelTemplate: null, + shape: null }; if(!element) { @@ -65,6 +63,7 @@ export default function ShapeAnnotationControl(element, options) { ); _data.graphics = createGraphics(_data.element); + _data.shape = new ShapeAnnotation(); }; function cleanLayout() { @@ -101,64 +100,17 @@ export default function ShapeAnnotationControl(element, options) { _data.labelTemplate = AnnotationLabelTemplate(_data.options); cleanLayout(); createLayout(); - redraw(); + _data.shape.draw(_data.options, _data.graphics, _data.panelSize, _data.labelTemplate); } else { updateLayout(); _data.graphics.resize("placeholder", _data.panelSize.width, _data.panelSize.height); _data.graphics.begin(); - redraw(); + _data.shape.draw(_data.options, _data.graphics, _data.panelSize, _data.labelTemplate); _data.graphics.end(); } } - function redraw() { - var annotationConfig = _data.options, - shape, - uiHash, - transform = new Transform(), - panel = _data.graphics.activate("placeholder"); - - transform.size = new Size(_data.panelSize.width, _data.panelSize.height); - transform.setOrientation(annotationConfig.orientationType); - - if (annotationConfig.position != null) { - shape = new Shape(_data.graphics); - primitives.mergeObjects(shape, options); - - /* rotate label size to user orientation */ - transform.transformRect(0, 0, annotationConfig.labelSize.width, annotationConfig.labelSize.height, false, - this, function (x, y, width, height) { - shape.labelSize = new Size(width, height); - }); - - /* rotate panel size to user orientation */ - transform.transformRect(0, 0, panel.size.width, panel.size.height, false, - this, function (x, y, width, height) { - shape.panelSize = new Size(width, height); - }); - - shape.hasLabel = !isNullOrEmpty(annotationConfig.label); - - var position = annotationConfig.position; - - /* translate position to Top orientation */ - transform.transformRect(position.x, position.y, position.width, position.height, false, - this, function (x, y, width, height) { - position = new Rect(x, y, width, height); - }); - - /* offset position */ - position = new Rect(annotationConfig.position).offset(annotationConfig.offset); - - shape.labelTemplate = _data.labelTemplate; - - uiHash = new RenderEventArgs(); - uiHash.context = annotationConfig; - shape.draw(position, uiHash); - } - } - function destroy() { cleanLayout(); }; diff --git a/src/configs/RotatedTextControlConfig.js b/src/configs/RotatedTextControlConfig.js index 31e97fd..534ddfd 100644 --- a/src/configs/RotatedTextControlConfig.js +++ b/src/configs/RotatedTextControlConfig.js @@ -1,4 +1,4 @@ -import {VerticalAlignmentType, TextOrientationType, HorizontalAlignmentType} from '../enums'; +import {VerticalAlignmentType, TextOrientationType, HorizontalAlignmentType, Colors} from '../enums'; /** * @class RotatedTextControlConfig diff --git a/src/graphics/annotations/ConnectorAnnotation.js b/src/graphics/annotations/ConnectorAnnotation.js new file mode 100644 index 0000000..7c9af7f --- /dev/null +++ b/src/graphics/annotations/ConnectorAnnotation.js @@ -0,0 +1,124 @@ +import Rect from '../structs/Rect'; +import Size from '../structs/Size'; +import PaletteItem from '../structs/PaletteItem'; +import { ConnectorPlacementType } from '../../enums'; +import Transform from '../Transform'; +import PolylinesBuffer from '../structs/PolylinesBuffer'; +import ConnectorAnnotationOffsetResolver from '../../tasks/renders/offsetResolver/ConnectorAnnotationOffsetResolver'; +import ConnectorOffbeat from '../shapes/ConnectorOffbeat'; +import ConnectorStraight from '../shapes/ConnectorStraight'; +import { isNullOrEmpty } from '../../common'; +import RenderEventArgs from '../../events/RenderEventArgs'; + +export default function ConnectorAnnotation() { + +}; + +ConnectorAnnotation.prototype.draw = function (annotationConfig, graphics, controlSize, labelTemplate) { + var shape, + uiHash, + transform = new Transform(), + panel, + buffer = new PolylinesBuffer(), + connectorAnnotationOffsetResolver = ConnectorAnnotationOffsetResolver(); + + graphics.reset("placeholder"); + panel = graphics.activate("placeholder"); + transform.size = new Size(controlSize.width, controlSize.height); + transform.setOrientation(annotationConfig.orientationType); + + if (annotationConfig.fromRectangle != null && annotationConfig.toRectangle != null) { + var fromRect = annotationConfig.fromRectangle, + toRect = annotationConfig.toRectangle; + + /* translate rectangles to Top orientation */ + /* from rectangle */ + transform.transformRect(fromRect.x, fromRect.y, fromRect.width, fromRect.height, false, + this, function (x, y, width, height) { + fromRect = new Rect(x, y, width, height); + }); + + /* to rectangle */ + transform.transformRect(toRect.x, toRect.y, toRect.width, toRect.height, false, + this, function (x, y, width, height) { + toRect = new Rect(x, y, width, height); + }); + + switch (annotationConfig.connectorPlacementType) { + case ConnectorPlacementType.Offbeat: + shape = new ConnectorOffbeat(); + break; + case ConnectorPlacementType.Straight: + shape = new ConnectorStraight(); + break; + } + + /* rotate label size to user orientation */ + var labelSize; + transform.transformRect(0, 0, annotationConfig.labelSize.width, annotationConfig.labelSize.height, false, + this, function (x, y, width, height) { + labelSize = new Size(width, height); + }); + + /* rotate panel size to user orientation */ + var panelSize = null; + transform.transformRect(0, 0, panel.size.width, panel.size.height, false, + this, function (x, y, width, height) { + panelSize = new Size(width, height); + }); + + var linePaletteItem = new PaletteItem({ + lineColor: annotationConfig.color, + lineWidth: annotationConfig.lineWidth, + lineType: annotationConfig.lineType + }); + + var hasLabel = !isNullOrEmpty(annotationConfig.label); + + /* offset rectangles */ + fromRect = new Rect(fromRect).offset(annotationConfig.offset); + toRect = new Rect(toRect).offset(annotationConfig.offset); + + var linesOffset = annotationConfig.lineWidth * 6; + + /* create connection lines */ + shape.draw(buffer, linePaletteItem, fromRect, toRect, linesOffset, 0, labelSize, panelSize, + annotationConfig.connectorShapeType, annotationConfig.labelOffset, annotationConfig.labelPlacementType, hasLabel, + connectorAnnotationOffsetResolver, function (labelPlacement, labelConfig) { + var hasLabel = !isNullOrEmpty(labelConfig.label); + if (hasLabel && labelPlacement != null) { + /* translate result label placement back to users orientation */ + transform.transformRect(labelPlacement.x, labelPlacement.y, labelPlacement.width, labelPlacement.height, true, + self, function (x, y, width, height) { + labelPlacement = new Rect(x, y, width, height); + }); + + uiHash = new RenderEventArgs(); + uiHash.context = labelConfig; + + /* draw label */ + graphics.template( + labelPlacement.x + , labelPlacement.y + , 0 + , 0 + , 0 + , 0 + , labelPlacement.width + , labelPlacement.height + , labelTemplate.template() + , labelTemplate.getHashCode() + , labelTemplate.render + , uiHash + , null + ); + } + }, annotationConfig); + connectorAnnotationOffsetResolver.resolve(); + } + + /* translate result polylines back to users orientation */ + buffer.transform(transform, true); + /* draw background polylines */ + graphics.polylinesBuffer(buffer); + } \ No newline at end of file diff --git a/src/graphics/annotations/ShapeAnnotation.js b/src/graphics/annotations/ShapeAnnotation.js new file mode 100644 index 0000000..7fe154b --- /dev/null +++ b/src/graphics/annotations/ShapeAnnotation.js @@ -0,0 +1,56 @@ +import Rect from '../structs/Rect'; +import Size from '../structs/Size'; +import Transform from '../Transform'; +import { isNullOrEmpty } from '../../common'; +import RenderEventArgs from '../../events/RenderEventArgs'; +import Shape from '../shapes/Shape' + +export default function ShapeAnnotation() { + +}; + +ShapeAnnotation.prototype.draw = function (annotationConfig, graphics, controlSize, labelTemplate) { + var shape, + uiHash, + transform = new Transform(), + panel = graphics.activate("placeholder"); + + transform.size = new Size(controlSize.width, controlSize.height); + transform.setOrientation(annotationConfig.orientationType); + + if (annotationConfig.position != null) { + shape = new Shape(graphics); + Object.assign(shape, annotationConfig); + + /* rotate label size to user orientation */ + transform.transformRect(0, 0, annotationConfig.labelSize.width, annotationConfig.labelSize.height, false, + this, function (x, y, width, height) { + shape.labelSize = new Size(width, height); + }); + + /* rotate panel size to user orientation */ + transform.transformRect(0, 0, panel.size.width, panel.size.height, false, + this, function (x, y, width, height) { + shape.panelSize = new Size(width, height); + }); + + shape.hasLabel = !isNullOrEmpty(annotationConfig.label); + + var position = annotationConfig.position; + + /* translate position to Top orientation */ + transform.transformRect(position.x, position.y, position.width, position.height, false, + this, function (x, y, width, height) { + position = new Rect(x, y, width, height); + }); + + /* offset position */ + position = new Rect(annotationConfig.position).offset(annotationConfig.offset); + + shape.labelTemplate = labelTemplate; + + uiHash = new RenderEventArgs(); + uiHash.context = annotationConfig; + shape.draw(position, uiHash); + } +} \ No newline at end of file diff --git a/src/graphics/shapes/ConnectorStraight.js b/src/graphics/shapes/ConnectorStraight.js index e3613c6..5955e13 100644 --- a/src/graphics/shapes/ConnectorStraight.js +++ b/src/graphics/shapes/ConnectorStraight.js @@ -23,6 +23,9 @@ ConnectorStraight.prototype.draw = function (buffer, linePaletteItem, fromRect, self = this; vector = new Vector(fromRect.centerPoint(), toRect.centerPoint()); + if (vector.isNull()) { + return; + } fromRect.loopEdges(function (sideVector, placementType) { fromPoint = sideVector.getIntersectionPoint(vector, true, 1.0); @@ -36,7 +39,7 @@ ConnectorStraight.prototype.draw = function (buffer, linePaletteItem, fromRect, return (toPoint != null); }); - if (fromPoint != null && toPoint != null) { + if (fromPoint != null && toPoint != null && !fromPoint.equalTo(toPoint)) { var baseVector = new Vector(fromPoint, toPoint); connectorAnnotationOffsetResolver.getOffset(baseVector, function (offsetIndex, bundleSize, direction) { var tempOffset = (offsetIndex * bundleOffset - (bundleSize - 1) * bundleOffset / 2.0) * direction; diff --git a/src/graphics/structs/Vector.js b/src/graphics/structs/Vector.js index c237280..ef32d49 100644 --- a/src/graphics/structs/Vector.js +++ b/src/graphics/structs/Vector.js @@ -48,7 +48,7 @@ export default function Vector(arg0, arg1) { * @returns {boolean} Returns true if start and end points are the same. */ Vector.prototype.isNull = function () { - return this.from.x == this.to && this.from.y == this.to.y; + return this.from.x == this.to.x && this.from.y == this.to.y; }; /** diff --git a/src/index.js b/src/index.js index d401f46..e02b8b2 100644 --- a/src/index.js +++ b/src/index.js @@ -71,4 +71,7 @@ export { default as RotatedTextControlConfig } from './configs/RotatedTextContro export { default as RotatedTextControl } from './RotatedTextControl'; export { default as FamTaskManagerFactory } from './FamTaskManagerFactory'; -export { default as OrgTaskManagerFactory } from './OrgTaskManagerFactory'; \ No newline at end of file +export { default as OrgTaskManagerFactory } from './OrgTaskManagerFactory'; +export { default as ConnectorAnnotation} from './graphics/annotations/ConnectorAnnotation'; +export { default as ShapeAnnotation} from './graphics/annotations/ShapeAnnotation'; +export { default as Callout} from './graphics/shapes/Callout'; From 0269cc9b1a5413c61a9476874ce3a8edfa20c55f Mon Sep 17 00:00:00 2001 From: BasicPrimitives Date: Sat, 14 Jun 2025 21:29:54 -0400 Subject: [PATCH 4/6] Updated npmignore --- .npmignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.npmignore b/.npmignore index 3af550f..0c81515 100644 --- a/.npmignore +++ b/.npmignore @@ -1,5 +1,6 @@ apireference node_modules +.vscode samples .gitignore apireference.js From 73fe989138bb3178dc70700931c14ef6ac7c639b Mon Sep 17 00:00:00 2001 From: BasicPrimitives Date: Sun, 23 Nov 2025 23:10:40 -0500 Subject: [PATCH 5/6] Fixed computation of the optimal set of feedback edges that must be removed to eliminate all cycles in a family structure. --- src/algorithms/Graph.js | 194 +++++++++++++++----------- src/algorithms/Graph.test.js | 33 +++++ src/algorithms/getFamilyLoops.js | 115 +++++++++------ src/algorithms/getFamilyLoops.test.js | 15 ++ 4 files changed, 234 insertions(+), 123 deletions(-) diff --git a/src/algorithms/Graph.js b/src/algorithms/Graph.js index f46dd3a..8d4ae76 100644 --- a/src/algorithms/Graph.js +++ b/src/algorithms/Graph.js @@ -1,10 +1,12 @@ import Tree from './Tree'; import FibonacciHeap from './FibonacciHeap'; + /** - * Creates graph structure + * Creates an undirected graph structure backed by adjacency lists. + * Each edge stores a context object provided by the caller. + * * @class Graph - * - * @returns {Graph} Returns graph object + * @returns {Graph} A new graph instance */ export default function Graph() { var _edges = {}, @@ -12,10 +14,12 @@ export default function Graph() { MINIMUMWEIGHT = 2; /** - * Adds edge to the graph - * @param {string} from The id of the start node - * @param {string} to The id of the end node - * @param {object} edge The edge contextual object + * Adds an undirected edge between two nodes. + * If the edge already exists, it will not be replaced. + * + * @param {string} from The starting node id + * @param {string} to The ending node id + * @param {object} edge The edge context object */ function addEdge(from, to, edge) { if ((_edges[from] == null || _edges[from][to] == null) && edge != null) { @@ -33,11 +37,11 @@ export default function Graph() { } /** - * Returns edge context object - * - * @param {string} from The edge's from node id - * @param {string} to The edge's to node id - * @returns {object} The edge's context object + * Retrieves the stored edge context object for a given pair of nodes. + * + * @param {string} from The source node id + * @param {string} to The target node id + * @returns {object|null} The edge's context object, or null if none exists */ function edge(from, to) { var result = null; @@ -48,29 +52,54 @@ export default function Graph() { } /** - * Returns true if node exists in the graph - * + * Checks whether a node exists in the graph. + * * @param {string} from The node id - * @returns {boolean} Returns true if node exists + * @returns {boolean} True if the node is present in the graph */ function hasNode(from) { return _edges.hasOwnProperty(from); } /** - * Callback for iterating edges of the graph's node - * + * Callback invoked for each edge during iteration. + * * @callback onEdgeCallback - * @param {string} to The neighboring node id - * @param {Object} edge The edge's context object + * @param {string} from The start node id + * @param {string} to The end node id + * @param {Object} edge The edge context object */ /** - * Loop edges of the node - * - * @param {object} thisArg The callback function invocation context - * @param {string} itemid The node id - * @param {onEdgeCallback} onEdge A callback function to call for every edge of the node + * Iterates over all edges in the graph. + * + * @param {object} thisArg Execution context for the callback + * @param {onEdgeCallback} onEdge Callback invoked for each edge + */ + function loopEdges(thisArg, onEdge) { + var neighbours, fromKey, toKey; + if (onEdge != null) { + for (fromKey in _edges) { + if (_edges.hasOwnProperty(fromKey)) { + neighbours = _edges[fromKey]; + if (neighbours != null) { + for (toKey in neighbours) { + if (neighbours.hasOwnProperty(toKey)) { + onEdge.call(thisArg, fromKey, toKey, neighbours[toKey]); + } + } + } + } + } + } + } + + /** + * Iterates over all edges connected to a specific node. + * + * @param {object} thisArg Execution context for the callback + * @param {string} itemid The node id whose edges to iterate + * @param {onEdgeCallback} onEdge Callback invoked for each connected edge */ function loopNodeEdges(thisArg, itemid, onEdge) { var neighbours, neighbourKey; @@ -87,20 +116,20 @@ export default function Graph() { } /** - * Callback function for iterating graphs nodes - * + * Callback for node iteration functions. + * * @callback onNodeCallback - * @param {string} to The next neighboring node id - * @returns {boolean} Returns true to break loop + * @param {string} to The node id visited + * @returns {boolean} Return true to stop traversal early */ /** - * Loop nodes of the graph - * - * @param {object} thisArg The callback function invocation context - * @param {string} [itemid=undefined] The optional start node id. If start node is undefined, - * function loops graphs node starting from first available node - * @param {onNodeCallback} onItem A callback function to be called for every neighboring node + * Traverses all connected nodes starting from the given node. + * If no start node is provided, traversal begins with the first available node. + * + * @param {object} thisArg Execution context for the callback + * @param {string} [startNode] Optional starting node id + * @param {onNodeCallback} onItem Callback invoked for each visited node */ function loopNodes(thisArg, startNode, onItem) { var processed = {}; @@ -152,21 +181,22 @@ export default function Graph() { } /** - * Callback for finding edge weight - * + * Returns edge weight used in certain algorithms. + * * @callback getGraphEdgeWeightCallback * @param {object} edge The edge context object - * @param {string} fromItem The edge's start node id - * @param {string} toItem The edge's end node id - * @returns {number} Returns weight of the edge + * @param {string} fromItem The start node id + * @param {string} toItem The end node id + * @returns {number} The weight of the edge */ /** - * Get maximum spanning tree. Graph may have disconnected sub graphs, so start node is necessary. - * - * @param {string} startNode The node to start searching for maximum spanning tree. Graph is not necessary connected - * @param {getGraphEdgeWeightCallback} getWeightFunc Callback function to get weight of an edge. - * @returns {tree} Returns tree structure containing maximum spanning tree of the graph + * Computes a maximum spanning tree using a priority queue. + * The graph may be disconnected; a start node is required. + * + * @param {string} startNode Node to begin spanning tree search + * @param {getGraphEdgeWeightCallback} getWeightFunc Function returning edge weight + * @returns {tree} A Tree structure containing the maximum spanning tree */ function getSpanningTree(startNode, getWeightFunc) { var result = Tree(), @@ -362,22 +392,21 @@ export default function Graph() { } /** - * Callback for returning optimal connection path for every end node. - * + * Callback invoked when a full path has been reconstructed. + * * @callback onPathFoundCallback - * @param {string[]} path An array of connection path node ids. - * @param {string} to The end node id, the connection path is found for. + * @param {string[]} path The node sequence forming the path + * @param {string} to The end node id */ /** - * Get shortest path between two nodes in graph. The start and the end nodes are supposed to have connection path. - * - * @param {object} thisArg The callback function invocation context - * @param {string} startNode The start node id - * @param {string[]} endNodes The array of end node ids. - * @param {getGraphEdgeWeightCallback} getWeightFunc Callback function to get weight of an edge. - * @param {onPathFoundCallback} onPathFound A callback function to be called for every end node - * with the optimal connection path + * Computes the shortest paths from a start node to one or more target nodes. + * + * @param {object} thisArg Execution context for callbacks + * @param {string} startNode Starting node id + * @param {string[]} endNodes Target node ids + * @param {getGraphEdgeWeightCallback} getWeightFunc Optional function returning edge weight + * @param {onPathFoundCallback} onPathFound Callback invoked when a target path is found */ function getShortestPath(thisArg, startNode, endNodes, getWeightFunc, onPathFound) { var margin = FibonacciHeap(false), @@ -457,22 +486,23 @@ export default function Graph() { } /** - * Callback for iterating path edges - * + * Callback used for filtering usable edges during DFS path search. + * * @callback onPathEdgeCallback - * @param {string} from The from node id - * @param {string} to The to node id - * @param {Object} edge The edge's context object - * @returns {boolean} Returns true if edge is usable + * @param {string} from The start node id + * @param {string} to The end node id + * @param {Object} edge The edge context object + * @returns {boolean} True if the edge may be used in traversal */ /** - * Search any path from node to node using depth first search - * - * @param {object} thisArg The callback function invocation context - * @param {string} startNode The start node id - * @param {string} endNode The end node id. - * @param {onPathEdgeCallback} onEdge A callback function to call for every edge of the node + * Finds any path between two nodes using depth-first search. + * + * @param {object} thisArg Execution context for callbacks + * @param {string} startNode The start node id + * @param {string} endNode The end node id + * @param {onPathEdgeCallback} onEdge Callback deciding whether an edge is usable + * @returns {string[]} Array of node ids forming the found path */ function dfsPath(thisArg, startNode, endNode, onEdge) { var margin = [], @@ -522,11 +552,13 @@ export default function Graph() { } /** - * Get Level Graph starting with `startNode` - * - * @param {object} thisArg The callback function invocation context - * @param {string} startNode The start node id - * @param {onPathEdgeCallback} onEdge A callback function to call for every edge of the graph + * Computes a level graph starting from a given node. + * Levels are assigned via BFS using only edges allowed by the callback. + * + * @param {object} thisArg Execution context + * @param {string} startNode The start node id + * @param {onPathEdgeCallback} onEdge Callback deciding if an edge is valid to traverse + * @returns {Graph} A new graph representing the level structure */ function getLevelGraph(thisArg, startNode, onEdge) { var level = {}, @@ -560,7 +592,7 @@ export default function Graph() { } // Create level graph, copy existing edges to the new graph - var levelGraph = Graph(); + var levelGraph = Graph(); for (currentNode in _edges) { if (level.hasOwnProperty(currentNode)) { currentLevel = level[currentNode]; @@ -580,12 +612,13 @@ export default function Graph() { } /** - * Depth first search loop - * - * @param {object} thisArg The callback function invocation context - * @param {string} startNode The start node id - * @param {onPathEdgeCallback} onEdge A callback function to call for every edge of the graph - * @param {onNodeCallback} onNode A callback function to be called for every neighboring node + * Performs a depth-first traversal starting at a node. + * Edge usability is determined by the onEdge callback. + * + * @param {object} thisArg Execution context + * @param {string} startNode The start node id + * @param {onPathEdgeCallback} onEdge Callback deciding edge usability + * @param {onNodeCallback} onNode Callback invoked for each newly visited node */ function dfsLoop(thisArg, startNode, onEdge, onNode) { var margin = [], @@ -625,6 +658,7 @@ export default function Graph() { edge: edge, hasNode: hasNode, loopNodes: loopNodes, + loopEdges: loopEdges, loopNodeEdges: loopNodeEdges, getSpanningTree: getSpanningTree, getTotalWeightGrowthSequence: getTotalWeightGrowthSequence, diff --git a/src/algorithms/Graph.test.js b/src/algorithms/Graph.test.js index 39d7b53..7be2b0c 100644 --- a/src/algorithms/Graph.test.js +++ b/src/algorithms/Graph.test.js @@ -295,3 +295,36 @@ test('dfsLoop searches graph nodes using depth first order', () => { expect(result).toBe(true); }); + +test('loopEdges function test', () => { + var items = [ + { from: 'A', to: 'B' }, { from: 'A', to: 'C' }, { from: 'A', to: 'D' }, + { from: 'B', to: 'E' }, + { from: 'C', to: 'E' }, { from: 'C', to: 'D' }, + { from: 'D', to: 'F' }, { from: 'D', to: 'J' }, + { from: 'E', to: 'Z' }, + { from: 'Z', to: 'F' } + ]; + + var graph = Graph(); + for (var index = 0; index < items.length; index += 1) { + var item = items[index]; + graph.addEdge(item.from, item.to, item); + } + + var result = []; + var expected = []; + for(var index = 0; index < items.length; index+=1) { + var item = items[index]; + expected.push([item.from, item.to]); + expected.push([item.to, item.from]); + } + + graph.loopEdges(this, function (fromNode, toNode, edge) { + result.push([fromNode, toNode]); + }); + + result.sort((a, b) => (a[0] + a[1]).localeCompare(b[0] + b[1])); + expected.sort((a, b) => (a[0] + a[1]).localeCompare(b[0] + b[1])); + expect(result).toEqual(expected); +}); \ No newline at end of file diff --git a/src/algorithms/getFamilyLoops.js b/src/algorithms/getFamilyLoops.js index 911c25f..c141e11 100644 --- a/src/algorithms/getFamilyLoops.js +++ b/src/algorithms/getFamilyLoops.js @@ -10,11 +10,18 @@ export function Edge(from, to) { } /** - * This function finds [optimal collection of feedback edges](https://en.wikipedia.org/wiki/Feedback_arc_set) needed to be cut in - * order to eliminate loops in family structure. - * - * @param {Family} family Family structure - * @returns {Edge[]} Returns optimal collection of feedback loops + * Computes the optimal set of feedback edges that must be removed + * to eliminate all cycles in a family structure. This corresponds to + * [finding a minimum feedback arc set in the directed graph](https://en.wikipedia.org/wiki/Feedback_arc_set) formed by + * the family relationships. + * + * The function analyzes the directed dependencies inside the family, + * detects all cycles, and returns the smallest collection of edges + * whose removal makes the structure acyclic. + * + * @param {Family} family - The family structure represented as a directed graph. + * @param {boolean} [debug=false] - If true, enables diagnostic output. + * @returns {Edge[]} The minimal set of edges whose removal breaks all cycles. */ export default function getFamilyLoops(family, debug) { var loops = [], loop, @@ -24,6 +31,11 @@ export default function getFamilyLoops(family, debug) { var tempFamily = family.clone(); + /* Cleaning loops stage: use topological sorting to remove all nodes without parents. + Then use reversed topological sorting to remove all nodes without children. + The final temp family should contain only nodes that are in loops, + having both children and parents at the same time. + */ family.loopTopo(this, function (itemid) { tempFamily.removeNode(itemid); }) @@ -32,13 +44,20 @@ export default function getFamilyLoops(family, debug) { }) var cleanFamily = tempFamily.clone(); + /* Take any node in the temp family and break all its parent relations, storing them in the loops collection. + After that, repeat the previous cleaning stage: use topological and reversed topological sorting + to remove nodes that are no longer part of loops. + Repeat this until the temp family becomes empty. + */ cleanFamily.loop(this, function (itemid) { + /* take any node in temp family and break its parents relations*/ if (tempFamily.node(itemid) != null) { tempFamily.loopParents(this, itemid, function (parentid) { loops.push(new Edge(parentid, itemid)); tempFamily.removeChildRelation(parentid, itemid); return tempFamily.SKIP; }); + /* clean nodes in broken loops */ var itemsToRemove = []; tempFamily.loopTopo(this, function (itemid) { itemsToRemove.push(itemid); @@ -52,7 +71,10 @@ export default function getFamilyLoops(family, debug) { } }); - /* Invert loops */ + /* At this stage we have a copy of the original clean family + and a collection of loops we need to break to make the clean family acyclic. + So we remove the broken loops (edges) from the clean family here. + */ for (index = 0, len = loops.length; index < len; index += 1) { loop = loops[index]; if (!cleanFamily.removeChildRelation(loop.from, loop.to)) { @@ -68,6 +90,12 @@ export default function getFamilyLoops(family, debug) { return { from: from, to: to, capacity: 1, flow: 0 }; }); + /* Create two nodes, `from` and `to`, for finding the maximum flow in the graph + around and through the broken loops. + For each broken loop we create two edges: the parent node of the broken loop + is connected to the `from` node, and the child node of the broken loop + is connected to the `to` node. + */ var from = "__1000__"; var to = "__2000__"; var defaultMinimalFlow = loops.length; @@ -89,6 +117,7 @@ export default function getFamilyLoops(family, debug) { } } + /*Now, use standard algorithm to find maximum flow between `from` and `to` nodes */ var totalFlow = 0; var levelGraph = null; while (true) { @@ -150,14 +179,44 @@ export default function getFamilyLoops(family, debug) { } } + /* If the maximum flow is less than the number of initially broken loops, + then it means the graph has a more optimal set of edges to break. + */ if (totalFlow < defaultMinimalFlow) { - var residueGraph = graph.getLevelGraph(this, from, function (fromNode, toNode, edge) { - if (fromNode == edge.from) { - return edge.capacity > edge.flow; + /* Collect residue graph nodes from the graph used to find the maximum flow. + Start collecting edges from the `from` node. + Use the same logic as for searching maximum flow: + - if edge capacity > edge.flow, we can go forward + - if edge.flow > 0, we can go backward through the edge + Stop when no more new nodes are available. + The `to` node cannot be reached this time. + */ + var residueGraphNodes = {}; + residueGraphNodes[from] = true; + graph.dfsLoop(this, from, function (fromNode, toNode2, edge) { + if (fromNode == edge.from) { + return edge.capacity > edge.flow; + } else { + return edge.flow > 0; + } + }, function (foundid) { + if (!residueGraphNodes.hasOwnProperty(foundid)) { + residueGraphNodes[foundid] = true; } return false; }); + /* The minimum cut of the directed graph is the set of edges + between residue graph nodes and the inaccessible nodes of the graph. + */ + var edgesToBreak = []; + graph.loopEdges(this, function (fromKey, toKey, edge) { + if (residueGraphNodes.hasOwnProperty(fromKey) && !residueGraphNodes.hasOwnProperty(toKey) && edge.capacity == edge.flow) { + edgesToBreak.push(new Edge(fromKey, toKey)); + // console.log("Edge to break: fromKey: " + fromKey + ", toKey: " + toKey + ", edge=" + JSON.stringify(edge)); + } + }); + // graph.loopNodes(this, from, function (nodeid) { // console.log("Nodeid: " + nodeid); // graph.loopNodeEdges(this, nodeid, function (neighbour, edge) { @@ -167,41 +226,11 @@ export default function getFamilyLoops(family, debug) { // }) // }); - // var resedueNodes = []; - // residueGraph.loopNodes(this, from, function (nodeid) { - // resedueNodes.push(nodeid); - // }); - // console.log("Residue graph: " + resedueNodes.join(", ")); - - var edgesToBreak = []; - residueGraph.loopNodes(this, from, function (nodeid) { - graph.loopNodeEdges(this, nodeid, function (toNode, edge) { - if (edge.to == toNode) { - if (!residueGraph.hasNode(toNode)) { - // console.log("Edge to test: from: " + nodeid + ", to " + toNode); - var isIsolated = false; - graph.dfsLoop(this, toNode, function (fromNode, toNode2, edge) { - if (edge.from == fromNode && !residueGraph.hasNode(fromNode)) { - return true; - } - return false; - }, function (foundid) { - if (foundid == to) { - // console.log("Isolated: " + toNode + ", may access exit node" + foundid); - isIsolated = true; - return true; - } - return false; - }); - if (isIsolated) { - edgesToBreak.push(new Edge(nodeid, toNode)); - } - } - } - }); - }); + // console.log("Residue graph nodes: " + Object.keys(residueGraphNodes).join(", ")); - // collect loops to break + /* Collect loops to break. If a broken edge contains the `from` or `to` nodes, + recover the original edge from the family structure. + */ var optimizedLoops = []; var validatedFlow = 0; for (index = 0, len = edgesToBreak.length; index < len; index += 1) { diff --git a/src/algorithms/getFamilyLoops.test.js b/src/algorithms/getFamilyLoops.test.js index c3702b9..badd933 100644 --- a/src/algorithms/getFamilyLoops.test.js +++ b/src/algorithms/getFamilyLoops.test.js @@ -142,4 +142,19 @@ test('getFamilyLoops - find optimal set of loops in the interlinked set of nodes }); expect(containsAllNodes).toBe(true); +}); + +test('getFamilyLoops - find optimal set of loops in the looped linked list, nodes should stay connected after loops removal', () => { + var family = getFamily([ + { id: 'A', parents: ['C'] }, + { id: 'D', parents: ['C'] }, + { id: 'B', parents: ['A', 'D'] }, + { id: 'C', parents: ['B'] } + ]); + + var result = getFamilyLoops(family); + + var expected = [new Edge('B', 'C')]; + + expect(result).toEqual(expected); }); \ No newline at end of file From 868a71e2c83236484a2be6fc68e600224212b0d3 Mon Sep 17 00:00:00 2001 From: BasicPrimitives Date: Sun, 23 Nov 2025 23:39:59 -0500 Subject: [PATCH 6/6] Updated descriptions and version --- apireference/algorithms.md | 209 ++++++++++-------- apireference/functions.md | 7 +- changelog.md | 2 + package.json | 2 +- ...al alignment with multiple cycles-snap.png | Bin 6988 -> 6987 bytes ...it overlaps node between children-snap.png | Bin 4284 -> 4284 bytes ...t one starts one generation below-snap.png | Bin 3125 -> 3124 bytes ... by side and upside-down families-snap.png | Bin 3507 -> 3500 bytes ...ilyAlignment-Skewed rombus layout-snap.png | Bin 6508 -> 6504 bytes ...nt-Upside-down tree family layout-snap.png | Bin 3922 -> 3926 bytes .../SpatialIndex-Matrix nesting test-snap.png | Bin 48804 -> 48787 bytes ...patialIndex-Multi-layer test case-snap.png | Bin 7665 -> 7657 bytes ...aligned disconnected rectangles 2-snap.png | Bin 3218 -> 3218 bytes ...o aligned disconnected rectangles-snap.png | Bin 3220 -> 3221 bytes ...ngles-Two disconnected rectangles-snap.png | Bin 2601 -> 2601 bytes ...gles-Two overlapping rectangles 2-snap.png | Bin 3039 -> 3041 bytes ...angles-Two overlapping rectangles-snap.png | Bin 3033 -> 3034 bytes .../getCrossingRectangles-Window 2-snap.png | Bin 4356 -> 4365 bytes .../getCrossingRectangles-Window-snap.png | Bin 4384 -> 4395 bytes .../getMergedRectangles-Dumbbell-snap.png | Bin 2281 -> 2278 bytes ...edRectangles-Merge 5 rectangles 2-snap.png | Bin 3651 -> 3639 bytes ...angles-Merge E shape rectangles 2-snap.png | Bin 3924 -> 3917 bytes ...ctangles-Merge E shape rectangles-snap.png | Bin 3925 -> 3922 bytes ...Rectangles-Merge single rectangle-snap.png | Bin 2551 -> 2543 bytes ...aligned disconnected rectangles 2-snap.png | Bin 3251 -> 3245 bytes ...o aligned disconnected rectangles-snap.png | Bin 3265 -> 3260 bytes ...Merge two disconnected rectangles-snap.png | Bin 2695 -> 2691 bytes ...erge two overlapping rectangles 2-snap.png | Bin 3123 -> 3119 bytes ...-Merge two overlapping rectangles-snap.png | Bin 3169 -> 3163 bytes .../getMergedRectangles-Window 2-snap.png | Bin 3181 -> 3247 bytes .../getMergedRectangles-Window-snap.png | Bin 3741 -> 3820 bytes ...nimumCrossingRows-Basic test case-snap.png | Bin 4299 -> 4311 bytes ...rossingRows-Multi-layer test case-snap.png | Bin 9135 -> 9276 bytes ...ossingRows-Nested block test case-snap.png | Bin 7210 -> 7209 bytes src/algorithms/getFamilyLoops.md | 41 ++++ ...aphics - Draw shape having island-snap.png | Bin 2905 -> 2903 bytes .../Graphics - Draw shape-snap.png | Bin 2014 -> 2014 bytes ...Graphics - Merge single rectangle-snap.png | Bin 2804 -> 2828 bytes ...rgedRectangles-Merge 5 rectangles-snap.png | Bin 3571 -> 3566 bytes .../MergedRectangles-Window 2-snap.png | Bin 3048 -> 3110 bytes .../MergedRectangles-Window-snap.png | Bin 3683 -> 3682 bytes 41 files changed, 165 insertions(+), 96 deletions(-) create mode 100644 src/algorithms/getFamilyLoops.md diff --git a/apireference/algorithms.md b/apireference/algorithms.md index 78c9d00..ee3217f 100644 --- a/apireference/algorithms.md +++ b/apireference/algorithms.md @@ -586,7 +586,7 @@ Validates internal structure consistency. ## Graph -Creates graph structure +Creates an undirected graph structure backed by adjacency lists. Each edge stores a context object provided by the caller. `Graph` @@ -594,114 +594,118 @@ Creates graph structure `Graph()` -Creates graph structure +Creates an undirected graph structure backed by adjacency lists. Each edge stores a context object provided by the caller. - Returns: `Graph` - returns graph object + Returns: `Graph` - a new graph instance ### Functions `addEdge(from, to, edge)` -Adds edge to the graph +Adds an undirected edge between two nodes. If the edge already exists, it will not be replaced. | Param | Type | Default | Description | | --- | --- | --- | --- | - | `from` | string | `` | The id of the start node | - | `to` | string | `` | The id of the end node | - | `edge` | object | `` | The edge contextual object | + | `from` | string | `` | The starting node id | + | `to` | string | `` | The ending node id | + | `edge` | object | `` | The edge context object | `dfsLoop(thisArg, startNode, onEdge, onNode)` -Depth first search loop +Performs a depth-first traversal starting at a node. Edge usability is determined by the onEdge callback. | Param | Type | Default | Description | | --- | --- | --- | --- | - | `thisArg` | object | `` | The callback function invocation context | + | `thisArg` | object | `` | Execution context | | `startNode` | string | `` | The start node id | - | `onEdge` | onPathEdgeCallback | `` | A callback function to call for every edge of the graph | - | `onNode` | onNodeCallback | `` | A callback function to be called for every neighboring node | + | `onEdge` | onPathEdgeCallback | `` | Callback deciding edge usability | + | `onNode` | onNodeCallback | `` | Callback invoked for each newly visited node | **Callbacks** `onPathEdgeCallback(from, to, edge)` -Callback for iterating path edges +Callback used for filtering usable edges during DFS path search. - Returns: `boolean` - returns true if edge is usable + Returns: `boolean` - true if the edge may be used in traversal | Param | Type | Default | Description | | --- | --- | --- | --- | - | `from` | string | `` | The from node id | - | `to` | string | `` | The to node id | - | `edge` | Object | `` | The edge's context object | + | `from` | string | `` | The start node id | + | `to` | string | `` | The end node id | + | `edge` | Object | `` | The edge context object | `onNodeCallback(to)` -Callback function for iterating graphs nodes +Callback for node iteration functions. - Returns: `boolean` - returns true to break loop + Returns: `boolean` - return true to stop traversal early | Param | Type | Default | Description | | --- | --- | --- | --- | - | `to` | string | `` | The next neighboring node id | + | `to` | string | `` | The node id visited | `dfsPath(thisArg, startNode, endNode, onEdge)` -Search any path from node to node using depth first search +Finds any path between two nodes using depth-first search. + + Returns: `string[]` - array of node ids forming the found path | Param | Type | Default | Description | | --- | --- | --- | --- | - | `thisArg` | object | `` | The callback function invocation context | + | `thisArg` | object | `` | Execution context for callbacks | | `startNode` | string | `` | The start node id | - | `endNode` | string | `` | The end node id. | - | `onEdge` | onPathEdgeCallback | `` | A callback function to call for every edge of the node | + | `endNode` | string | `` | The end node id | + | `onEdge` | onPathEdgeCallback | `` | Callback deciding whether an edge is usable | **Callbacks** `onPathEdgeCallback(from, to, edge)` -Callback for iterating path edges +Callback used for filtering usable edges during DFS path search. - Returns: `boolean` - returns true if edge is usable + Returns: `boolean` - true if the edge may be used in traversal | Param | Type | Default | Description | | --- | --- | --- | --- | - | `from` | string | `` | The from node id | - | `to` | string | `` | The to node id | - | `edge` | Object | `` | The edge's context object | + | `from` | string | `` | The start node id | + | `to` | string | `` | The end node id | + | `edge` | Object | `` | The edge context object | `edge(from, to)` -Returns edge context object +Retrieves the stored edge context object for a given pair of nodes. - Returns: `object` - the edge's context object + Returns: `object|null` - the edge's context object, or null if none exists | Param | Type | Default | Description | | --- | --- | --- | --- | - | `from` | string | `` | The edge's from node id | - | `to` | string | `` | The edge's to node id | + | `from` | string | `` | The source node id | + | `to` | string | `` | The target node id | `getLevelGraph(thisArg, startNode, onEdge)` -Get Level Graph starting with `startNode` +Computes a level graph starting from a given node. Levels are assigned via BFS using only edges allowed by the callback. + + Returns: `Graph` - a new graph representing the level structure | Param | Type | Default | Description | | --- | --- | --- | --- | - | `thisArg` | object | `` | The callback function invocation context | + | `thisArg` | object | `` | Execution context | | `startNode` | string | `` | The start node id | - | `onEdge` | onPathEdgeCallback | `` | A callback function to call for every edge of the graph | + | `onEdge` | onPathEdgeCallback | `` | Callback deciding if an edge is valid to traverse | **Callbacks** `onPathEdgeCallback(from, to, edge)` -Callback for iterating path edges +Callback used for filtering usable edges during DFS path search. - Returns: `boolean` - returns true if edge is usable + Returns: `boolean` - true if the edge may be used in traversal | Param | Type | Default | Description | | --- | --- | --- | --- | - | `from` | string | `` | The from node id | - | `to` | string | `` | The to node id | - | `edge` | Object | `` | The edge's context object | + | `from` | string | `` | The start node id | + | `to` | string | `` | The end node id | + | `edge` | Object | `` | The edge context object | `getMinimumWeightGrowthSequence(thisArg, startNode, onEdgeWeight, onItem)` @@ -717,83 +721,83 @@ Get minimum weight graph growth sequence. The sequence of the traversing order o `getGraphEdgeWeightCallback(edge, fromItem, toItem)` -Callback for finding edge weight +Returns edge weight used in certain algorithms. - Returns: `number` - returns weight of the edge + Returns: `number` - the weight of the edge | Param | Type | Default | Description | | --- | --- | --- | --- | | `edge` | object | `` | The edge context object | - | `fromItem` | string | `` | The edge's start node id | - | `toItem` | string | `` | The edge's end node id | + | `fromItem` | string | `` | The start node id | + | `toItem` | string | `` | The end node id | `onNodeCallback(to)` -Callback function for iterating graphs nodes +Callback for node iteration functions. - Returns: `boolean` - returns true to break loop + Returns: `boolean` - return true to stop traversal early | Param | Type | Default | Description | | --- | --- | --- | --- | - | `to` | string | `` | The next neighboring node id | + | `to` | string | `` | The node id visited | `getShortestPath(thisArg, startNode, endNodes, getWeightFunc, onPathFound)` -Get shortest path between two nodes in graph. The start and the end nodes are supposed to have connection path. +Computes the shortest paths from a start node to one or more target nodes. | Param | Type | Default | Description | | --- | --- | --- | --- | - | `thisArg` | object | `` | The callback function invocation context | - | `startNode` | string | `` | The start node id | - | `endNodes` | string[] | `` | The array of end node ids. | - | `getWeightFunc` | getGraphEdgeWeightCallback | `` | Callback function to get weight of an edge. | - | `onPathFound` | onPathFoundCallback | `` | A callback function to be called for every end node with the optimal connection path | + | `thisArg` | object | `` | Execution context for callbacks | + | `startNode` | string | `` | Starting node id | + | `endNodes` | string[] | `` | Target node ids | + | `getWeightFunc` | getGraphEdgeWeightCallback | `` | Optional function returning edge weight | + | `onPathFound` | onPathFoundCallback | `` | Callback invoked when a target path is found | **Callbacks** `getGraphEdgeWeightCallback(edge, fromItem, toItem)` -Callback for finding edge weight +Returns edge weight used in certain algorithms. - Returns: `number` - returns weight of the edge + Returns: `number` - the weight of the edge | Param | Type | Default | Description | | --- | --- | --- | --- | | `edge` | object | `` | The edge context object | - | `fromItem` | string | `` | The edge's start node id | - | `toItem` | string | `` | The edge's end node id | + | `fromItem` | string | `` | The start node id | + | `toItem` | string | `` | The end node id | `onPathFoundCallback(path, to)` -Callback for returning optimal connection path for every end node. +Callback invoked when a full path has been reconstructed. | Param | Type | Default | Description | | --- | --- | --- | --- | - | `path` | string[] | `` | An array of connection path node ids. | - | `to` | string | `` | The end node id, the connection path is found for. | + | `path` | string[] | `` | The node sequence forming the path | + | `to` | string | `` | The end node id | `getSpanningTree(startNode, getWeightFunc)` -Get maximum spanning tree. Graph may have disconnected sub graphs, so start node is necessary. +Computes a maximum spanning tree using a priority queue. The graph may be disconnected; a start node is required. - Returns: `tree` - returns tree structure containing maximum spanning tree of the graph + Returns: `tree` - a tree structure containing the maximum spanning tree | Param | Type | Default | Description | | --- | --- | --- | --- | - | `startNode` | string | `` | The node to start searching for maximum spanning tree. Graph is not necessary connected | - | `getWeightFunc` | getGraphEdgeWeightCallback | `` | Callback function to get weight of an edge. | + | `startNode` | string | `` | Node to begin spanning tree search | + | `getWeightFunc` | getGraphEdgeWeightCallback | `` | Function returning edge weight | **Callbacks** `getGraphEdgeWeightCallback(edge, fromItem, toItem)` -Callback for finding edge weight +Returns edge weight used in certain algorithms. - Returns: `number` - returns weight of the edge + Returns: `number` - the weight of the edge | Param | Type | Default | Description | | --- | --- | --- | --- | | `edge` | object | `` | The edge context object | - | `fromItem` | string | `` | The edge's start node id | - | `toItem` | string | `` | The edge's end node id | + | `fromItem` | string | `` | The start node id | + | `toItem` | string | `` | The end node id | `getTotalWeightGrowthSequence(thisArg, onEdgeWeight, onItem)` @@ -808,76 +812,97 @@ Get graph growth sequence. The sequence of graph traversing order. `getGraphEdgeWeightCallback(edge, fromItem, toItem)` -Callback for finding edge weight +Returns edge weight used in certain algorithms. - Returns: `number` - returns weight of the edge + Returns: `number` - the weight of the edge | Param | Type | Default | Description | | --- | --- | --- | --- | | `edge` | object | `` | The edge context object | - | `fromItem` | string | `` | The edge's start node id | - | `toItem` | string | `` | The edge's end node id | + | `fromItem` | string | `` | The start node id | + | `toItem` | string | `` | The end node id | `onNodeCallback(to)` -Callback function for iterating graphs nodes +Callback for node iteration functions. - Returns: `boolean` - returns true to break loop + Returns: `boolean` - return true to stop traversal early | Param | Type | Default | Description | | --- | --- | --- | --- | - | `to` | string | `` | The next neighboring node id | + | `to` | string | `` | The node id visited | `hasNode(from)` -Returns true if node exists in the graph +Checks whether a node exists in the graph. - Returns: `boolean` - returns true if node exists + Returns: `boolean` - true if the node is present in the graph | Param | Type | Default | Description | | --- | --- | --- | --- | | `from` | string | `` | The node id | + `loopEdges(thisArg, onEdge)` + +Iterates over all edges in the graph. + +| Param | Type | Default | Description | +| --- | --- | --- | --- | + | `thisArg` | object | `` | Execution context for the callback | + | `onEdge` | onEdgeCallback | `` | Callback invoked for each edge | +**Callbacks** + + `onEdgeCallback(from, to, edge)` + +Callback invoked for each edge during iteration. + +| Param | Type | Default | Description | +| --- | --- | --- | --- | + | `from` | string | `` | The start node id | + | `to` | string | `` | The end node id | + | `edge` | Object | `` | The edge context object | + `loopNodeEdges(thisArg, itemid, onEdge)` -Loop edges of the node +Iterates over all edges connected to a specific node. | Param | Type | Default | Description | | --- | --- | --- | --- | - | `thisArg` | object | `` | The callback function invocation context | - | `itemid` | string | `` | The node id | - | `onEdge` | onEdgeCallback | `` | A callback function to call for every edge of the node | + | `thisArg` | object | `` | Execution context for the callback | + | `itemid` | string | `` | The node id whose edges to iterate | + | `onEdge` | onEdgeCallback | `` | Callback invoked for each connected edge | **Callbacks** - `onEdgeCallback(to, edge)` + `onEdgeCallback(from, to, edge)` -Callback for iterating edges of the graph's node +Callback invoked for each edge during iteration. | Param | Type | Default | Description | | --- | --- | --- | --- | - | `to` | string | `` | The neighboring node id | - | `edge` | Object | `` | The edge's context object | + | `from` | string | `` | The start node id | + | `to` | string | `` | The end node id | + | `edge` | Object | `` | The edge context object | `loopNodes(thisArg, startNode, onItem)` -Loop nodes of the graph +Traverses all connected nodes starting from the given node. If no start node is provided, traversal begins with the first available node. | Param | Type | Default | Description | | --- | --- | --- | --- | - | `thisArg` | object | `` | The callback function invocation context | - | `itemid` | string | `undefined` | The optional start node id. If start node is undefined, function loops graphs node starting from first available node | - | `onItem` | onNodeCallback | `` | A callback function to be called for every neighboring node | + | `thisArg` | object | `` | Execution context for the callback | + | `startNode` | string | `` | Optional starting node id | + | `onItem` | onNodeCallback | `` | Callback invoked for each visited node | **Callbacks** `onNodeCallback(to)` -Callback function for iterating graphs nodes +Callback for node iteration functions. - Returns: `boolean` - returns true to break loop + Returns: `boolean` - return true to stop traversal early | Param | Type | Default | Description | | --- | --- | --- | --- | - | `to` | string | `` | The next neighboring node id | + | `to` | string | `` | The node id visited | ## LCA Creates Lowest Common Ancestor Structure for the given tree diff --git a/apireference/functions.md b/apireference/functions.md index 3688f9c..d863ef6 100644 --- a/apireference/functions.md +++ b/apireference/functions.md @@ -111,13 +111,14 @@ Callback function to iterate over pairs of crossing rectangles ## getFamilyLoops -This function finds [optimal collection of feedback edges](https://en.wikipedia.org/wiki/Feedback_arc_set) needed to be cut in order to eliminate loops in family structure. +Computes the optimal set of feedback edges that must be removed to eliminate all cycles in a family structure. This corresponds to [finding a minimum feedback arc set in the directed graph](https://en.wikipedia.org/wiki/Feedback_arc_set) formed by the family relationships. The function analyzes the directed dependencies inside the family, detects all cycles, and returns the smallest collection of edges whose removal makes the structure acyclic. - Returns: `Edge[]` - returns optimal collection of feedback loops + Returns: `Edge[]` - the minimal set of edges whose removal breaks all cycles. | Param | Type | Default | Description | | --- | --- | --- | --- | - | `family` | Family | `` | Family structure | + | `family` | Family | `` | - The family structure represented as a directed graph. | + | `debug` | boolean | `false` | - If true, enables diagnostic output. | ## getGreen diff --git a/changelog.md b/changelog.md index 70ff1c7..c5a156b 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,5 @@ +#### Version 6.6.2 +* Fixed computation of the optimal set of feedback edges that must be removed to eliminate all cycles in a family structure. #### Version 6.6.0 * Added templated end points to connector annotations. Added `showFromEndpoint`, `showToEndpoint`, `context` properties to to `ConnectorAnnotationConfig`. Added `onEndPointRender`, `showEndPoints`, `endPointSize`, `endPointCornerRadius`, `endPointOpacity` properties to `OrgConfig`. Added drag and drop sample creating and editing connector annotations. * Changed CSS styles for connector annotations, so when they are rendered over diagram nodes, they should be transparent for mouse events. diff --git a/package.json b/package.json index f213461..7cef1f5 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "basicprimitives", "sideEffects": false, "homepage": "https://www.basicprimitives.com/", - "version": "6.6.1", + "version": "6.6.2", "author": "Basic Primitives Inc. (https://www.basicprimitives.com)", "description": "Basic Primitives Diagrams for JavaScript - data visualization components library that implements organizational chart and multi-parent dependency diagrams, contains implementations of JavaScript Controls and PDF rendering plugins.", "repository": { diff --git a/src/algorithms/__image_snapshots__/FamilyAlignment-Family diagram horizontal alignment with multiple cycles-snap.png b/src/algorithms/__image_snapshots__/FamilyAlignment-Family diagram horizontal alignment with multiple cycles-snap.png index 995e249687c87643356f288e70bafd3aee835131..e1aa82f02114e626e90db605a016fbd9a04d5b0b 100644 GIT binary patch literal 6987 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 W3znVfhbW4Hmz}lag*q$0wEqCB(Rhad diff --git a/src/algorithms/__image_snapshots__/FamilyAlignment-Side by side 2 families where the left one starts one generation below-snap.png b/src/algorithms/__image_snapshots__/FamilyAlignment-Side by side 2 families where the left one starts one generation below-snap.png index 59913cc3a1e77bba21c98ae93d5bf8ad94836f24..e37ca1ac47d9a54084b2d2ec3378e74f9ea70fc6 100644 GIT binary patch delta 2138 zcmV-g2&MP67_=CWF#+z8GAa|}nSebMI(8^XQ0g&WPh^iPC_#~L904YgjEf|Cy@k(H zbe#KIx7(F&x4U?;3fcW6BB}dw+twCEQF2UKy{Va5yY;_`*7!PAnpE5CjVyHugh>aT&SK_t0h4Y zEOgAOEYpY6=~RCD>8E7-mtTI7larI&{a?O(nS9@WYPIC|-+y1c&;rY}`Knd%UikIb zUqxiG`(G-Y+^LW~)w73+wOUQ0C`zUrynI1fcCi$4-aRK7ZG{$=8d#k zE%7`r^^oOphqmUt?$p)P7KUMJ>SWjLzSiw_rB?C`cbMUEcI%sspBzj;eNwOUR3{l08}Z*QlrQ~hw)%ANY!ZnEC_1<~}{oi-RD@ea-W{crX|wLs&EYHOIKuaNE^x8?)a$roG+!&T3nK zQ=e%Q`~3Ftc6-^(^I%@{eLvNg_7pP+f_O5S%$#F59Hx#p-<$g|ZDvocOk3D}=C^@4z|@ts%wlvpoz#27_x;qieJ&A6)obq4_xT;LM5-Zd39$!r1sZvI4o?NvTwRLj#CeiU4wnT!C;W8*FL{}y!p!NYxkbB z`rXJ2f};C!+su74xIyN&XA%3&l%?nmwrsz<+wQ%W?SnG+=k~AXd8xsJ9Y9%s_1a-+ ze`Vcs(Y~&-SzrbYBC_0?({I21HuJM?w=3J*+smA;l!p%=%IWE8?(4_L$H@@UOohr! z?Tov3@5+l8FOuzkzh5{7SVq6!m*H?I@zpN{iQ{9DeyYB#zIM5P?Gyxo^m;vsqA0Z%X4~4@l1`^H_bqCOZ52C}`qojZjUxq1dnolz9YM z!Gi~d=g+c8dqzpKOIR}*lpMUi??*ReAL2QPm|}iziQ>R9ym43L_@~Dlu}JV}F0Y>JnDs?Ch-S5`cv;asr?d z;Z)LSG+OF^n*?Avgi{Hl(MVpsdR289z*=F=sf1>;DH|Iba(Q`Kbt%BwVC0iQ3lk*b zuXQDi$74A^KTo!s&1Qww0PBHpDxuM6NTboHx(r~gFs%cT(JPbw3n7#K3n3AN69APy ztGWQ~&d$!NE&*6elcEbEf6e`z)1ya^K13ZK+><9y3SVE>`v$aNb;_YG8ykrM!w7W%h!Q54DFfB!8apU#M)jPZCZ=jZ1lBC@x)CmS0Z6;}j& z`bv+S#^bSk_0?ChzrQcveDjS&QFNVksd0IEDI!;4ytA_-oKX|-fh@J=w6U=vo12@fu0x=L*HZsIr+4q( z$(LV#x$0Wfy1cxU=g*&u$W>SoP{8$DYUH$TBZ!TSjbzQ~pMUQamjSGW(rZqm(MVps zdL<%~`pnO#&i;(k*I$1vTU%QdR|Kqw(&5x>Hl^8YUS};TH5v`3b3g_7=PQ#j3t^K` z3lJaDXJvOhJ3G71I@DU%`v$7U$O(W-wK$IBs*3;s7bBCw3tp4{3lJ9ce;72FuT~&T Q4FCWD07*qoM6N<$g0^UNLjV8( delta 2151 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 HQ`!FjH-ywd delta 2748 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 Qz(6y+ZhEa+*Cpov08oik4*&oF delta 5075 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 diff --git a/src/algorithms/__image_snapshots__/FamilyAlignment-Upside-down tree family layout-snap.png b/src/algorithms/__image_snapshots__/FamilyAlignment-Upside-down tree family layout-snap.png index 90fa5337398ebcb8212587f7a5ead0955522f8e2..0b47b8b2eac351d52f3826805c08954c81e27883 100644 GIT binary patch delta 3173 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 delta 3173 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 diff --git a/src/algorithms/__image_snapshots__/SpatialIndex-Multi-layer test case-snap.png b/src/algorithms/__image_snapshots__/SpatialIndex-Multi-layer test case-snap.png index 54431a815585122dd5b5ce56e5833633989aa768..dd920aaed531d183057314275d550e1f88026d92 100644 GIT binary patch literal 7657 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 ah+sIwp7)5i$==;UCyt&*<{iHD&;J6qaLUa9 literal 7665 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 diff --git a/src/algorithms/__image_snapshots__/getCrossingRectangles-Two aligned disconnected rectangles 2-snap.png b/src/algorithms/__image_snapshots__/getCrossingRectangles-Two aligned disconnected rectangles 2-snap.png index dfa18b75a601595f54ddb2e0590f33aa6ca11794..876e933d4ca693e4d2c66dffe3085206ec382d75 100644 GIT binary patch delta 2399 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 RV7CAO002ovPDHLkV1n;2E-(N9 delta 2397 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 O(ZeUdumAU@8~+2N#1Cu$ diff --git a/src/algorithms/__image_snapshots__/getCrossingRectangles-Two disconnected rectangles-snap.png b/src/algorithms/__image_snapshots__/getCrossingRectangles-Two disconnected rectangles-snap.png index 6fdaf1936cf42bfb7ed7f6c3fbdcbf075f48f2d6..b2540650991757845147f0ed8e4dad2a77b70fa5 100644 GIT binary patch delta 206 zcmV;<05Sim6sZ)DX9?Wf2D(U~Yd2z%aP|otA0JP(kK^NGvu^=?0~YfB{d?Kj*%6T+ zfza#qCT?#h5Km4{lL7^0O!4t?7Ie*KQ);!^&_FBNr|-do2Xb<9BArf09zJ|1tE;Q> z`SWMFyu8dV&T6$PA3uH^*|um9mwj53H!g~5uWdsaMfIJVo0HSi)049WwFC6@G?Qxv zO9Y1xA0)H722lY6j*hOA4hUQWefpHMZ3ra+1CEYnla&d86kJ8dYXgZwr2qf`07*qo IM6N<$f*O5WF8}}l delta 206 zcmV;<05Sim6sZ)DX9>Eu4Y)|awHs-XaP|qDoSaOxkCT%Vvu^=?0~T_0bR;`FJ0kKU z5PH4d#O>__;)f3(lL7^0Ov%Yf7Ie*KQ);!^&_FBNr|-do2XcCPDxFS89zJ|1tE;PW zdU`6CmzUYaS*=#()2B}(+ZGMtvQKOB#zj%>wQVS)sJ?S^bMo=y$CI-KwFBtrD3faj zO9cD(?h($ diff --git a/src/algorithms/__image_snapshots__/getCrossingRectangles-Two overlapping rectangles 2-snap.png b/src/algorithms/__image_snapshots__/getCrossingRectangles-Two overlapping rectangles 2-snap.png index a792f41ba3132178b9c418aeb57f7ae458c591ae..948826501fa25b91a465106d941afc67fe1f154e 100644 GIT binary patch delta 2271 zcmV<52q5?07vUF>F#(&AGC4r`18ji_`aq#um(WOb^U$~uS6aGuy6@25^>qH|$IG^? zs(L=a5Pd%S+~@8-rBMaQP}qO_La)m-rgRmzyCQrJiMk_&QGJ!xVCy89v+tVga27phlhvOXf)dzEvs}%k$ivbLO10`}gnL#~*)e=jZ41szy+&)$I8A z_)29QA0JzPp68ZjS!hGI+qK=@-7AM*yWPIh_0!5eI5@c0GJCyVXn(z45B-s4*;0Nm zilVUH-QBs~qgt(+bIz*O>Rj)08S40(TX4L1@nYol{{FtTS}ohz*$KyLwVDkE1AF)G z-Mp$XcePs0%g6&CSiy<4>MExz_vKlv=H3d7dx2 z8VgYrg`J(9N!QF29DcTtE;G_|eksssG_2Wd+V1YIRVo$h_xslAbZl#D>q6PpYSs4k z_RQ>`sbZti2-lg7E^p%BX8wIeQH0rzuTP`V7)jA|8tTjU%a5|zQCWLa{`jLuk4BD< zt8=@5-5y!u^!t6gefxH}#vhBX_x<3H`zddH&bKkG_qdr*{NA{2@pW<8u{iw8+`fG~ z)H81Ha5xNYm^6OI@y|PMSKJPN%s*4#?`6-zFWn|Buj2c~W5-|X&(C_!x7E9jF{plK z((!kAcxVqFKD2{_gK+&UcyU?a$Tg^>DAjU=YsF(q3N& z|Ksl)%d#xAHP7>K-#pJlS@AvNy87$8-L7-axmK$c%JcX1eeTbdm0@O~jI@t>z1~QF zn|yooJP++opTjuaZg*r1_+x3GrLV`eJ1uKm{p0qf<@;yquS=grtJMm98H=A)uh$E8 z@qO?6Egh$R985YFKR@TLHU{Hjac9S6O=@p{T#kQV`at6jj(>dJ%RY?b+LG2geP4Vo?WNNxd>_Phi9dw#piDpTWr3AG6MwC*>tHY#se^Clq-Rk!PA0WK z{UFEJ#@9_cR~GJ<8H1DRe3|h#somr1KXs{6tyV3|GJEspjhX$mmS10A5C4vTHwv9| z_T6{iT_|I1ZOzQge*gXVX}243etvEn8yh3X{OirlO>4DU7p7y+o;?doq|0nLPHJ!Z zzHYZ`&1Q3CO7Ghk_lf)a&+~RV9sA&e4`!~*_V)J78+Nr?%{rY<=!dhjv(WFUv$M02 zO={&d!dVo}P{@8`5ci>nxkVz7KuBeE8vqp{zG=-q_u{cSAk=Ie%Rl->32U z^tz3WjSEYwNzY8A_Vri0tRPJikzT)kJvD45eXx}eeQee-n7XO) zH&bxz@9&3!6Mv<7_wHTmbUGuOI{vqO+FAa$b2;K@v1N-*d zZ^LoF0hxYKn$4#5dOhiDyMDiK@7}!&^`11)?%%&ZGE?$jo%@YhGqbP1{(9znm$`TE zp8fE{50kD29e~-3A<2FXqJ}N86*Qaa~F?|+s|EBwJ{u!kG>F@2wUEKEc`IeoF zKPUBi{nBG_T;HX86w3IE+v+#Ar;Wdvf}`vqm2E)&S1e?3|5>Izn=oI^7!BC0g>SolduXGf4jBl3fz>ZPoFNj z3Yg&e^XH4M0tC!B0LWHm#^F7F{CLq-K;-D?Xwg-`B{1UvAY0ksI6Xa`=}$WVxM(GV zMOOn@S}V85VfNQwgM072_w3I<|6FucfTgsOGY$Y(LvR3)5gY(y1P1^a z!2v+FlHaQQ_S?N+v{!3l**c5B)j zo<4ng6ZM$8AAkJO%*@_@|NRBm8FdX0#*<+4gj*LGY;?Z#t^J z_R&WlEx0Dv?Az7&DWf3agVK2@5x}TZ^v1O*=X|T67hz#oM=U&CKkNKmJ&7 zO|XiXaR895%#7o!ufAGz6|R+^IX!>=e8DxrDq@qZ39uWtW_{z)(a}8X0bq$R;{YJ5 tIOp7=D*<4+FyoT}3rUk82^tr&{{y<=b9=P+0m}dY002ovPDHLkV1oX{|D*r_ delta 2262 zcmWkud05iv8pS)!*rGK{YURRAP1k$NhRkxwg|cb2w6btZu?);5)Nn}Git^}y z58U)s^3nCWv*WGze|=h>&&z8b7-$j_@e>LfhoCF-(BW%b)9Rlh7COXI`I$x2Ln z=OeR$tTRWYe+_Yik~%h=0qPyM6rcI)d*X=lrCLweTX1bbv#;RIOE#Nzi3ftjU`RMM* zqK0wtSvXxbNA-|V$GLzsz_=Rf3x`*P9l96EK)brShV7Z2nRyGW__5u(107q(naYKQ z7$3uk5-ej@Ai$1}jwbT3Tpg&Ft8t%7+`7ptxfizPS&DkqE}}#c6^mdXWVnj%^L**p zz3F#_4!c+yjfNpg9PaH6_D0l-lJ{>L(rXrFmy23zMTuy1*hcPT>J0%})%tgOheSe0 zMPxEi00x60y8tUQADSex>W_(sx>Y&-qVNY#|D{kU&bFefCzcxW(kYMVs-U|kDz6IA z!py9!wb8gzc5qExR8*8h7ZXuy@hcu}K5OS#bfUR8IX(Lav!`ltZ^6zUOb)@~+o^(T z;dx{`l2|Gz?iwjy;Y0m#2XEzEp^XAc@cs8S(#28bD7*8JDLjX>Xbp^oWKUz;ixN0| z!Tl)>?`9#Zu)Fx(BytW^jy|EM;qyDM-sr4a_9zAC)P+Bg$MM}*<+iSwQb*>+Nx zi?1mXAP!>N8Ip{LN7WvrVs2;WF}!x^iL;Z_eR=$LU=AINW{TxLGJx7$-_sPyNM**b z@`3n>xfMU|(xP7Pf_{_HBw0;q^NDt3*jZ_92^2G&@3+i!AH ziDXcBSPKQD;bhbkMm9ZPKbP&&Rj{~SEJ8|^nKW##rOA0Zw`LIwFrV9aY(iBLKFZZ6 zfRUNea#{9`ES(c?KC^9C+-qo%-i_eT98ZXt{tRWq_DSKPK(x*+l7aZt9d3Az8 za1k#}nfF#t#}2e;zxZS|xo^{8hvQE;1Iu`WTF8@roLF+u7Nob0r;?hdO#F(_+{))x zsN8ysS}S^hcD0?xl$ADLz#NB}R~kN7*R?1*^%R)8VvPz^eJYooqMk`9b=qpQ(kLPD*W-3-! z)2|Qz5e!7d53d6WpY*fSCGgEC4naS-AmKQEp6vS~@6rYo_0@=PCMRDBk35I7Z`f0C z?X%bMX&4n{|3=gfCN`lHBt6P~D#fse zJpJ%44MQvk$B$=8^E6r={Pxo8cC$&JI+k*z8d{2ONZ`bT=th{9V6a5kF^;QkqXkQP zN)2H$V%%VlVl;(I`yxRtjJL&~Jb9AD`oo>rbKc`O=d4Nq(S!rP*ht0;X27bt<7L_ip_sFVVV z8`U{E(Ic)V0@1(xWeQcxS#DUK(wA|9^_Vf}ey zcU|&yHoziyV0F+5M-LibRJsp~_NmdaOF9a$Q<_i+!o?irPx@(-8(<%Ow|r%FUU)pr z>IXl-l+%Ct&YkVnkm0T#?^pa1D6Dnk11IPjG_ONDL9Xw0bgHST@h~P>LmU{_Q>k?N z2#jl}|C9&`N}2_|drZ2dRA|o9UE>#7MIm!zT`A%g&uSuZ{btC4dtcpoI05-_mp9}+ zVkN3fO4JKtxXwi9n3UvXw>r<)D-jhla d+Hl<-1T>Xcy!TOeJBa0+J|6rlGcfkv{{aig0Wkmo diff --git a/src/algorithms/__image_snapshots__/getCrossingRectangles-Two overlapping rectangles-snap.png b/src/algorithms/__image_snapshots__/getCrossingRectangles-Two overlapping rectangles-snap.png index 79ecba840816d4fa31c88c61e58d18efcb2e9ac4..dc2f1f8efd4d87fe566d4adb39fe2eec79bea607 100644 GIT binary patch delta 2357 zcmY*aYgCfy7FH{>i#c;n7jNmA<(Vc6B{h>SYSUylCmXGFG}DTJ@NNjD2A^f+D#bKS zvs6}@nt3516f{M%!~!8PBSb-^B2+-UfcXiWuQk8UUh7@!{juNuKF?myezthS;D$U8 zpz!ei-%ngFRSh4Db>KL2v{cg41*<~l(&)Rj5Ay;OuV(Dq*7Nq?&mXM~aSmGxoBD+# z{qJUP-|rz7vD0R8S64)QV`UW`829jdUC0!=e8Z;AsxkJ&Dv%`*1T;#~c01A;$6Ns*f1`q18; zn1L94gPvuDU+i^5M6pS})1X@2z=&{@3=OU3#4sLMTP^|TwepwGJT5UJdU=x}qdtyn z>cw$UC-3paVsRsk+wg)1Fc=J>93J(ODFh>nBkIwq-!7a>%?&o%%YQ9)=lWakIIxdBGC{j9*7wr5D2_UO3k^7J}XfP**$TLjW!Yk zg0G9oRH$#Zhx=0O$GLj$9hx{eJpH(Fo{kY5$h}jGYXyd#!pCMoVk;3OFuR?zsd~f6 z9ndxL3cuN-Ue7G~Yf;LK*W#1Kjfh3=P&;w=2d@N85@L1y{q3Y~tzdUT*w7k)=YL$L zK?z>Lhc~%V$G|s8PV|I8kj8HwXua+6l!O*)FC`_NIY#kgw6(P*8DMh3&}trUF3nd_ z3gE(vSfRD+_yZGjQ@A3OyI=SQkxk>N!*n!ctwsUIp*H*amnM1}#xW(l6ZQxwD4 zmuf6;7Z_MHPado=Ul&XjIbeZ;#KdyNqhTe^wpyaf%`pdHD*CKGSrx>!4>K`|*zd-Y zg$W_14|*QmJ%)i`?mK-&29g3fHO|Wm_-_OP7MI+~q;UPb#^Pw>Kel%Plddt~waAGS8{W|u^-|6A#$6)m)^vCPch zHBSgiTaS{T4*~maE?$YhGW-OG8YSg>AZqv40E z){ZJJ0~POgVq`@9Fv~MEG?d4iyyI`YPiXxagTW9?MngW*sAn*|V;K>ODkL?kZDrt- z>^MYFOyWX&LUU{{8h8GPMq;bK1%iM;qD-0Om+kfvp^!-ASL;?t%w<8p&2}l3*l+p| zN~N-A69dQJ;o}pJ!}UwqfIltnP&H6bkFx;%W)0KIYRXNTv@IQD$*01Gqxo}3_ZgDC++|{t7!#}62Y$J{zUOPa8vloRtz$j)pt+xCaw*x*K z&td9{7?8vy!^75`#Y|Ta{RkTV&TY4%vy4++Ho}{y%N1vVvv|DsY;{xBfksM>6w>c^Yg`P|T=?-Wv~c;U@9#P2jhQtQ_JG$ij#`~yi_nHW zfZFpssM?EGBR9RPF8gBIRZY)0QW>%<&;$G}Y0y*&!}&^@mTqu#zeMZhojyhPr1BO92Y?q z6|^@&Hlx$ZIe%#mFH!YX9CY#e)il78-S_qaAySz3OC?!0&V!I-Y_FaBVMT}Ps8oqm z8fB$_ycx!&;Z!={syu@<^R>4Jon9YGN7J#1vUY1Z8e;lYC21}~0pd@j9Le2}C?PA{ z6}gR&uPx@^M%x3Gs~+xunJa!se#Z#cbdXfF?8 z)>Fktyi^D%0=m;r8=aioTUIhV?G5T#|fQK=F@GS=Vr#lDvnsc)8P?Rod0n6%b~=p(AHW z#$>l8=k42DWu>LC7WwcdvqsGR;{u_zT4UyU4JvhjR67l7*b*qsk;H~9$|80NjN)MD2wfSimo)Cs z55jXb77+Cu&*2Ai^MfF5&r?HZfb6Z7A_>*RShei zFaAIOjsNifr#T%$WViX=&}2R~n@ Gwf_OE5jm;= literal 3033 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 X8TSn_ht!}~hlGV3Imq09`r^Li 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 UE$mvP3V2Q&b8{*`;{Tuj0Wc12Gynhq delta 2997 zcmX9=dsI^C9<^L$EoU^+w0vMg^{sWzxAwR9{_TBgV2@$Bj=!BNQ-6ls|8zRCG<{L`qO1^yWx@mF9g}n7}oggUy90YkQ25e2lr3EuE=m8 zJU&6L)`RR#ao$;d{q!_9y^^%B)*LNCeOsLFdi<@Dp$k#3I$ zuTghp(e(NHA=wU{C=Fhyt258rl@HnTBcPF4TOBxXxIH{P{Lj7_RI6}wY3e46Ph6Vr z0bXQPpmSEZ_*5>B7x(2}NknvXbjM^Z$3Ur6_7GTVTn>R{4uOC>3GLw}Tkwd`@bJF| zM?$=$H~%OoC>Rw8uoNnV(rgN$t=ik$Gg=hB&d$z5F(*qTbD>uE@88z~J)|JUAkuP< z!ylah7Fxb6Ewi~X&IAXn9j6P#gE z`EVNZq7NdeU8FVmL5@saix+8Dizy&cae;sK0W+PSAG&{fbXZ=aOJh+c3l4@I9?g+H@5U(o zMGa~$PI!sMpQAo(6%tfm84*!>P)dizOSI%(^GNKQ+q+@CW9OI5^a+uwBp5%zJ)9(gNGF!q;QyP;+c9mF#>7?xP{WL7+h)`<7Vfp1n*@h3=SvfSA_yKpAM!g zIxuEgo}xtK`k0WYsHdrbWwqC#fz_76ik`@OO3)((YL})%&P^};g>QR%d#hKY=TF9- zGlat&vYX1N@@6{Sg*1DO@}rQz3L_Gk@WrBs53{V&)X9Yw=TMb5`E?&HdLUqpcRjKdCPEJjQfzks#vgP%c!E2KxaWGgYh2rXo zMt`DFzi3U0x#6|7wJ20A#zabL1-UnOPnO@!%gZY)EToT&jDSd}E3uS-V<%4re0H8* zn(32VK1W2kySbTd*;jcrhZHAl*_Y*6(I$*;ls5|!<$~tIvNE~*UJiL76opD%=rV-> z5D);g=}^M-m-5A3ZGAJHXe*jA#J6k*wkh5k1Y`3jaQn$R&NL#7x+=G4QKkJ)*LZ-| z2m(>B%*lcyNUj$$&}`-f)18tKV>=tuIyIG;TkYE~_$3P)>3=_<8!K=8b~S za=(n4RJ@IXSsL=}r`*N?nMsqj-*hb@60Vw;vE(?V2!gUS*vGva{dZJQGA? zdK62iYYmGtm`zP&k-{I}A#KlGts^7vOeubLBhK_zlE<^02b~Pz(pwmt&9QVt@f=H( z4NCJrMT{F`hU%J9Rg1a+$E5|HEEg1u@G+JzhSMN-UaM{7P|0!%JF*e8FiKUN13HEH zNnE|Dot+&x>g+n?&9)(JT_c_we*97yJaF{t@0BeiY~%?uiC(A1Sk{V9Q{501b*6W7 zxdjp1Tay(>@vEo7g)_BdGLEDAYh$dasOT^+_D;R@WKG1Se}}!xE~r;)HR_Bq+84IR zl6jUVWyObGKR*~0*VUD23RDOQ@BZ${82?g!mbf790^=*3LedH1`dA|=i`P||*wR6? z08tQ(#m=_+T(j6=2<UdYi z8&K>Q7)A&wZdw!k$@Wp|-Yt=M{KymHK5wMGm0vdidJb?&l3t+z#M8w2?`bJ1E!dR< z0abms&7BGN5=F8OTbTIOue!8|y+VRBI5D5}84%y2`S9~K19w=WG#GaV}iP`(LRgC6JzK2VvaN{!;xIxMCQD1&#Wh` zHt;-TCG3{=t{8tBqsBCv%EpPtht}1ATAEguWd5=^52t`$75wmZZl$_!Nu^S8^zQ~; zc&nKswGw563{J%uSa%PO2DeP@)qmy$kB_HKesgh>^Fz)y$2CG zh7kz~&*c#EH>IwLe}U_+?DyOLNJN$OudR`VHqUn0A34&G*e)BRH*DMOvn@Y;AH4QzX^8w*HtNZTVJLg1$TT9)?d8p1oR~Y`~{TQ^wE}*QIsssHD8bJmPIlE7N z+|@Nuc}V8hy$NdD5C8DijXeL8&}M#*MV{`VDLVWqg1XX=cysIfm9W&*w#f^FQxEWI zx9JRJ+W!Gv)7t{Do00$q>20tA`w=^RY^=R!!QU1lSV1lCbfUwv;7m(*Qm2tO90Hu# z)FcZlbes}Ezm(?c9;0n>6W39wyE!>S@ZCYa#BkzdcTutJ-ytrrhSR(EY|RV?D*w=;_Y=*; z#6$|+Mn<{7^v)BW49S+I(Cxo0C!+G1d%}&+NWN{r#pk})0iO%!E}`nq{Pf#@0Z&#_ A-v9sr diff --git a/src/algorithms/__image_snapshots__/getMergedRectangles-Dumbbell-snap.png b/src/algorithms/__image_snapshots__/getMergedRectangles-Dumbbell-snap.png index 17e5985353988bdee013305fdbea64d27269224d..7a07325518ca41f6e033219b3a9b09007f73a19f 100644 GIT binary patch delta 1893 zcmV-r2b%cl5#|w)F@K;*L_t(|obBB~YZKib$MJtI_bo*0qVFJ8x_DeXf(@jCFnt51 z0ddjYWrCPo+z5s1LY^r|%X3#+l3EQm}X6?zvwi-Hr}xpL8(c@gI>Awy9|)$I(=+FsocZ<4sm7Wy#s~l?{NubE0N~d{Z~#yvIFq&r9g{E!2$OyYBY!_7 zIM&wIq*kj*tyYsbj&sWl27{!`cs%|Y%}VKXIx-jxWH=lq?Z`eZy772Cvv!t^L#NZ3 z$vLtHgF#{4Wyi|c_tiSD`E}`-Ihjl*rr+-;Uk5>8L?rc^%kw-l$L5sEYnzCeD2kG= zJ5G z)vMIkH*VaJAPA)0Zl5YU9*?EjY|g7GQ+2yt@qNFv%=-Ge?Cb#v!C#l?(LO(5yf$Q>J}$&Ox*stZLrJh?d|Q{_LcQDE3fbF*q!C# zuh;7m1cCH=z2uh0w$ZlPzJD+F7Q?;uam(e6y*sW|kLAr3%u$tPi8#wU-}g-r1j#XX z`R@CEvMh9;8)Hnr-#3%V!~{W*`X0M{w@YBRd>Dqtn7^0D?sD9%+dWsm-#^u+$z+lo zv&-Eu43l!U{_L%a`^bu-C^Zi57}>Vk@yQ#LD2kHv+kV+P?K#6ROn)7l*4OM97WLi! z>AqG(3YPZ$en07FwjSF?dy63=$ynK2zP!HKI^FSd+gf%kJ6E!8nbsfZObrhE=GqAu zhGFXB%U)payvZ_|OisPw_I}iTL{W6AoGoi7j;-H)o)-e1=cOi4(FC&>vhBa+ zUf^z+x#N?SJ%_6(9DlOMiu!6y`l2c8yXNBgk>If9ijHOL&z5!jQ+BLqu1q^0&Ti_h zO1)ke-}mLyr%xgxa&mGai;IiNbKm#Hd=DTo#>mdjPNn+x_Vz?Xh=1ma{K%H z5=Bv}?na}LTj%=vx*Q!HiHOLzZ{Ni8yyUrjpIxbkt-p$Hw|^_1=gG5Y&r+{{{rXk< z{eG(6jg5`e_*7w+@KqJ{HLI-eVHnEN(o$+!?=JPrZhfrd<74qWFZaEhmFw59S30Jd zE0~Q+dmNjao3gsPDz#coUcY`V-ELPzL>3knY>XUA6Zp!ZNt_+7mSzcbwE#rA! zGWn<3*w~O>uYV`CT1}RgmgMEjmm>1_wBx!5@U>nVJNGss}jet?Ck6$7u~c?#5j(n*Xzmp`g-Md zpT)Fbw8u1a1+!5pIG#Ltk~^tx-n=RM`}?WiliSUK)WHL$GXnzXU>-AHs1>3$L2vYU$?(Ryv-Ok-uYcv{3dE18N zM_k+!HiV7pDDYCbbqh!zV7aS+`D)0 z)TU+_hRO5net~;`YG1P(eQr6cXurWKdfn|;-iBUTd3$f4*Pbe4^7-@UR2f_Mh#u2Nrdu}uw*ZnvBKr6v0~Iy$;AyViD(#BJZhhYyqc@5|&W^%WOe z%?udDmOcOo|EwOs84!`-7L%|D6I8XS!BO)iYDvmdw`{#m8a z-QRzcl{>fR-IjBAaQIO^{O_-s*L#)54_8B_;8?kHTb};=U-NFu`TOI~xdg{m8b4eO z>~WKj1{IOeCqGu{gM6-<(P%W2j}IJ;Ml)y)aPbfvISvjE;cJFi-4ZBDf00000NkvXXu0mjfA(#Z% delta 1881 zcmV-f2d4Pu5$O?-F@K{;L_t(|obBB~Yuij7$ML_HeG5*LL*9YYlEc%(78-+7C@AzE z5-2_Nw#by)OD~1M_D~+>lJM*)r-DuHrG`>uNDA3Q_7JE{Z$0&pM0ydkhwf-ciY)7& z+D)G1`vFs1Qbsf5(J!M(>eP%eMgTzJFIQaw0DnFN2LLsK1CxdZ9FuMcD}VM&f@5uM zO=`88)M~Y{$MpOC^qA3T^ed{B(Qdb;-|x$CI85u2e_VH?(P(P*EbE7MyFHb2#D}rjbmmcj$_m7_0rct5Ev23Y;$>@XJ%NPQblzW5fepG`r7k6<9Xgs zohRQX(-gB4T{sSM4j4e_!nwbK8ToOP&e(F5=KAEO^y)ID{&8&Q@(P&5< z$08!Ky}doPa$BvI^m;w@zB2ju^}~k`m#!bODg}p~0=o}8Xxx2kYkzAZ@?(0~?RI5z zb2Bq_e){yO3?-M+ib#b2-2 zB?toPcDv~@9|S>*F3*)c0<`R^3-LRxm?VrX}J`?|k1kK@g<--08dT z`{}gMeQt~~y%xP?%*s6j-tU5$MJR9A}TU1IL!{J}(LZ&+{?^Xxsp^7qV@?oyp?jV*1?oeK9`*NQ^PEv$IpFypJD0iipVR>8aG~^$W)h1_Ozr zC{uQ$(I_l)eSKX{PEJHbIz2rV&+`i3yJ@*|=T4=4nz4fE z_-mDeooy2vy?KQG_DeN&&*mbb95Aj`|kg~xcFC+Fwql?K4Z#)i~t zHR*P{B7Y+3;+-8_Ns<%}@T%p%efw6HmX_qnlPA(@wM0Z@adA;jPfsr#J3l`!`}_OS z>2ylVOp-+A=H?^_0x`x^4v%qd%`0nrtJM-?j0}fESzTR~IF4m!XJ=yQyLIn&yO&z9 z)R+{EcAsXfU^*%-j=p;JDot{CW%};jyD}IIGJiiOw~K9M-*p>}hIpPQ`}_Opg_zfD zHf42nHGMrC4#)odz1?n09LH%L?S)dW*DuT#Z2f{D$dtdkyDOWUn}rK&jYcCq-qvAx zd0D#MZu&Y&66yE*X`i^|6!pocPoKp1{fPlnwXJz&ZMO@OtyXL7g*nb>G?KZwIq^JC zHh(rYL?rtSBuSFezMN!tcQ<{$x3?!RUc8vNPcv39B~|Wc%I+cEpX~YEVFGm9Ll|W_a=SmFEJbr z<^B8jnQiXxYTP8Zsjax)CI&~R(@B46$v#d_POi;DlwBin>-X&0v-JM^Cb>;*#SQgV zGvV{2<`DxJHvwRPof`PC2H4wXK0^x@xrla&Ye zXI+;ocX)Ixpa1=zsh4}3`VY55rQle3a9>{k<3!QpuL;J&<`QMtfPLU1@% z9^AhbA1Vy|EEY!rk+C~W;lMn|FB`ST8 z&*9Or$nSs5x-M7la0Z_@nwCrd;RdN0W6V`o0>GaOw}{K T)e7+e00000NkvXXu0mjf?6u`0#W77L zO{wvgC{m)LA~NPNTp2HEU`hx=UhtZrB7(S|XJ_~9Kl`5Vy#IXXeV^a+`#rzsc{?FY z$S;;(F6CLB@!N6o=bE&@Bd-rcWbe3osO=s~)_LCN{_lHKXSSjJpW6nE|Mu0rxyR;D z_BszjEtwY>e~`lcHBY{ymupk@&?FTV6}kKR`pPAe=kY~3IXN9R8-z{tK1_E{kNfC{4}V7>5JYSNyswqO0dC98 zVlr1&Rz~HD2!DTn&!1Yn)lN`cdWoK)p`mfp39bm>7M48T*x0BQ#pt)kGzJH`M@%>V zcBL$@L>hO6dK}?yGP{B&(hYO20D`+V7wZJ_mie-zYw9UVW_x@5gnMLTa71dVdZ1y006%YL_Dt|2 zX<5=id>>`!=9!>c5H+;4sK4i##OCMQz+feK_SnOI20yZ*U~JRIOb7^t&hf00N+OY% zD0`ce+f>Wv^L>jqrPAAxOrfzAougYn2TS?%M5A2?z)nQYaJy6-qLa@YDwn82BwKCU}Xn0-7uDW>Ap9AI_Vl>8Wa(2jLQ# zOU|v(hA#Qo0Tiw`Ia5zh4@@C7?ypZcoOH*OxVX6Kqg9c`Uk%e89%!2)GBVil>1Be( z+DOqOVazk$ha^@>DI6f&Ee>gkpBQNHVC-c=b?w4h50~B8=x4C}^y$+VbPHsA z2rHTt{fzhcMsrlGU9l@Us*9%zXE-*0Yf2~$3lhXI^~gVVE&kI&oW>p-_zuew^*NPz z7KV*T*wTsw>{wS=qj268Jt`JM+sMd0NlqmliE1s6Y1)-rA4<1xIFThh3&pf&P=Tha z^kG9YIFg=Ts9GSv>Ov zv6ii9r~5o>cWIZ}_-*AmvwDrc^fZ>JwL6X6Oi$HlG_H$bBhv}hZ5~t-J(M1hM&g^) z&0cl1f~eo}l6|U%44eRUk8$9Vq;`*+`Z5?~@mJ}AZa6gwbuqgAmO}kCoSt>5?AkkQ;;+I4u?I<31HR**`;sG4pvFEq{q-Unm^_)oBHOEqY;Sw z1@uxEu69&a_LbKfRYfH|rG_;G(|R&&Oi>f6EE#Ro*bkWUDcqk~wy<{GmgEFokE-j* zW10>P4ONdsRf>U4SVh4gD|vB{UlX85u`li|VC(5#` zRi*F2Y-xE4miIs#kBn*oPgSzn?1Dj!hIOUPa?OP;?s0{xwcMpGZ``#ROcrO@FRuf| z_OU)Jkx|hiJ5BYVsoz1tlVbTa%*adJVxp6LePz~_Jl(}xr6MQ@W=utu7p0QGp)@r$ znZ}+!&F!Qin1idUtCHE?-ri+-73IK1XtH=pq2g}P+(lMnZK;P_8<0q(*DxIk#f*AS z`2>lUY^|;HL2^EDeh5Y)0WXeL!TT_4UH7^a`;h|xaTaQ=TG>G)^T-xe@J+3C+ki&3 zShW?HMx%{pB66;v<32+t#@J~QIGnAAheyTiFujUGSO=-tsdroS_C&G{WNri1)&lyV zk{K&DDq01N=xThqMC;f+HZ~@?Z{#LwEzAj4b#(z<1z|xmiB1s_5hf=fkaA^Eq1ig_sKib%_dqAGJ6MpHGrhR&}5%UCopZfm1Y=&P$ zypa1?Z}V-A;fu^c+>{UB0jxT(%Us~qn>7a0miYllzBvYsmc2JJ$~{7gZC6(+o&)Q1 zjQ+vN$;pB3McR{nFDb3o*4EYU?v_IdYbVc}oBMk*UcLIIu&{6^GB!GzuglE!A(H|0KgS2D>VO_2r1*(9pW{gX91Ln9hXBGv@V~Cz7l7U)y7p61m{u^9TipXoV>74P?iF@ zyqb|pkWmp=+L21hq{dbsyU_LM>uOQVun`A0(^pa7DytDM>Nmyecn?g~OXOU-c#$$E zcFReCThEkQbEZr=p>5&~=_88+u;(D(#D1PCp(||z&^BtnM`Bw;L>s8Og%v4&LM55d zEVs&)nXP^@gFD6AB`(x;=#x^nK1H^n;{X=Y)nC(eOVn~BBwROF6$xPj zp|N*A`t=j2q`Z7WpQXP8wY1w)kxS_5TVL}W{2^$Vy3!3iO3b@iu#x?evV#@y=dA3+wIgC0UzPy<{2n1(f*=XU|Sn2Y?wM%cX2XHLW`}rhe*ghTfFe%~Fd+)xU_xt%g$$szyk|LfxY;|Utzz9jBXh)p=RQQng z<6L=W$BuWR5f6GYcx|@60QS}?`v_^6qbmf_BT^>s^mZ29CmvSf@7QMu*Hz`2mWSLP z$ljH?LD7(^$h0(P5YknB;@(IC;UYNmuj7wF`FZ1k2!!UC%)t+X!My3H4hjrxKDcA* z>ix{J{PF$Q|BdH=c0GVhDndm^&!e+tH=<)>z3{t2P(q<_O6T&B1eo&bqdxt`*B5H@ zobhRV2B^r~T%Y<6Y;oOYGJXTT=`4Sd{_3<o=Bg`&nb#8^2PDVS6^=H=yvnz@z^M5Jd(bYHx@C%hTb6 zgcv(eX;1ty2r=&2X^_1kCJpeyA2Xi3<^Bfixtr@~1BX+N9zFV}f}Wz7ocpn_ign#P2fh!Q$*7Q_V%- o#Bu)l^%r0NiZ}wEKp)lV3$qIi3EL+|zW~?OA3QJD{S9^RU&(v(R{#J2 delta 2710 zcmYjTd0bNI8m^f}rzx}BUSrao=BLx*mP_PXQ=?giqoa~5d2vY%6q8I*&fKiLlLq6E zpdot8K`TTil|WP&Wt4JHG*?_uBxDrDg@C|0&AoSi_xyFv`Of>j@B2LO^L&S6A+-3> zVWXkogjKMa)g1=z^6ux`67oOs{afR$D+$*qDXi^^}xFhr7-(SgbP&jjouVpKpe?LnUkG*tA`JvYXBW^vIzi8GqR3TK9p0}o^} zpS->rV+}1Sc-BS^Y|m^0#wV5DY zP5tE%z74f&*0e{txR_%9CJO?~gwTd|i)!P0?(+F*iois6m_oZO_o?uJLeF2kc+uMV z0n+2<;vr{hSAlqppY4W1p|X2Z+ec%5ii?l`jx|Vq=MI*10Z>T%f2lDT3`owX@0>=j z7-1(tP@zdlN!BjwGMTI&&9Oeg5*T&IKI}$cK|@}Q&ew4`CkryPp25bIK_gb;Vh+Fvmm(`9v<$qtpx(ScaU%~(=SuuaJcDmx4;?^g-;?OyeT3I z5um@1S_*V26JaR12E3P~374L-qfj8oIyI!y5XYoJD3VmSTlC|E3+mdnAVP9Kj~vXz zVMgy?-#?1xh&2;{*UCt9^BG>6qOTxSs=J*G4FFujVF5|W1%GJBJKa9@bc%w)I z2hBva+m4pEY-`JqpdtIkQ&UruOuTnOrShslC18fimAbTx9wwJPL-i?F zO*(o8kCnyqJ7JZME8`et*!W$nvUHvEE{qn!z{YIVDrHME%J2w$gTykdG6FN)YM=_> zOM1$sYLPoI0&$vK0k7O((*qfjV(q^Y^KQXe#K6)b|Y1{ofrxm|8o$u?ej(}uk{nE^Ui9Uc-XF*shwB)d6dKU7x0VZ9K>$I%cb5#HsSq- zqt(a(K7@X=1>OY5b_Us$4QzVR561b~R9gh!{axemwTj;(zYiqGDqfMSkzFbZ0`Gf-z5-65lbahZ zhR0+w`#~aRBl(*;B;erBt5lT_#w8P=#G2&_NrmC710C7n&BRrTec`OAgS>NgQ7_;U-53{h*dtr#w5m7MH8n+M zB<(+Ci5}w?+_-VW1d)tF(fz#)X^UE}-jgEmT1XC_BQNPzmA!OBTbnm8b9L^rnBYoj zpChp9>+Aay*=>N)rVm`wY2{_2s4~p`)%FVtKnE_{2l;L$CR3@hXkhC34H%?@0A~SU>ir(x+ zSqDW-J(*1K!!1c$AMJb$Gg`y|0Fd%E5h(w&O}$#3+Fo-U>q@JusrgA~z-OvwUQKRb zy7tb_&IZ;F`}LH1T(pa7eBxekSR@=9i{Pco+9x-?O>@nG94g30q{-R~+aX_r?P9cQ z*_k4rS2@7^2)p;Jf_MFCq6Ij07gYG7*idp9GeoEEuuGyi&%M`ui@XC&D_MeS_a~nE z-)rmGZ0D8lt$=?y&Q&geITD=?eDJh{jEwr!hjcm}EbYX*Oi-L_Dz^|&$DpFF3&EzO*bnhR2V@wG@85NZ(!u9p0r7ww zAJ^{@kM9Y_H{BHITlXR?GJw+qiZqilib{S@qthm7bNJGAAn{yjrVdH zrG}t`he`NuhY;wq(wDGhBEB7_e`lp=tV$ZloDqEE+SA=(bXyCFMIsM3W$SOeWrN4# z3OJ(>4HMG3wss>EoUz`dcx?~C=aijtM5W0^?@ZO}^+>OBXdX;ozv~1nGEh+?M;eP& zQ0sdXv|^KO2aL2_Q!VRQd_XX^>)l=F<$YZ6uwFb5Ii!tW{S~*J6tMY=XemJtPkFk+ z(q{RsProkrv0m?i`1h9k5G(j**;|2gk>`*H%1ldCs*jvotEprivY-i2xKnl@dYQK?FVp^5RKnwnme-Z*lV7Tj8-m3TnDf zr_)CDl3;&};Ixn(&414alZOWrOl(BTa@v1Oa7 zk}q=2-%WrEjN~YTF8twSPIMsbWY^Y`c#?&> z+~!kkF1LtGCRcdm6X%9fs#q)_A5-#Vbrm}``P*?D8(QAS%U`zqWJU(Ih%WuY=Nlc` zFpvM!Q}=TkjphiHo)dYIVnbb0Zxt7tALva`r_2lbgn;4t|0+y&F}gMB%GPOX-+B%? z?1xH+ju9RN^8O3A1`J6xSX6yn>4S$g>Usp1GQNaVG&Jlrmi`I2%Gx>Tazv5W7QI&x zWPQ7FkGao3NzrCbq(f$iXj|}iET7fTK#7`PxP;rc^Llo)r;Tl=KW<;6=@j%V_?Dg= zwq6R-I2(PT1>+4uT=!SMniqeeV7i^)cr_v62$RJEV^yf^>_})g^#3w_Wt;C9ke+Tw z7kQPeT!wn5rzek`E&56{pjh-24fv5`hd1Yc0u_xtBW>J*+_MJEjgmP}H%4CF0A9Y| Lz|K{FedX345#IbI diff --git a/src/algorithms/__image_snapshots__/getMergedRectangles-Merge E shape rectangles 2-snap.png b/src/algorithms/__image_snapshots__/getMergedRectangles-Merge E shape rectangles 2-snap.png index cb3e3f9784fa71f14812f1557d56f0da977a7357..b0d08a7614c13f1526d4aa57119c1d2ac4757338 100644 GIT binary patch delta 2731 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 delta 2753 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 DvXL## diff --git a/src/algorithms/__image_snapshots__/getMergedRectangles-Merge two aligned disconnected rectangles 2-snap.png b/src/algorithms/__image_snapshots__/getMergedRectangles-Merge two aligned disconnected rectangles 2-snap.png index 4ae38096658c3b494f3fe3dc505ab3405b775144..90415fc12d5224f61be2eb02e11bef4d3ad66394 100644 GIT binary patch delta 2378 zcmV-Q3AOgK8Lb(RF@I-CL_t(|obBDuYa7=Z#_?B|{tIfIg;&|iEnYN>1{#ChVi=RX ziJ^4ST^Unqm27(NU35`0f)bNm7bP&l`%r-?638j(B3+17qPwoLa4P)~a~I(ZXO3nh zJ&kR}zTXd+>c?p2J!j55nseN`wJggr0|3FlR$TyqtB2qKAd|EUM}O>6f@61g*J`zz z)oL}HPN${YbUK}UoAG#j8D$k592{7u)3JWPpVtxoyzR#0@wwIM_d~nguH4RTb8v8Q zF2}tpI-O3T&Fyx3ZaV_S;3e$o`zC*?(+Wnx-o`wsM}A8Q1^R zQo-SFjr<>XTjsyFySr;VKKtx5GqagnrIV8r+u7NfIqt#1LB4PI z8FxH4wQ&PFtk2aFzUNPs+&&iFW>2S6+uz^MFQV}C;qCl%I-Qx~l=X?w#C(0cJ6&)f4aVM$8^(U z_uL)Z?Q7Bg%lfY@Jj3=mld}RPf9k&0yxaCTj-7rnEoy7nhgEHN|MXw0f086gUV}Ry z?)9)9*IxhlX_^+=gArM7TVGSd!H@uKt`yKyc@WagSpHO%V zUsX7S?^U%m%ZdYbUfccsE#d~UKfwLh{aTgrkR-{>7m(k^vU48__Zjwm6h(y#-yeVe z`3&1urtFK&|4i5qet;%PQW+{`0kmjL%?s0I$94F)tX5yxriD|Le|o)caU9zpfBa!) zX0Kkovi0@#{Baz|mc0%j%d*TKK76>;{(k)NM>8`!J3F&_y*{&Dx7)SRXjIsDqtPhc z=ic6)4TnQBGyD7Rzb%TQ{IR|6;lhvG|1u5_4=su!`|i8%3a`I>`O?xfE$sK+y?cfJ zS%$kUTvk4E&SZPF|{mZ9j0WIz1yLuH3cnEbm9lLw?Zr%=m94ve8%f{HPTek`We{XNkPEJnp zZ&7#0d;k9Ze4FFr8Gh96NxATwb z&qd4H;`eLSnoHOZejjAn>>5hA&{(bV;cDRe~s&k9|;cHa^brmg~s{)DZEy-rg7C> zm$pu))57hvGaL>pr(Rdd=bwK*^V;LbIFIEi&s%Mobg|%;%l|dn+rYo&vfx(zy16cG z4R437WIAzGh0`^gGab6BYFQ>M=>vfApVb5S2a_=iD@rcVU@)+)J0Dm6pW*mf{DZgC zJF70>IvWfIcKY;J`}m^|?au96t1jotIeqqg)g_<;!Ep)h+`eVse)Hw3%eZbX`W>xQxqZvN{pQPyuI2i9@QC2RwZ!5mvk?gd0h4eE7bNd2v(f3Z=VlKcU34wi&grw~ wt1bb!5DSAN%d*R;1Hcu+R0Wff3vw3z2Ty8KoNmIoUH||907*qoM6N<$g1Vw5_5c6? delta 2386 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 X8U|i!fL>;h00000NkvXXu0mjf-xfA? diff --git a/src/algorithms/__image_snapshots__/getMergedRectangles-Merge two disconnected rectangles-snap.png b/src/algorithms/__image_snapshots__/getMergedRectangles-Merge two disconnected rectangles-snap.png index c2f87fbffdf2525ef4199ed529e8d7f555d2518c..480b995e31c648d745b352b80c10d5118af94e18 100644 GIT binary patch delta 2168 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 diff --git a/src/algorithms/__image_snapshots__/getMergedRectangles-Merge two overlapping rectangles 2-snap.png b/src/algorithms/__image_snapshots__/getMergedRectangles-Merge two overlapping rectangles 2-snap.png index fe63b600726fcac67ed5476b7d28515dbad7a452..713b5d07a40688960715e406cded7ce4c8b05ee9 100644 GIT binary patch delta 2366 zcmV-E3BmTW7_S(RF#+k3G9y?`?k0xPLvCeFsa0|*xI8_SuA#*AIrR_%GQQ+gDlkEU zq>zg*qLt_^ryQJ0f5biqGt2B~SK3cwS^n{UfvB~+nw^=Q{b*+GwzV`(Qv(3Oe->Q< z09Ox@;TDn$G=JHJ1jpv)rqyaStJP{Y9*+x;IXpbfju{Sz7g4R8ot+&!JUp~sub0&$ zd|h_K;qct*>G#9_{(k9k?wFmOopU+wP2|SjyzKAqPrZi!N;)T_(I{=V+u8dhNm4V* zZSzG@l+Lj_Qx({LUS^UcW@d%oi2Z(lX1~qTJp1#aR2h4hQKjH;Q(*t)rau0@&CN|S zJDYm7T7NCu-rmkloxk|v3o|>L2K$bWk8NXPW8%C!J3Cp~?lbOuZfWBNbXY%EmvEoI zRB~m^nr4s3W82=|&TgXc^Wk)UJRVOhaf|#d?0-+!SMHo{dF;N-BuTcpVKr=+wFEb8jaE>+wHX5?WSp(X8Zi9vtPDkNV zeOT6Z_fLOYnIuWFI=JiMwukj`?e)*!Zntx7a{P1q*VpX}uYHm5+)0w;>KMmy?tR&H z2;1fq^{3xHzs`R7Wn;rF$HP7k?;BT_B!5Y=Yv}sVzjon05$)PSYQPkeD zeo2xfof#bNWUhm{-EQvY3vV!ga25qecq6#&VWnLs`>(-ZP&kmHD9Re>%J+XR3V|q! za?dcr`i3{MKR~k13(9o^zU*cU&*3Wzhj3q6Thlau;it9TFK-ri1NZ~X-|p8{8GjE+ zl1zL7`E4w^_Mx!Mu-IFy2Wv9fBp5BnVG$P`_`71m$RSaIJPuRv)ALtk1Lh;>#x6> znc3;-snzTCiQ_t*jtvHbT-l9Aqkpi>t*tHV_xomM_Rl~6SQJIs&vw>JxtA-yirw8^ zi=xPW_~D1#_BU_dSi9ZMmHXhqgIxbq;ikA%m9;fAt?k`z*Y4c8Q#y4oTKa5kY}moU zfenX4>-BntOG{-uY;0`Uix)4l_nl71-hco7?B}Z2-q&n4?cm_R%+99dUw?o7wY6HU ztZwysJ?j^L%oQ!U%+9W{zb_o88yg$;+i$;_+1Yjc{PWMV&lQag#pdQ_;qyRW*|ndw zuS~Pqv`(j!Ef?Rsd1FgUONGZ)ddBha;X_+rU$@+=P?Jg`=)Wwlz(?%cU!Po6w6Gs^~I*{^`BmjC0A zKW6oHmY0|9^z?M%*rlbV+znC2tug!kes)7wQP$Sbw6-^!O-s|%y4|j=udmy9JhsP= zA7_L7_uqe?_)MeGusDwG`1siR{eIz%tc-_7qhTL>@Ie+<-EKF#F@Ke7AByAHdcB_g z`RAY3Y&I>5qTCwZ^-K6G|Dv#8US777laq<0 z>5KK$@Q>vTG~C+_Y+ z(6n#eMx$X-6xq)||9@Osv9+}|TVG$#-uHUF(!cN6+1attXq45_UBG(1J~3Nx^-Gc@ zSN_4lfo*SZ7d{ATG#c6Qt`2wa-nCY%mAxO2$98ylnDvQYPEnscfBxL!IL<=2sfgcpp7_lpS+)bW}Kla^t!q- zi|R6MUlqgQ&`wWJvuiSSY!)tH0@K!K_t(3hefHVJTCdyfmaYl?wVB%%J|yz1 zK5b2zrfKPRzkgkB9T=|D%Z_&sb&Kj#rBD9;`|sQ_uIz8V`6hR6|D55&Q~x;soZ$n! zuq}SSmaSpKe(?JsO(&nBglqA#I#+ofQgrQS)zLk(2p_bD?~ATw(F4Gua}@m@Pg(gz zV2o;`b(tCQchqJR4DQq8q_3Pq9%Wk&4QqAP&vUcNf9 zKVF?Ix*G57Xc(mjQ{`u07*qoM6N<$f*~p`Z~y=R delta 2375 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 diff --git a/src/algorithms/__image_snapshots__/getMergedRectangles-Merge two overlapping rectangles-snap.png b/src/algorithms/__image_snapshots__/getMergedRectangles-Merge two overlapping rectangles-snap.png index 1eae0abe844f082df3173b88f1749267f469fc51..e3e2893892211b5334dbbffd7f442b94d477421f 100644 GIT binary patch delta 2447 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 JmTxZK_%C@5POks} literal 3169 zcmdT{`#;-PACGOS+M?^aS}nweu2q*(w{|XDpVCLI(=yS}rt>IDB$!K(l8&jVVbcnw zSypWsNyMc>kc8T(CS+ttBoQffsU+?Rxjx_h0nhEV=k>f^&oAe5KIgp7`FuX_&-uJx zpHp=4^K&M9EcSpvAd|qqo(%zk3`~Lf{O(=AXgi9~0m2|P_<;52&^@cF@Xd&ekPKg!zpx#MjYM$LQY&1jC%=gD@JPkc8oy52s( zjWp}CmIMVq%-bLErO}vS<*!c<&|lrl4_zv&@~J{+E{uQoI1UL*QE6|%5V77H7;)CZ znz}TUii?58f~>b$wR=Iy+WlbA^|y>bhx-gZ2}lNg|Ms6yuLdTQD3nMtv@L=R&HAjK zJ5+Xf->&dW&_0ENnts}Hc`G~1QZm_%I`Q6>2z;(z+G+fYS)q$SAgKIGh%v9=HQ?=l`*_oN2R(IxyYjCzjmR44!mLI>jPpZ?Z zH|%2?@p#MP+02(NH8nL8vJB@md~>i`FB%fv1%d{+JodnC^KA(zW-(0T-KNI67T z77t@Sd=QMQK{5Dp$i;8y|7Cp=UHncg^)xf5-IHh!rP&V zIGxM1CnYs63$|zx&vG7(9u><+T#(g17A1)Y#BuDm&j?C&za_*e<%Q~(B*L})nl8Ca zRx#n(Kz`UtRp)rJ4pK!Z0a~0B&hr5L2f~RS#FZE^FGLZ(L8iFlM3`$lLK8*kE?Vd1 zWK3o(RA=boWyT$}C-`MfV~eCr)S6=Mi$L+^RJA&ezo4XJNqzy^Xl>U=3XTK!z($=c z1soSxKBv|!VZehs_gH#gRx6NzxPHlrpmN*dSue4?u11^7JYk3G5WuSIV7QnaU+ils zLBND|i>!$8Uf_APu$}8RT$Z|ER%x#b|5?0ZuIgK{2`4TST78$4>Yc5t-NI8McdnbG zv}R(W*^D?P*G-C{c7f$B7D7d{)g)Z6l4W%Nc4UxA#bQN_)#*xO3f?wQmx^NQX|H`d z8KxCm^lq-S0Tq?`uYQKfD+N)ugP5yI1e;R?<>CTV#;sDT!ZM6o#k*u1-uy z?kuL6p65PYT`e%H^7CTl*?_-6VJ<&izOE;VS1L^(AHB1_t7}6ot}OWEpnrkU2PDs% z-)jxZ(ePxr=M2$mVAX=rn7msV*6z-_8y4#fXbu8H|GNv0DbGOR?xGs%B39^&rNO6pl54*0`5RY!c@37c(@ny2xdLnlic z*G{K5git0OOQY4Y4l$c8l?ghiJv|SwkinK17!K=`wSK*B!w0Jqve_deBP2Mb%yLqe zK?cAb5#4Y*&!N$1@%8ofv9XFl2=?+p{~cwy4kNOiTQoKx!SF8gh$OG|4UIOD=It9T`Y{}?CdNU8XDqd zpi2WDMNzIXsiQaU8QoRWT3cN9Dx2n)xb+jLj*qOC3(2iXb$j#NSfl&T%H?|Fy zE&Qx+ZE^I`*r!`-gOJD$fuqJ`ioUygGqPj!29Vv1%*@L$o>r{{{C3w1m$&ToIfDS- z0-V?rfPQm%OT|m<8?UqtlxWmyHMPAxO!eWNA9xcRske``i|F@K%_c}59v-Ce1pdH4z>+R-_JiM-(h{SiZITN8Ok?TF znCQfq7(2pnHJbr_YsHy&42tS>Z;05<0L%EI1`D1#GUmnVQN4OkCQg zHMY1ELy0i}qpUN!QgP$1@nVNv`CsGl_*cs7FL@4Ed*3=jJ|(I?CX`dqf8?R19bR2m zfjEOj&QlAVi!@^&k&m@G5QXv%7WvKo^z899`4be(r)_g+g{g;o4dB&83d8=2fEl~J z{=44@Al`6JEEZG35WHrH#`k&a8v3XtqNi~lHeGm6q>gv*LLZV8Ppqc$=?)l!%NZrD z*ul_rU2DtR)2wEEeDxvK3+(;ZO|uZl#6>Dcte7qHJCv|4fGTblEPNH4ed_gT=S?SV zeg&G&U~Mv6QyOSKrr&o7dpiN*elFy1Oy&rnAT8 za;H9nD!Wrvc?m$5Q|$Cc@7A*r!+)cG{>!gd aXVjxO^|izt0|)*Lpg{l6&o-U;GVkv@83v>P diff --git a/src/algorithms/__image_snapshots__/getMergedRectangles-Window 2-snap.png b/src/algorithms/__image_snapshots__/getMergedRectangles-Window 2-snap.png index b3b1e47bdb15e23495535981c7a418ebca963206..19e9200cec85bfd9dd2e678a56848c33af4e2109 100644 GIT binary patch delta 2351 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 Th=pqhj_5=2Uv(Tj@zehR4AfYY delta 2367 zcmX|Ce^k=<8s2tG?U!4(lX^3C_iSrxZIM$`Q)H`|Yn602(G*e3n}~$u07(eHZLVy` zg%+o2DU!2tqDYJZ$`47cv^gb75kD

pFiGnp67ku_jz7J2tA}K z97sFzlP=v&?)7b-YKnk74#KhiV0_B?u|Z&eX#D26G1Ps4EHM9H2v-QVv+oF z(MMNi`A4Go%pDjEX0cRjvL(4n0ngpg zCJ~e>=OSf?VT3!*b1^%q%z~GOF|JzWaJlpM1sT$d<(Oxr?cAOs^Pki{snaOpn4pXV z#GXBS2)aQ!xW5pK9i5(@ZrL$+;^@(%Q9+yiGw1)jv4>zYs;fzL#)R0fKZMq|vRJJ5 z5V}Vdfi27hn-t}iEG!tWje2RqJvsZ72&m1P7cwA=>}R#LQ9}}mI&>IVfW?L(_UnT- z`!sgt+&674i6C+Z)C`kmG@<(}A0%W!ckf+y&;`n(mO&)lK-Xn3$HW`kWy1qA6sz|hqzFcEJD0^Z)1t`l8SOlP&P(A z75($^KCj%5yNBxvpZnwx2n48D1)8u5Rh2xUP>8%&{NPq^sDC;6E#;PyXfXy3hvzzh z21%uG>gFHNTkTQK+jjdd%>am981weH!k93DRn>aDbGG=x?pjnaI?A8QKxsak&C=^Q2zheCTx0I|*pUwKHXX@N1m(`QJ-0U~iH z;(No?&sRpoUx`j(d>hgMr;PS1Fk!OwW-U2Gu0@|(44vYYsoZmN4FsX?%~ydGYNu7D z7|M^I^~I2FR~+xEb?7r^&KLswUO~mRx~P338^QLitJo{wFW*^Jy@(hzna=b**V{v&lSy|WZ!@%0X--hy2qOpLcu7Cn@ujayF;1ctl zx%?Z8)8#Pt zgL(@+ivn$dSM;-zG=cbi_g>F#)SEo6O0obUX$_o{8Silp`gkB^2uC( zH4zwn7N1=i3TD#j^aB(Jo(=&zjT#9&E-udUe5g^4dm)>7@vO;LV>60ORJFqGE_*xS zw}F8HCR0c>Wo;?%ak!l(2HEF4{1}0=LW3qWAFbXCV~@7P5skxMelQsQ0HHv3iH#a1 zx*QfE#aZl{0|7VNk9i#_>H~_aTGH4Gi+;3aR6o*z(=Dj5QWld*)RZ(a3$&Hp$3<>- zr-NCj7V?56OlAafaG3TX)cOf|VYoRXI~#(h5A?naO}Nk=tV9_EEQBw{>9rU-a>vNI zm{u>9k-@=awYUTqZH25Y^(f6a9PX8ANo%V`uX+Ur>%nkWsnn$T)sD;3xDa7rTN9WkcZr_W`C>yGGXnRCnyPMLPNt`i;T9h!CQ}=m z4{3gEvoCbUhy(%|L+Wum$$P)?FYn>t>S>B0S4!_4XxTA`-3Y37dE+TQ<6skGF@w|}(5ND=(%AKV@ z%o5PlWYr2~ZMhdaw{^i=m_z!Op7G}7z#N0K{#w_^Uz^|U@9)p`m>WRZNp_xC9Iuy7 zi*Ik^hF;VWr^0}iOZJZR$}afnnXWvw=Y`JuKl+aO^Gz!_%b3(1s}Da9zu>xBRgNoI zPrL1Ro%W7jACSD0|G;cE>ubt(x3bwX(mKs)y>ybGV)D%h?2v)I(G>E;SwcUEJG{Gz)_Tx|anRH4JjY_c5fv_`sbF z^E`^j1kjh?PjM|*SW1p>H(#>HCS6<#fY&f^o9eucTovjXrqoc{y|2XjMxr#Hm1)!l2EFqqoo%tppP8ERkBSs%3e z#YS-UK?K40$+>pr23nEd9bn=oRKWQ8`{@=-G@BG~4}Yq(Enr@k2lm1Kbk(<(;OUz8 ziU`}{ge{^LIJCd0EW!u4= GAN~hT8&ux_ diff --git a/src/algorithms/__image_snapshots__/getMinimumCrossingRows-Basic test case-snap.png b/src/algorithms/__image_snapshots__/getMinimumCrossingRows-Basic test case-snap.png index 37d71d3cc73feb4ef78701a644885abaf127634f..11f3de0434cc84e505845b8831d727bc95ee70da 100644 GIT binary patch literal 4311 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 Bx3&NP literal 4299 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 L$@vofYxn*Q42Ln8 literal 9135 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 diff --git a/src/algorithms/__image_snapshots__/getMinimumCrossingRows-Nested block test case-snap.png b/src/algorithms/__image_snapshots__/getMinimumCrossingRows-Nested block test case-snap.png index 412c8abb6303bf5c371490c460467fbb4cf40b50..b10f3dcf23256d75d3060e37f2c8d01ffc2212c3 100644 GIT binary patch literal 7209 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 FzX6tX=YjwL literal 7210 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 u_> zmyL~$Xf~U%zP{f7-tzKtoSmJ;@4x?kqaoYf-HlqUcB9+8N$czDF*`dOD=RDU?YG~? z^78Uj#<8`v6|Y~vzBl{54a>{R(Qdcn`1tt7w)vsIes9XyrGLul>1pik?Zr3Wd~@lx znVFf`+S=-WT~6a`wOW7rchwZXoX(A!{;#gCUb<~?YI%NseqkS_&CSiI)oRi0c5i%I zy}Y~}^?E&ac6R#vDv!GyL%ILzxhR)E0No-+1Xif zaBxu6>-7uUsP3aWwtBr@wA<~X*X#AC(v3#r+SBS`OMjJ8qtPhp^?HBmUcFzh*XxhD zT;`R>)@(M5gM)($+o^s%Y^>!mmB(9t-e@$6h$s#Y4*L5k&&9CwQl7u4EHxU9M*n=4 z_nG9_Gy5GpCxgdYo!(c^XLbA4V=f=pZnrOOvoyG*y6POZ+wK1GU-i6=8&k8{?7z;- z_shq=RDZd4ILa4KMD$Pgs1r8$LL9tr^#xJAZSZl`C;H&vVCedE)Qdi2l5h-;eVFR; z434>sPkGz0Kv$1>a17P`UUmKl-)z-wRgbY6^zvie_9oqLx&89^dcEF-$6OVM!Q1Nf zdOvRE8~7@tj=OZ#_a`0Gurb_+aEx85%+Ah6M1RDefBt#l`%j)ciFUgkjYcDOcXvl_ zqt$A~{QUgL`+WAC=dKJB5Gr=utd={J4KSGcz-nwzIyz9JThZEY={J$n`r5ho`n*V^{l+FHDP`7$CR z-n@Ae^?H4x$7Rmpu;=Y6Z{EC_=zbrYvEeA!^S}Q3YkK456Y$knUq!Fi8+qT?uV42g zHL2Oz**H8r9D3W<)>afn5zS^ZHa0dc-G9EmzJB2iGVBd|m2S6t<#nHkf4^~FzI++Q zkpHK5qtS@d)6+OPIq9F@aX-G>-QDePYut|*Bi>#=+1S{Kq9~%#Xk2-}>YJ}#ufOvf zVbp%V{`%|q+$&Uazy0>x#E%_!4#z!jqh$Z#x$7qSJ%5g0 ze)%Q#_V&`hKe4m36YX~U%AY)(oSa0&+mrtE>C^O2D8BgOi`d)SyKoV&)oR7*>1qEW z)%V|jpW5a)olYlKR#u|fY+m^<=CfzdqS0tvxNuyxu&@yO`}_T`*Vfize}DhVaCSPK zepntodNg*7<6K}U_b8|D!&d$=opX3~ld)|hbo12Szy&gaR{BuM^e;@Pn^B;FiGV7XQYv6Ld zS-q{go{!3Pkn;25ZO$)TC#kMstJ|*btGwP45&i1|4?+yC8}(nq}< z_<&9Ho1-_ayjC(lKX2CY9(B9j`0l&!`d{C*S;zA7a_sEvT=rd1*jlX?5C7{wWAVYl`x+D62}duE zZ8~+ii~p?v}s*W7;E_8rPE%3ow!kL6eXQByK*L_5j|O zqZh~V{KfIKhe5@|2Me+IU}4(B;2Q2lIF4Q%$N#kcH=h6VU(+566+cD@#~pPq!twmY zaXkO$zhZH5F_xB=rahc{@9^+2j*gC|Jq+H#y$DBXX=y38x3{M~jC*f;ds{f}I2T8O zlOPKrk_$nS3qg_#L6QqWlaLA!O6`+r58!<|JUoo;?d@p~9rct`gt97jh- zaddPv?P0*3cQ3;6@WDd-IPF1j$-@T=(;foXbT7iO_+TLxy-4B4xHt-vVF`Sa2^S>x z$s~6=dT|`__kY~>Sl~`MdT~7MAxzEKa1=%HKE?suA(kqWu?S-p{Xe``MdYWGC4m3{ N002ovPDHLkV1oDQxr6`! diff --git a/src/graphics/__image_snapshots__/Graphics - Draw shape-snap.png b/src/graphics/__image_snapshots__/Graphics - Draw shape-snap.png index 75ae7386209ca309fc793f68ba466ccce8923aa2..02b4afade6e85cfa0b2ba9f4519ce379433d4889 100644 GIT binary patch delta 1192 zcmV;Z1Xugs58e-uI%z>`+h`ug@xPXN3u%4nJ4gySYz{jx4cLc*Oz**g;`<^KaQ8O% zG7^-8c>@Lc4FnrPv7p(dms~(DI7r%6kkb_*km%XEX&qDs2~VzG#bramSveW zo6WWFvnolFspBnw^?JPr-~TE)ozDNvSn#~86pqPcVnGmCnx^KQGv}P`?(W))7ccDg z_I9lUS{8+Ry>9(}f35qRr`zpXp66y}#W6eQEKO58JUp~cr}N-rxKENKc5-rmve7Z% z`TA*{a_U+r5Wm{WY*6ntS=l(K22!i4#@}f(8e>-yD z<$tr;oLScE^`?H>`>P@U<#jp}9SefMvMgKs<$S$fw=fLt^z^io`~fi$A#OwQf5I)1 zrl~VCHy)4gU6VcnAp!G~U;=6Z50lFRB>|6<@d7G;Z%c1gYPFh~nSKBMed^DTkB==) zQ;VW#>11V+B(}4&bMHE@UcFj2lo_|Tw{u^&y}fO592b||lgVUeo$96hymjt#eSK~F z`}_B+9>O+nQDQ+qnBCQD44% zSv($p3=Qmd-fYWDT( z*SX8O-L5(3ERJJqx7#zzTdmgA8)V)ac9AU07S8*a{q=^uyu36w=il^>qR6r=v#YDC z;`}c9_}T0C`^C1BBw0GfX0vJScH5kD7Dds2!u9U%?ko&LGcyar(C+T;mTntZ>Eqas zA3xe)Fp&TL#Odj&rD?kGlZUITD>M7!jdpT!B7Z{h`t@rY3YBaA0O;`}_OWXf%pt^Cn^eGt(vl=G_DP$+Ysa^8LJ(=0W^p z_s5UUsd*Crn(}((*V~^Hdj7GW7x4G! z=QFC$tNgq~`TSM)TRs2f=l*e;rZd}3s?MFv70Awru&Czx9b0s@FJ6v@{$P?ZVE#U2J+7 z8?n;=kK@hHd-m(U{`t^j0iKrMe&6&6HikKqVFuNc-v(Ec-v%!v{j|zT=ie^Oe*68Q z#{xVl=ie?iJ%o)}8V={&V~hj96T+zclivmz7WQ9gyOlbT=E2zj0000K7TENJG^O*SQ!w^?PA*bi~;V&-UM*^d1yPJDCo{XoF3Wa&r~eQi)6|@E=A5(L-CcY3?3vx%+^ls# z%c4-P*R9v-YQi`t|FXWm{WY*6DPL=l(K22!i4#@}f(8e>-y5<$tr; zoLScGcBg*Y`>P@U<+T*sZ3}|HvMgKs<$S$fw=fLt?Ch+Q`~fi$K5j$tf5I)1rl~VC zHy)4gT$4TmAp!f7U;=6ZcazHkB?0%7@d7G;ZA))eYPFh~nSJ~AZR*cYPEIUMQ;VW# z>11V+B(}4&bLToQUc6W~lo>ZSH*;UNy}fO592b||lgVUeo$96hymjt!b#-O?`}=pU zlV#b=tw6nAFD5ldqmdmSAKSZk?~3Eu+S;1gPOH_jtE;Q2+nQDQ+qk+9-CClB}uY$jLl}#j*gDZIcHIS6fIou_V(7oFf=o>FbwVX_IByEft5avegFQw z_4|GK?@yeaomrZu3qN_dyu38Czusu4r>F8K6fa-Cw0^%oHHnubiH%01VnX!o+qcp- zm+5x9)@U>=j^l+tjX!<*WKk4NO&pi)?d{oMFesiM930qSFjyGQZns;6<@or2cP^)n3*;aFz+7NPo|ZZmG9@RG!Nn*yT5*P zPR*0}*Ob>Qzux|y(DRS|ynw$)FK;K$^SRqrlqWr_U*+wU*YooTexkB^?A3W2Kc7*3 zUghT{%IB}T-|G1gk*znnM00000NkvXXu0mjf D1A&F| diff --git a/src/graphics/__image_snapshots__/Graphics - Merge single rectangle-snap.png b/src/graphics/__image_snapshots__/Graphics - Merge single rectangle-snap.png index fa9853f414ed81d5033805a29596907a28a4b699..9b84132cc245dabeb526a4491d57062d36bcccec 100644 GIT binary patch literal 2828 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 E0j8!NS^xk5 literal 2804 zcmb7Gc|6o>7oV-`mn<`~W|(2>Dwjy~4mTPMqZC4lFp{icB1x8ptZ@+`q7b_Fl5K=; zLzX7%B+FnBjor1)q_MoeKJWkU=icX!XFJ<-&iS14eB&(4NWy}L1R)TJ@L3b0B?JN$ z0r%CwFW`J5gAM~1sJ|u208-J7o`XOHE6x)2t?y|-l7T?ex z)vMeDMcG+A8K)NHO0@oQIHDY5U2Zf3>^BL9*QysDxGV`*-ak8H(AQbyba9rRb-WQ8 z(4EhbQ(~Ui@O|piyn6-?{y(PWHvaN&s;fV5W=0&6m1Xfb`CQew^z`%si=&ac#*M?!&kF%pi8q;= zIV|P0j}+4lbO>$hkZfck7 zhpMt($Gxp}jsuI^(GmNkXt-wSr4ftr*;DIS2E%W4>VpIC#v9wr?CjgSWoE-CGZXxk zXC24u%{c>NxdX+!LqkIq{Kl7=EEY?+GEZD^U#E+PWw{NnCP7+WK0QQFEj~V8xK2$~ zRV&o|^KR)(b_bgo7Vtc)T{rO8RF5kWG+$nPI$N(H<8qXNJ{XGZ!VI2x(}0kpzN_aQ zp+B_;%Ffl;1^5JF)Mor_qobp<^w_%ZMtWS^Y+%Xk?0IIjQESEE zf-2@^y7aOYfvLIV{MwzxWm^$>*9V@fGCc7!mw5vV0dFmfhoY}(-fY=9v^*@-^6CP! zT9x6KZm|^-*26f)s9HQ%*suOJpUcp#yJ6eCG~XGpkfMn~nZKY^H0HKgMt#f2(I< z%$&!W%3<@z1Mh9+5Q9ZXdd~y(@SAOK�)agwKYS@!{+8_+<|5%*MIGDZY_JZk%^9 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 delta 2674 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 diff --git a/src/graphics/shapes/__image_snapshots__/MergedRectangles-Window 2-snap.png b/src/graphics/shapes/__image_snapshots__/MergedRectangles-Window 2-snap.png index 9442fd0f81f9b206c053d216d002f6fb7f40ec5a..e9ee7a424821c700f5d5beec94e4599438520704 100644 GIT binary patch delta 2240 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 V8RqFUg#Q2l002ovPDHLkV1i#?va$dG diff --git a/src/graphics/shapes/__image_snapshots__/MergedRectangles-Window-snap.png b/src/graphics/shapes/__image_snapshots__/MergedRectangles-Window-snap.png index da0034f72ffb2f9f1dc69d0b908c2052b689309c..58ec3886414cf95d0edaca98fb17ca08892e558c 100644 GIT binary patch delta 2295 zcmXw4c~p|=9=4jsEUP=mduF_8n$uz)EmOO>pmN2!S^&=GZl_arF_5_2sEp$PRHz zdzPI4OjsF+M?^(M4SmMSJ`t9tijb1d*RN0W`TRa^ZFqQA1)XgMBlN(d8#it=vDrY4 zAvP{7Etd~&=9gG(J@P@#UbNrQG3x$KX_H& zJqO=DF(cdcO`h%x3U%(By@~-(ZT&fN4?PScPwM0lot*;+CP(Vd_M~732M4?UARazK zpsCv#IJs`oI3ba1k3qirU>fwfti%2PV4+jrtMnn&qwLavdCxAnrz|uX^>cD^G7xX` zf>7Vu+Nw5nh?O}EG~G7?O93Hg%JFdSVq_JPQ$It~!3yr8gpr}ADJ5sv(%=>%= T z-C8W~yct5y%YsAjGwnPc{j4^tpt7*AP@VNzZ?F?kqnlniG3Iq(KCeK)=kH3PI#=iB zZ`!n}S5Jl0-_SZGQa}nM^drCSg`Ig<+Z|B=L|vcvqA4@pgIU@_kxI{TdHL3Bt85-_ z=bGNL1UM39$=95+tXlmYPf^ zZ%}dT`Q2mH>QEEPV33t!PPkD50W&l9ziAhY%M%k5J#eL%fkZQNy!1@HO6mz^QxWN# z`(>&*ZmrC?yqKY4N8fxR;5Y-ZPC>a5C){Lz-1&hbP8k*{>oPnkB?LBRZ(PUz#vKs= zX6B`5cWnC=O38xId+_|e-BcvTGZ zka206NRg^aRcwp7$H&TY^&@*byTEXDTqN=+?0TB784dAi!?p=Cto1sDP&Ut_t`xbd z)6gJl&!{ay^er#W_R|5jIro!k1{D%_?%Zw`nl9?d!o?e^XBcTyZ~a>62$~9>tEq#$ zNNA&rnD}N9E3d63ns#MwjB>?dHa!ut=0)__b_CR1=JbY@C@UR7CSm1GPlmIXg^H{F zh1Q$^I@;Z>rEukI~*Q`SI?&DrHzIQh_6(fW62)HZ4MhI@AD`E!8JhCK>QERML;H zGH8-Db-FVcL_m_w$H-83-q?tTwjBdi*Yqj6?=XVQ)#Po~F4hk)TD*fWt(yRJ5J@{d z7`>iK%C3<*_$yP}yA)6k<0^Ry?&zydBu3Z(zo-Cmow=#8eCZ3SiqWB{ zL(L13jZZ4+h@;rtp(JT!pj;R+`*r+MRah()Y#%J6Pc#rJdHGO{6e#h661ko}ln&ao z5G1_v37&w9)A0ac4VQQ@5d;Tv-_|(;{J`Ih(bc0i{BI@Ky3X%I_tP#XCqF9pO+B!G zw0!YW0CG}+)kveqKYZ}h^o~Q>;!Ie&aM+IJU)VJ{Ql4u@Z}Ho3@1}8x43qI`F?N>4 zpR_e1MhzIoBs5eJz?ahAU(e$5v1_k!)x#fFU$?tbykn#5ar}c*wLWUPEBG~?v@%z`Fn%Tn~3blu)O55L2_VO=-d zM439iTh`{vFD`Tc)E|0>u;zO9hlR1{m<@dM?oM!~CtH2dwfI+C3VKCJaMcQaS~h*o zYiIxx1mS(q*c)%z_@|1yp_@cKCXASV5$<{P9k%2F_pwYSYiep5)7aCK{TxYTGP#Ch zxH=h{lXgE8`CQ%W>9;VXkI$nlt2zua9#*t;13 zmwRBdgGS*vGGn3HS>{wINW1(F zMjjGAF7(d~*y=KS4~0Uh*DgBsm6MC7tVfEst-HN5yJ2pXUpr(Zq7$r{^U4YN@&X*hKLxBmeq2_#hj delta 2318 zcmYLKdsLEX8n>g9HDlI{HCd#cGc`GmC}TR}Ey-?^IfI*qWhmr&w2K!^GenfHvbOD_ zV z)vgDDfLF|s=u?F?3yNPdlh2E#)8qjAb{FjQmz>%ymD}b&L|!lZxW9LE$jz5QAJTcS7YdGG?KJDM6;u4v3l#as6befqqrW=Gl26`!xpXd^do z*ek2br)j?ZbB8SAZUhd8`{3Fc$B5abwFBNY;3G+d7#}>r_*^`d$FqTUbxr1I2G%s z7cCRsnTpi^uK&h0hiaZrN;-2Uw7%&fV^t^6mkUcWG8&O66iYMAX3vEZOH3opI)GVK zRn;jFP#ag1larBJt#*&}41o}UA_zUl0o}V-P3np6Om0aHIxr%4e*(7xFg*83FDWTm z=@gn}XeIO6vuDn7Zd=fMzAtF;Kc^6up#Rkn&|F14opl;Tq!*qH* zE1pJd#HXZqCFz=n>&1;G^RLWCOSed=KTV}laa^dilEu2MRLbS8Fb~(&_h}O1ruC&Q zEi~fX1+fcB%mh$n=@n|Vy5jQ(voC)&7z~Rv5rNd3B2lt?yW)Xh&4Ei|tI_&{Nob-; z>46soMH^d~@o*03)eCipCCc4llBLYTF%Z(c(l7he;S-GEBSf@jTrNitZa+EqRi0?> z^H%FGtt8UWX(gFLq0I1S1LvgYNhDIC#A+-8LxeE>@LYI)AHGX@Eo#u!GF_fk75(@YYA$|Hek4Q1p3~ zeQi}e(t0{!cy)2QuTw0hor`(XVX4CagdsKtW3p@0f4Ep;Tav1uGkhAD@dQy3uClUn zUk-T;WW^7h`|1l;Knk!k>61$V#$Z-zdomb*!ctI`k(O4E3<#(kA0O`o!7xR}OBK0> zg(7-W2`k}Rf zhkgw$E&Dy)2H=(q+U+zDaM-_EQIYJUal*K|NZ;)!0upLZsa_#SW4uC?7Ncgc)O9nk zk0xOfAzgJ3u=vFF{qIQ!0LPKIe;n)!mhkBkm)*opPvZV&=&zY3wyunHTA%rS3=nV{ zwGrv>zlk`3hMxNP8(+)gf{3E6C)t^6-UmhW+3#Pb#%}q>pYuBQFe6wKHK(YSdJ#!= zKSwn!Eqg!GBvoI%m|iR{@)FVjWVN)qYilA(e_w*mQ-DqkSP*B6^43ZtJl&3sMr!5K zdK|z7`6t;uuIlE|I75f_u1WK~Y3b`OB3WlUQ3A($hRV%^QwFfQhpF z>R_TM#TcozxJN9{Dqgku(k0xJY}Ja#1*1?aiRMbYi9D_YKzIUfzthKyZ+Kx6jVp}V zb&XJSi$~ig;W}7N`nnacR-6SX#*A1GQ5eve|G`vUqJ#5rWMssdRFj>R#e^rIqv6g} z4Xne?q&W-q;u~bwPD2D)$He#Kl-Y*&n5y&ikF4mWS&(LZ*F;0OVmYRUZBAGzChemw zSVq39@A2rzle&IM-P=BC677m$lJD@)d|jJKb;9ZlO2^q*O@`dNl>BtmjHTFAaoO}I zz8fe%TEOuNd5FNb{eWMsl2ZKe>6XW1Raa8c=|$khfO_q%`-&4iFqSZxHr{ zpwVkWM|91fm*1Yk;k>};ru>%cq10uaoeVAy16>E!>;KMKs5LyBb1qQ8VFv4a0u_Mj^FnA#mu08XSjn%FUj(I~&7DlPcJ9 zR8P#NU(V1y{A{M{ME^yZ%~lL=mc(I`Pi=6l39_=YA96Sx zzVv$Gp&>jPgT|lmRWB*+FAaOos|+NKbN0u1X9F?l2)FRu@c-vN3Vj=fz~M&BTbzVZv3`u{O_@74h8^s6 ZIK4Tst#!Tm<3F4(0x$po