diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b37bc62..8c77ad02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -176,6 +176,14 @@ follow semantic versioning; release dates are ISO 8601. ### Documentation +- New `TwinOutputExample` flagship: a single 16:9 page written once and + emitted twice from the same session — `buildPdf()` and `buildPptx(Path)` + produce a print-ready PDF and a PowerPoint slide with identical geometry. + The README gains a dual-output section showing the PDF render next to + PowerPoint's own export of the generated slide, plus a screenshot of the + deck open in PowerPoint with the headline text frame selected — the + committed artifacts land 69 native shapes with only the clip-masked logo + as a picture. - `docs/architecture/backend-capability-matrix.md` — a per-capability matrix of what each render backend supports and which class implements it, maintained as part of every capability-changing PR. diff --git a/README.md b/README.md index a099c2f3..a3d582d7 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@

- Declarative Java DSL for structured business PDFs.
- Describe what the document says; the engine resolves layout, pagination, themes, and PDFBox rendering. Cinematic by default. + Declarative Java DSL for structured business documents.
+ Describe what the document says; the engine resolves layout, pagination, themes, and backend rendering — print-ready PDF first, an editable PowerPoint deck from the same source. Cinematic by default.

@@ -42,6 +42,39 @@ ☝ This banner is itself a GraphCompose document — view the full module-first deck (PDF), rendered by EngineDeckV2Example: the 2.0 module graph, native vector charts, and real comparative benchmarks, all drawn by the engine. It renders its own marketing.

+## One source → a PDF and an editable PowerPoint deck + +The same `DocumentSession` emits both. The PDF backend prints the resolved layout; the PPTX backend (**beta**) rebuilds it as slides with identical geometry — text, panels, tables, and vectors arrive in PowerPoint as **native, editable shapes**, not screenshots (the page below lands as 69 native shapes; only its clip-masked logo art is a picture). + +```java +Path deck = Path.of("twin-output.pptx"); +try (DocumentSession doc = GraphCompose.document(Path.of("twin-output.pdf")) + .pageSize(DocumentPageSize.SLIDE_16_9) + .create()) { + compose(doc); // one description + doc.buildPdf(); // print-ready PDF + doc.buildPptx(deck); // editable PowerPoint +} +``` + + + + + + + + + + +
twin-output.pdf — rendered by the PDF backendtwin-output.pptx — the same page, as PowerPoint itself renders it
The twin-output page rendered from the PDFThe same page exported as a PNG by PowerPoint from the generated .pptx
+ +

+ The generated deck open in PowerPoint with the headline text frame selected for editing +

+

+ ☝ The generated deck open in PowerPoint — the headline is a selected, editable text frame, and the ribbon is live because the slide is built from native shapes. Artifacts: PDF · PPTX · source (TwinOutputExample, ~370 lines, page included). +

+ ## Why GraphCompose - **Author intent, not coordinates.** Fluent DSL for sections, paragraphs, tables, lists, layer stacks, themes — the engine handles measurement, pagination, and rendering. @@ -175,7 +208,7 @@ For a Spring Boot `@RestController` streaming the PDF straight to the response, |---|---|---| | PDF | Production | Fixed-layout backend on PDFBox 3.0. Full DSL coverage. | | DOCX | Partial | Semantic export via Apache POI. Unsupported nodes (`shape`, `line`, `ellipse`, `barcode`) are dropped silently — layout fidelity is best-effort for paragraph / list / table content. | -| PPTX | Skeleton | Validates supported node types and emits a manifest. **Not a real PowerPoint export yet** — planned only if there is demand. | +| PPTX | Beta | Fixed-layout export via Apache POI from the same resolved layout — one page per editable slide with native shapes and text frames; clipped regions land as pixel-exact pictures. First shipped in 2.1, marked `@Beta` while the API shape settles. | ### Text & internationalization diff --git a/assets/readme/examples/twin-output.pdf b/assets/readme/examples/twin-output.pdf new file mode 100644 index 00000000..36a56a09 Binary files /dev/null and b/assets/readme/examples/twin-output.pdf differ diff --git a/assets/readme/examples/twin-output.pptx b/assets/readme/examples/twin-output.pptx new file mode 100644 index 00000000..1913c164 Binary files /dev/null and b/assets/readme/examples/twin-output.pptx differ diff --git a/assets/readme/twin-output-editing.png b/assets/readme/twin-output-editing.png new file mode 100644 index 00000000..0b078682 Binary files /dev/null and b/assets/readme/twin-output-editing.png differ diff --git a/assets/readme/twin-output-pdf.png b/assets/readme/twin-output-pdf.png new file mode 100644 index 00000000..2380e404 Binary files /dev/null and b/assets/readme/twin-output-pdf.png differ diff --git a/assets/readme/twin-output-pptx.png b/assets/readme/twin-output-pptx.png new file mode 100644 index 00000000..2da8e4b6 Binary files /dev/null and b/assets/readme/twin-output-pptx.png differ diff --git a/examples/README.md b/examples/README.md index 5451f171..550bdc09 100644 --- a/examples/README.md +++ b/examples/README.md @@ -62,6 +62,7 @@ are with the canonical DSL, then jump to its detailed section below. | [Module-first Profile](#module-first-profile) | Authoring directly against `DocumentSession.module(...).paragraph(...)` — DSL-direct, no template | [PDF](../assets/readme/examples/module-first-profile.pdf) · [Source](src/main/java/com/demcha/examples/flagships/ModuleFirstFileExample.java) | | **Engine Showcase** | Single-page cinematic brand promo — semantic-graph → polished-PDFs visual metaphor with rounded clip frame, magazine headline lockup, KPI cards, capability columns; source of the README hero image | [Source](src/main/java/com/demcha/examples/flagships/EngineShowcase.java) | | **Engine Deck** | Multi-page **landscape** capability deck — page 1 is a banner infographic (DSL code → engine → backends → **real rendered-document thumbnails**), then an authoring-pipeline walkthrough, and two pages of **real benchmark data** (GraphCompose vs iText 9 vs JasperReports) loaded from a bundled result file and drawn as tables + native charts; the landscape companion to Engine Showcase. The same composition also renders as a **geometry-identical PowerPoint deck** (one page = one editable slide) through `buildPptx()` | [PDF](../assets/readme/examples/engine-deck.pdf) · [Source](src/main/java/com/demcha/examples/flagships/EngineDeckExample.java) · [PPTX source](src/main/java/com/demcha/examples/flagships/EngineDeckPptxExample.java) | +| **Twin Output** | The dual-output hook stated by the artifact itself — a single 16:9 page written once and emitted **twice from the same session**: `buildPdf()` and `buildPptx(...)` produce a print-ready PDF and a PowerPoint slide with identical geometry where text, panels, and vectors stay native, editable shapes (only the clip-masked logo art lands as a picture); the root README shows PowerPoint's own render of the slide next to the PDF | [PDF](../assets/readme/examples/twin-output.pdf) · [PPTX](../assets/readme/examples/twin-output.pptx) · [Source](src/main/java/com/demcha/examples/flagships/TwinOutputExample.java) | ### 🧱 Core DSL diff --git a/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java b/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java index 72e91314..ad9ceba0 100644 --- a/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java +++ b/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java @@ -50,6 +50,7 @@ import com.demcha.examples.flagships.FinancialReportExample; import com.demcha.examples.flagships.MasterShowcaseExample; import com.demcha.examples.flagships.ModuleFirstFileExample; +import com.demcha.examples.flagships.TwinOutputExample; import com.demcha.examples.templates.coverletter.CvBlueBannerLetterV2Example; import com.demcha.examples.templates.coverletter.CvBoxedSectionsLetterV2Example; import com.demcha.examples.templates.coverletter.CvCenteredHeadlineLetterV2Example; @@ -214,6 +215,7 @@ public static void main(String[] args) throws Exception { System.out.println("Generated: " + BusinessReportExample.generate()); System.out.println("Generated: " + EngineDeckExample.generate()); System.out.println("Generated: " + EngineDeckPptxExample.generate()); + System.out.println("Generated: " + TwinOutputExample.generate()); System.out.println("Generated: " + FinancialReportExample.generate()); System.out.println("Generated: " + BookTemplateExample.generate()); System.out.println("Generated: " + PoetryTitlePageExample.generate()); diff --git a/examples/src/main/java/com/demcha/examples/flagships/TwinOutputExample.java b/examples/src/main/java/com/demcha/examples/flagships/TwinOutputExample.java new file mode 100644 index 00000000..b410a4a4 --- /dev/null +++ b/examples/src/main/java/com/demcha/examples/flagships/TwinOutputExample.java @@ -0,0 +1,366 @@ +package com.demcha.examples.flagships; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentPageSize; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.dsl.EllipseBuilder; +import com.demcha.compose.document.dsl.ParagraphBuilder; +import com.demcha.compose.document.dsl.ShapeBuilder; +import com.demcha.compose.document.dsl.ShapeContainerBuilder; +import com.demcha.compose.document.node.CanvasChild; +import com.demcha.compose.document.node.CanvasLayerNode; +import com.demcha.compose.document.node.DocumentNode; +import com.demcha.compose.document.node.LayerAlign; +import com.demcha.compose.document.node.TextAlign; +import com.demcha.compose.document.output.DocumentMetadata; +import com.demcha.compose.document.style.ClipPolicy; +import com.demcha.compose.document.style.DocumentColor; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentPaint; +import com.demcha.compose.document.style.DocumentStroke; +import com.demcha.compose.document.style.DocumentTextStyle; +import com.demcha.compose.document.svg.SvgIcon; +import com.demcha.compose.font.FontName; +import com.demcha.examples.support.ExampleOutputPaths; + +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * The dual-output hook, stated by the artifact itself: one 16:9 page written + * once against the canonical DSL and emitted twice from the same + * {@link DocumentSession} — a print-ready PDF via {@code buildPdf()} and a + * PowerPoint deck via {@code buildPptx(Path)}. Both backends consume the same + * resolved layout graph, so the slide carries the page's exact geometry, and + * every panel, chip, and text line on it stays a native, editable PowerPoint + * shape. + * + *

The page design reuses the {@link EngineDeckV2Example} hero language + * (night gradient, violet accents, proof chips) so the pair slots into the + * README next to the release banner.

+ * + * @author Artem Demchyshyn + * @since 2.1.0 + */ +public final class TwinOutputExample { + + private static final double PAGE_WIDTH = DocumentPageSize.SLIDE_16_9.width(); + private static final double PAGE_HEIGHT = DocumentPageSize.SLIDE_16_9.height(); + + // Night surfaces shared with the v2 hero. + private static final DocumentColor NIGHT = DocumentColor.rgb(9, 12, 27); + private static final DocumentColor NIGHT_VIOLET = DocumentColor.rgb(31, 21, 61); + private static final DocumentColor DARK_CARD = DocumentColor.rgb(20, 27, 51); + private static final DocumentColor DARK_CARD_2 = DocumentColor.rgb(27, 34, 64); + private static final DocumentColor DARK_LINE = DocumentColor.rgb(64, 67, 108); + private static final DocumentColor ON_DARK = DocumentColor.rgb(245, 247, 252); + private static final DocumentColor ON_DARK_MUTED = DocumentColor.rgb(177, 185, 207); + private static final DocumentColor CODE_TXT = DocumentColor.rgb(190, 195, 214); + + // Accent family. + private static final DocumentColor VIOLET = DocumentColor.rgb(124, 92, 252); + private static final DocumentColor VIOLET_LIGHT = DocumentColor.rgb(181, 159, 255); + private static final DocumentColor BLUE = DocumentColor.rgb(78, 161, 255); + private static final DocumentColor MINT = DocumentColor.rgb(55, 214, 161); + + private TwinOutputExample() { + } + + /** + * Builds the page once and emits both artifacts from the same session. + * + * @return the generated PDF path; the .pptx twin sits next to it + * @throws Exception when composition or rendering fails + */ + public static Path generate() throws Exception { + Path pdfFile = ExampleOutputPaths.prepare("flagships", "twin-output.pdf"); + Path pptxFile = pdfFile.resolveSibling("twin-output.pptx"); + try (DocumentSession document = GraphCompose.document(pdfFile) + .pageSize(DocumentPageSize.SLIDE_16_9) + .pageBackground(NIGHT) + .margin(DocumentInsets.zero()) + .create()) { + compose(document); + document.buildPdf(); + document.buildPptx(pptxFile); + } + return pdfFile; + } + + /** + * Composes the single hook page shared by both outputs. + * + * @param document open session configured for the 960 x 540 slide canvas + */ + static void compose(DocumentSession document) { + document.metadata(DocumentMetadata.builder() + .title("GraphCompose - one source, two formats") + .author("GraphCompose") + .subject("The same composed page emitted as a print PDF and an editable PowerPoint slide") + .keywords("graphcompose, java, pdf, pptx, dual output, editable slides") + .creator("GraphCompose Examples") + .producer("GraphCompose") + .build()); + document.pageFlow() + .name("TwinOutput") + .add(scene()) + .build(); + } + + private static DocumentNode scene() { + List layers = new ArrayList<>(); + layers.add(at(background(), 0, 0)); + layers.add(at(glow(430, VIOLET.withOpacity(0.13)), 640, -170)); + layers.add(at(glow(300, BLUE.withOpacity(0.09)), 700, 190)); + + layers.add(at(logoLockup(), 42, 24)); + + layers.add(at(canvasText("Kicker", "GRAPHCOMPOSE / ONE SOURCE, TWO FORMATS", + mono(8.8, MINT, true), 430), 52, 108)); + layers.add(at(canvasText("TitleA", "Written once.", display(32, ON_DARK), 420), 52, 134)); + layers.add(at(canvasText("TitleB", "Rendered twice.", display(32, VIOLET_LIGHT), 420), 52, 176)); + layers.add(at(canvasText("Lead", + "One Java composition, one resolved layout graph, two backends: a print-ready " + + "PDF and a PowerPoint slide with the same geometry - where text, panels, " + + "and vectors stay native, editable shapes.", + body(12.3, ON_DARK_MUTED), 450), 54, 228)); + + layers.add(at(codeCard(), 52, 292)); + + layers.add(at(canvasText("GraphLabel", "ONE RESOLVED LAYOUT / TWO BACKENDS", + mono(8.8, MINT, true), 690), 622, 118)); + layers.add(at(layoutGraphPill(), 650, 148)); + layers.addAll(connectors()); + layers.add(at(formatCard("pdf-file", "twin-output.pdf", + "fixed layout - print-ready", MINT), 585, 288)); + layers.add(at(formatCard("ppt-file", "twin-output.pptx", + "native shapes - editable", BLUE), 785, 288)); + layers.add(at(canvasText("ParityNote", "same coordinates - same metrics - same colours", + body(9.3, ON_DARK_MUTED), 690), 622, 398)); + + String[][] proof = { + {"one layout graph", "measured once"}, + {"1 page = 1 slide", "identical geometry"}, + {"shapes stay native", "edit in PowerPoint"}, + {"render-pptx", "beta - opt-in module"} + }; + for (int i = 0; i < proof.length; i++) { + layers.add(at(proofChip(proof[i][0], proof[i][1]), 48 + i * 224, 457)); + } + + return new CanvasLayerNode("TwinOutputHero", PAGE_WIDTH, PAGE_HEIGHT, layers, + ClipPolicy.CLIP_BOUNDS, DocumentInsets.zero(), DocumentInsets.zero()); + } + + private static DocumentNode background() { + return new ShapeBuilder() + .name("TwinGradient") + .size(PAGE_WIDTH, PAGE_HEIGHT) + .fill(new DocumentPaint.Linear(List.of( + new DocumentPaint.Stop(0.0, NIGHT), + new DocumentPaint.Stop(0.58, DocumentColor.rgb(17, 17, 39)), + new DocumentPaint.Stop(1.0, NIGHT_VIOLET)), 12.0)) + .build(); + } + + private static DocumentNode glow(double diameter, DocumentColor color) { + return new EllipseBuilder().name("TwinGlow").circle(diameter).fillColor(color).build(); + } + + private static DocumentNode logoLockup() { + return new ShapeContainerBuilder() + .name("TwinLogo") + .rectangle(310, 72) + .fillColor(DocumentColor.rgba(0, 0, 0, 0)) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .position(icon("logo").node(300), -10, -4, LayerAlign.CENTER_LEFT) + .build(); + } + + private static DocumentNode codeCard() { + // {indent level, code, trailing comment} — indentation is positional + // because paragraph text trims leading whitespace. + String[][] lines = { + {"0", "Path deck = Path.of(\"twin-output.pptx\");", ""}, + {"0", "try (DocumentSession doc = GraphCompose", ""}, + {"2", ".document(Path.of(\"twin-output.pdf\"))", ""}, + {"2", ".pageSize(DocumentPageSize.SLIDE_16_9)", ""}, + {"2", ".create()) {", ""}, + {"1", "compose(doc);", "// one description"}, + {"1", "doc.buildPdf();", "// print-ready PDF"}, + {"1", "doc.buildPptx(deck);", "// editable PowerPoint"}, + {"0", "}", ""}, + }; + ShapeContainerBuilder card = new ShapeContainerBuilder() + .name("TwinCode") + .roundedRect(470, 152, 14) + .fillColor(DocumentColor.rgba(7, 10, 24, 220)) + .stroke(DocumentStroke.of(DARK_LINE, 0.8)); + for (int i = 0; i < lines.length; i++) { + double y = 12 + i * 14.6; + double indent = 20 + Integer.parseInt(lines[i][0]) * 18; + card.position(new ParagraphBuilder() + .name("TwinCodeLine" + i) + .text(lines[i][1]) + .textStyle(mono(9.5, CODE_TXT, false)) + .margin(DocumentInsets.zero()) + .build(), indent, y, LayerAlign.TOP_LEFT); + if (!lines[i][2].isEmpty()) { + card.position(new ParagraphBuilder() + .name("TwinCodeNote" + i) + .text(lines[i][2]) + .textStyle(mono(9.5, MINT, false)) + .margin(DocumentInsets.zero()) + .build(), 250, y, LayerAlign.TOP_LEFT); + } + } + return card.build(); + } + + private static DocumentNode layoutGraphPill() { + return new ShapeContainerBuilder() + .name("TwinLayoutGraph") + .roundedRect(240, 56, 15) + .fillColor(DARK_CARD_2) + .stroke(DocumentStroke.of(VIOLET, 1.2)) + .position(icon("layout-light").node(24), 18, 0, LayerAlign.CENTER_LEFT) + .position(new ParagraphBuilder() + .text("LayoutGraph") + .textStyle(mono(11.5, ON_DARK, false)) + .margin(DocumentInsets.zero()) + .build(), 54, -9, LayerAlign.CENTER_LEFT) + .position(new ParagraphBuilder() + .text("deterministic geometry, measured once") + .textStyle(body(8.6, VIOLET_LIGHT)) + .margin(DocumentInsets.zero()) + .build(), 54, 9, LayerAlign.CENTER_LEFT) + .build(); + } + + private static List connectors() { + List shapes = new ArrayList<>(); + DocumentColor connector = DocumentColor.rgba(167, 139, 250, 150); + shapes.add(at(rect(2, 38, connector), 769, 204)); + shapes.add(at(rect(204, 2, connector), 668, 242)); + shapes.add(at(rect(2, 44, connector), 668, 242)); + shapes.add(at(rect(2, 44, connector), 870, 242)); + shapes.add(at(dot(8, VIOLET), 766, 239)); + shapes.add(at(dot(6, VIOLET_LIGHT), 666, 240)); + shapes.add(at(dot(6, VIOLET_LIGHT), 868, 240)); + return shapes; + } + + private static DocumentNode formatCard(String iconName, String fileName, String lane, + DocumentColor accent) { + return new ShapeContainerBuilder() + .name("TwinFormat_" + fileName) + .roundedRect(170, 92, 14) + .fillColor(DARK_CARD) + .stroke(DocumentStroke.of(accent.withOpacity(0.78), 1.0)) + .position(icon(iconName + "-light").node(22), 14, -22, LayerAlign.CENTER_LEFT) + .position(new ParagraphBuilder() + .text(fileName) + .textStyle(mono(9.6, ON_DARK, false)) + .margin(DocumentInsets.zero()) + .build(), 44, -22, LayerAlign.CENTER_LEFT) + .position(new ParagraphBuilder() + .text(lane) + .textStyle(body(9.0, accent)) + .margin(DocumentInsets.zero()) + .build(), 14, 8, LayerAlign.CENTER_LEFT) + .position(new ParagraphBuilder() + .text("from the same session") + .textStyle(body(8.2, ON_DARK_MUTED)) + .margin(DocumentInsets.zero()) + .build(), 14, 26, LayerAlign.CENTER_LEFT) + .build(); + } + + private static DocumentNode proofChip(String title, String subtitle) { + return new ShapeContainerBuilder() + .name("TwinProof_" + title) + .roundedRect(202, 54, 13) + .fillColor(DocumentColor.rgba(255, 255, 255, 22)) + .stroke(DocumentStroke.of(DARK_LINE, 0.9)) + .position(dot(9, MINT), 16, -8, LayerAlign.CENTER_LEFT) + .position(new ParagraphBuilder() + .text(title) + .textStyle(mono(10.2, ON_DARK, false)) + .margin(DocumentInsets.zero()) + .build(), 34, -9, LayerAlign.CENTER_LEFT) + .position(new ParagraphBuilder() + .text(subtitle) + .textStyle(body(9.5, ON_DARK_MUTED)) + .margin(DocumentInsets.zero()) + .build(), 34, 10, LayerAlign.CENTER_LEFT) + .build(); + } + + // ------------------------------------------------------------------ util + + private static CanvasChild at(DocumentNode node, double x, double y) { + return new CanvasChild(node, x, y); + } + + private static DocumentNode canvasText(String name, String text, DocumentTextStyle style, + double rightMargin) { + return new ParagraphBuilder() + .name(name) + .text(text) + .textStyle(style) + .align(TextAlign.LEFT) + .lineSpacing(1.18) + .margin(new DocumentInsets(0, rightMargin, 0, 0)) + .build(); + } + + private static DocumentNode rect(double width, double height, DocumentColor fill) { + return new ShapeBuilder().size(width, height).fillColor(fill).build(); + } + + private static DocumentNode dot(double diameter, DocumentColor fill) { + return new EllipseBuilder().circle(diameter).fillColor(fill).build(); + } + + private static SvgIcon icon(String name) { + try (InputStream in = Objects.requireNonNull( + TwinOutputExample.class.getResourceAsStream("/showcase/" + name + ".svg"), + "showcase icon missing: " + name)) { + return SvgIcon.parse(new String(in.readAllBytes(), StandardCharsets.UTF_8)); + } catch (Exception e) { + throw new IllegalStateException("failed to load showcase icon: " + name, e); + } + } + + private static DocumentTextStyle display(double size, DocumentColor color) { + return DocumentTextStyle.builder().fontName(FontName.HELVETICA_BOLD).size(size).color(color).build(); + } + + private static DocumentTextStyle body(double size, DocumentColor color) { + return DocumentTextStyle.builder().fontName(FontName.HELVETICA).size(size).color(color).build(); + } + + private static DocumentTextStyle mono(double size, DocumentColor color, boolean bold) { + return DocumentTextStyle.builder() + .fontName(bold ? FontName.COURIER_BOLD : FontName.COURIER) + .size(size) + .color(color) + .build(); + } + + /** + * Generates both artifacts from the command line. + * + * @param args unused + * @throws Exception when rendering fails + */ + public static void main(String[] args) throws Exception { + Path pdf = generate(); + System.out.println("Generated: " + pdf); + System.out.println("Generated: " + pdf.resolveSibling("twin-output.pptx")); + } +} diff --git a/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java b/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java index 48719d00..b9da7826 100644 --- a/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java +++ b/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java @@ -136,6 +136,7 @@ record Entry(String title, String description, List tags, String codeUrl flagship("master-showcase", "MasterShowcaseExample", "Master Showcase", "Kitchen-sink demo combining every primitive into a single document — the full GraphCompose surface.", "showcase"); flagship("business-report", "BusinessReportExample", "Business Report Cover", "Flagship cover page with hero panel, KPI table, and accent strip — ready-to-ship template.", "showcase", "cover"); flagship("module-first-profile", "ModuleFirstFileExample", "Module-First Authoring", "Authoring style focused on declaring data modules first, layout second.", "authoring"); + flagship("twin-output", "TwinOutputExample", "Twin Output", "One 16:9 page written once and emitted twice from the same session — a print-ready PDF and a PowerPoint slide with identical geometry where text, panels, and vectors stay native, editable shapes.", "showcase", "flagship"); flagship("engine-deck", "EngineDeckExample", "Engine Deck", "Landscape flagship deck — hero banner, SVG-icon feature spreads, and benchmark tables and charts the engine renders from comparative data.", "showcase", "flagship"); flagship("feature-catalog", "FeatureCatalogExample", "Feature Catalog", "A guided catalog of the engine's primitives, one section per capability, every heading registered as a PDF outline bookmark for a navigable index.", "showcase", "flagship"); flagship("financial-report", "FinancialReportExample", "Financial Report", "A polished financial-report flagship — clipped-photo masthead, KPI tables, and vector charts combining the engine's data-viz and shape primitives.", "showcase", "flagship"); diff --git a/examples/src/test/java/com/demcha/examples/flagships/TwinOutputLayoutSnapshotTest.java b/examples/src/test/java/com/demcha/examples/flagships/TwinOutputLayoutSnapshotTest.java new file mode 100644 index 00000000..7f57e15d --- /dev/null +++ b/examples/src/test/java/com/demcha/examples/flagships/TwinOutputLayoutSnapshotTest.java @@ -0,0 +1,34 @@ +package com.demcha.examples.flagships; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentPageSize; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.style.DocumentColor; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.testing.layout.LayoutSnapshotAssertions; +import org.junit.jupiter.api.Test; + +import java.nio.file.Path; + +/** + * Locks the geometry of the dual-output hook page after visual review. The + * PDF and the PPTX twin consume the same resolved layout, so pinning the + * layout graph guards both artifacts at once. + */ +class TwinOutputLayoutSnapshotTest { + + @Test + void twinOutputLayoutMatchesBaseline() throws Exception { + try (DocumentSession document = GraphCompose.document() + .pageSize(DocumentPageSize.SLIDE_16_9) + .pageBackground(DocumentColor.rgb(9, 12, 27)) + .margin(DocumentInsets.zero()) + .create()) { + TwinOutputExample.compose(document); + LayoutSnapshotAssertions.assertMatches(document, + Path.of("src", "test", "resources", "layout-snapshots"), + Path.of("target", "visual-tests", "layout-snapshots"), + "twin-output", "flagships"); + } + } +} diff --git a/examples/src/test/java/com/demcha/examples/flagships/TwinOutputNativeShapeTest.java b/examples/src/test/java/com/demcha/examples/flagships/TwinOutputNativeShapeTest.java new file mode 100644 index 00000000..c06906db --- /dev/null +++ b/examples/src/test/java/com/demcha/examples/flagships/TwinOutputNativeShapeTest.java @@ -0,0 +1,48 @@ +package com.demcha.examples.flagships; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentPageSize; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.style.DocumentColor; +import com.demcha.compose.document.style.DocumentInsets; +import org.apache.poi.xslf.usermodel.XMLSlideShow; +import org.apache.poi.xslf.usermodel.XSLFPictureShape; +import org.apache.poi.xslf.usermodel.XSLFShape; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Pins the hook page's headline promise at the PPTX structural level: the + * slide is built from native shapes, and the only picture is the clip-masked + * logo composite. A clip-safety regression that rasters more composites would + * silently falsify the README's editability claim — this guard catches it. + */ +class TwinOutputNativeShapeTest { + + @Test + void theSlideStaysNativeApartFromTheClippedLogo() throws Exception { + try (DocumentSession document = GraphCompose.document() + .pageSize(DocumentPageSize.SLIDE_16_9) + .pageBackground(DocumentColor.rgb(9, 12, 27)) + .margin(DocumentInsets.zero()) + .create()) { + TwinOutputExample.compose(document); + byte[] deck = document.toPptxBytes(); + try (XMLSlideShow show = new XMLSlideShow(new ByteArrayInputStream(deck))) { + assertThat(show.getSlides()).hasSize(1); + List shapes = show.getSlides().get(0).getShapes(); + long pictures = shapes.stream().filter(XSLFPictureShape.class::isInstance).count(); + assertThat(pictures) + .as("only the clip-masked logo lockup rasterizes") + .isEqualTo(1); + assertThat(shapes.size() - pictures) + .as("the rest of the page lands as native shapes") + .isGreaterThan(60); + } + } + } +} diff --git a/examples/src/test/resources/layout-snapshots/flagships/twin-output.json b/examples/src/test/resources/layout-snapshots/flagships/twin-output.json new file mode 100644 index 00000000..3cf7c4dc --- /dev/null +++ b/examples/src/test/resources/layout-snapshots/flagships/twin-output.json @@ -0,0 +1,2837 @@ +{ + "formatVersion" : "2.0", + "canvas" : { + "pageWidth" : 960.0, + "pageHeight" : 540.0, + "innerWidth" : 960.0, + "innerHeight" : 540.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, + "totalPages" : 1, + "nodes" : [ { + "path" : "TwinOutput[0]", + "entityName" : "TwinOutput", + "entityKind" : "ContainerNode", + "parentPath" : null, + "childIndex" : 0, + "depth" : 1, + "layer" : 1, + "computedX" : 0.0, + "computedY" : 0.0, + "placementX" : 0.0, + "placementY" : 0.0, + "placementWidth" : 960.0, + "placementHeight" : 540.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 960.0, + "contentHeight" : 540.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]", + "entityName" : "TwinOutputHero", + "entityKind" : "CanvasLayerNode", + "parentPath" : "TwinOutput[0]", + "childIndex" : 0, + "depth" : 2, + "layer" : 2, + "computedX" : 0.0, + "computedY" : 0.0, + "placementX" : 0.0, + "placementY" : 0.0, + "placementWidth" : 960.0, + "placementHeight" : 540.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 960.0, + "contentHeight" : 540.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinGradient[0]", + "entityName" : "TwinGradient", + "entityKind" : "ShapeNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 0.0, + "computedY" : 0.0, + "placementX" : 0.0, + "placementY" : 0.0, + "placementWidth" : 960.0, + "placementHeight" : 540.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 960.0, + "contentHeight" : 540.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinGlow[1]", + "entityName" : "TwinGlow", + "entityKind" : "EllipseNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 640.0, + "computedY" : 280.0, + "placementX" : 640.0, + "placementY" : 280.0, + "placementWidth" : 430.0, + "placementHeight" : 430.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 430.0, + "contentHeight" : 430.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinGlow[2]", + "entityName" : "TwinGlow", + "entityKind" : "EllipseNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 2, + "depth" : 3, + "layer" : 3, + "computedX" : 700.0, + "computedY" : 50.0, + "placementX" : 700.0, + "placementY" : 50.0, + "placementWidth" : 300.0, + "placementHeight" : 300.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 300.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]", + "entityName" : "TwinLogo", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 3, + "depth" : 3, + "layer" : 3, + "computedX" : 42.0, + "computedY" : 444.0, + "placementX" : 42.0, + "placementY" : 444.0, + "placementWidth" : 310.0, + "placementHeight" : 72.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 310.0, + "contentHeight" : 72.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer1[1]", + "entityName" : "SvgLayer1", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer2[2]", + "entityName" : "SvgLayer2", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer3[3]", + "entityName" : "SvgLayer3", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer4[4]", + "entityName" : "SvgLayer4", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 4, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer5[5]", + "entityName" : "SvgLayer5", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 5, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer6[6]", + "entityName" : "SvgLayer6", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 6, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer7[7]", + "entityName" : "SvgLayer7", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 7, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer8[8]", + "entityName" : "SvgLayer8", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 8, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer9[9]", + "entityName" : "SvgLayer9", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 9, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer10[10]", + "entityName" : "SvgLayer10", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 10, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer11[11]", + "entityName" : "SvgLayer11", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 11, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer12[12]", + "entityName" : "SvgLayer12", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 12, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer13[13]", + "entityName" : "SvgLayer13", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 13, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer14[14]", + "entityName" : "SvgLayer14", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 14, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer15[15]", + "entityName" : "SvgLayer15", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 15, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer16[16]", + "entityName" : "SvgLayer16", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 16, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer17[17]", + "entityName" : "SvgLayer17", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 17, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer18[18]", + "entityName" : "SvgLayer18", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 18, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer19[19]", + "entityName" : "SvgLayer19", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 19, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer20[20]", + "entityName" : "SvgLayer20", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 20, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]/SvgLayer21[21]", + "entityName" : "SvgLayer21", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLogo[3]/SvgIcon[0]", + "childIndex" : 21, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 448.639, + "placementX" : 32.0, + "placementY" : 448.639, + "placementWidth" : 300.0, + "placementHeight" : 70.722, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 300.0, + "contentHeight" : 70.722, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/Kicker[4]", + "entityName" : "Kicker", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 4, + "depth" : 3, + "layer" : 3, + "computedX" : 52.0, + "computedY" : 425.083, + "placementX" : 52.0, + "placementY" : 425.083, + "placementWidth" : 200.64, + "placementHeight" : 6.917, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 200.64, + "contentHeight" : 6.917, + "margin" : { + "top" : 0.0, + "right" : 430.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TitleA[5]", + "entityName" : "TitleA", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 5, + "depth" : 3, + "layer" : 3, + "computedX" : 52.0, + "computedY" : 376.4, + "placementX" : 52.0, + "placementY" : 376.4, + "placementWidth" : 188.512, + "placementHeight" : 29.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 188.512, + "contentHeight" : 29.6, + "margin" : { + "top" : 0.0, + "right" : 420.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TitleB[6]", + "entityName" : "TitleB", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 6, + "depth" : 3, + "layer" : 3, + "computedX" : 52.0, + "computedY" : 334.4, + "placementX" : 52.0, + "placementY" : 334.4, + "placementWidth" : 231.2, + "placementHeight" : 29.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 231.2, + "contentHeight" : 29.6, + "margin" : { + "top" : 0.0, + "right" : 420.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/Lead[7]", + "entityName" : "Lead", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 7, + "depth" : 3, + "layer" : 3, + "computedX" : 54.0, + "computedY" : 275.507, + "placementX" : 54.0, + "placementY" : 275.507, + "placementWidth" : 490.18, + "placementHeight" : 36.493, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 490.18, + "contentHeight" : 36.493, + "margin" : { + "top" : 0.0, + "right" : 450.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]", + "entityName" : "TwinCode", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 8, + "depth" : 3, + "layer" : 3, + "computedX" : 52.0, + "computedY" : 96.0, + "placementX" : 52.0, + "placementY" : 96.0, + "placementWidth" : 470.0, + "placementHeight" : 152.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 470.0, + "contentHeight" : 152.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]/TwinCodeLine0[0]", + "entityName" : "TwinCodeLine0", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 72.0, + "computedY" : 228.533, + "placementX" : 72.0, + "placementY" : 228.533, + "placementWidth" : 228.0, + "placementHeight" : 7.467, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 228.0, + "contentHeight" : 7.467, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]/TwinCodeLine1[1]", + "entityName" : "TwinCodeLine1", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 72.0, + "computedY" : 213.933, + "placementX" : 72.0, + "placementY" : 213.933, + "placementWidth" : 222.3, + "placementHeight" : 7.467, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 222.3, + "contentHeight" : 7.467, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]/TwinCodeLine2[2]", + "entityName" : "TwinCodeLine2", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 108.0, + "computedY" : 199.333, + "placementX" : 108.0, + "placementY" : 199.333, + "placementWidth" : 210.9, + "placementHeight" : 7.467, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 210.9, + "contentHeight" : 7.467, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]/TwinCodeLine3[3]", + "entityName" : "TwinCodeLine3", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 108.0, + "computedY" : 184.733, + "placementX" : 108.0, + "placementY" : 184.733, + "placementWidth" : 216.6, + "placementHeight" : 7.467, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 216.6, + "contentHeight" : 7.467, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]/TwinCodeLine4[4]", + "entityName" : "TwinCodeLine4", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 108.0, + "computedY" : 170.133, + "placementX" : 108.0, + "placementY" : 170.133, + "placementWidth" : 68.4, + "placementHeight" : 7.467, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 68.4, + "contentHeight" : 7.467, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]/TwinCodeLine5[5]", + "entityName" : "TwinCodeLine5", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]", + "childIndex" : 5, + "depth" : 4, + "layer" : 4, + "computedX" : 90.0, + "computedY" : 155.533, + "placementX" : 90.0, + "placementY" : 155.533, + "placementWidth" : 74.1, + "placementHeight" : 7.467, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 74.1, + "contentHeight" : 7.467, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]/TwinCodeNote5[6]", + "entityName" : "TwinCodeNote5", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]", + "childIndex" : 6, + "depth" : 4, + "layer" : 4, + "computedX" : 302.0, + "computedY" : 155.533, + "placementX" : 302.0, + "placementY" : 155.533, + "placementWidth" : 102.6, + "placementHeight" : 7.467, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 102.6, + "contentHeight" : 7.467, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]/TwinCodeLine6[7]", + "entityName" : "TwinCodeLine6", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]", + "childIndex" : 7, + "depth" : 4, + "layer" : 4, + "computedX" : 90.0, + "computedY" : 140.933, + "placementX" : 90.0, + "placementY" : 140.933, + "placementWidth" : 85.5, + "placementHeight" : 7.467, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 85.5, + "contentHeight" : 7.467, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]/TwinCodeNote6[8]", + "entityName" : "TwinCodeNote6", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]", + "childIndex" : 8, + "depth" : 4, + "layer" : 4, + "computedX" : 302.0, + "computedY" : 140.933, + "placementX" : 302.0, + "placementY" : 140.933, + "placementWidth" : 102.6, + "placementHeight" : 7.467, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 102.6, + "contentHeight" : 7.467, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]/TwinCodeLine7[9]", + "entityName" : "TwinCodeLine7", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]", + "childIndex" : 9, + "depth" : 4, + "layer" : 4, + "computedX" : 90.0, + "computedY" : 126.333, + "placementX" : 90.0, + "placementY" : 126.333, + "placementWidth" : 114.0, + "placementHeight" : 7.467, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 114.0, + "contentHeight" : 7.467, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]/TwinCodeNote7[10]", + "entityName" : "TwinCodeNote7", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]", + "childIndex" : 10, + "depth" : 4, + "layer" : 4, + "computedX" : 302.0, + "computedY" : 126.333, + "placementX" : 302.0, + "placementY" : 126.333, + "placementWidth" : 125.4, + "placementHeight" : 7.467, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 125.4, + "contentHeight" : 7.467, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]/TwinCodeLine8[11]", + "entityName" : "TwinCodeLine8", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinCode[8]", + "childIndex" : 11, + "depth" : 4, + "layer" : 4, + "computedX" : 72.0, + "computedY" : 111.733, + "placementX" : 72.0, + "placementY" : 111.733, + "placementWidth" : 5.7, + "placementHeight" : 7.467, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.7, + "contentHeight" : 7.467, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/GraphLabel[9]", + "entityName" : "GraphLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 9, + "depth" : 3, + "layer" : 3, + "computedX" : 622.0, + "computedY" : 415.083, + "placementX" : 622.0, + "placementY" : 415.083, + "placementWidth" : 179.52, + "placementHeight" : 6.917, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 179.52, + "contentHeight" : 6.917, + "margin" : { + "top" : 0.0, + "right" : 690.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLayoutGraph[10]", + "entityName" : "TwinLayoutGraph", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 10, + "depth" : 3, + "layer" : 3, + "computedX" : 650.0, + "computedY" : 336.0, + "placementX" : 650.0, + "placementY" : 336.0, + "placementWidth" : 240.0, + "placementHeight" : 56.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 240.0, + "contentHeight" : 56.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLayoutGraph[10]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLayoutGraph[10]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 668.0, + "computedY" : 352.0, + "placementX" : 668.0, + "placementY" : 352.0, + "placementWidth" : 24.0, + "placementHeight" : 24.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 24.0, + "contentHeight" : 24.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLayoutGraph[10]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLayoutGraph[10]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 668.0, + "computedY" : 352.0, + "placementX" : 668.0, + "placementY" : 352.0, + "placementWidth" : 24.0, + "placementHeight" : 24.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 24.0, + "contentHeight" : 24.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLayoutGraph[10]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLayoutGraph[10]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 704.0, + "computedY" : 368.48, + "placementX" : 704.0, + "placementY" : 368.48, + "placementWidth" : 75.9, + "placementHeight" : 9.039, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 75.9, + "contentHeight" : 9.039, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinLayoutGraph[10]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinLayoutGraph[10]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 704.0, + "computedY" : 351.022, + "placementX" : 704.0, + "placementY" : 351.022, + "placementWidth" : 150.552, + "placementHeight" : 7.955, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 150.552, + "contentHeight" : 7.955, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/ShapeNode[11]", + "entityName" : null, + "entityKind" : "ShapeNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 11, + "depth" : 3, + "layer" : 3, + "computedX" : 769.0, + "computedY" : 298.0, + "placementX" : 769.0, + "placementY" : 298.0, + "placementWidth" : 2.0, + "placementHeight" : 38.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 2.0, + "contentHeight" : 38.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/ShapeNode[12]", + "entityName" : null, + "entityKind" : "ShapeNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 12, + "depth" : 3, + "layer" : 3, + "computedX" : 668.0, + "computedY" : 296.0, + "placementX" : 668.0, + "placementY" : 296.0, + "placementWidth" : 204.0, + "placementHeight" : 2.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 204.0, + "contentHeight" : 2.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/ShapeNode[13]", + "entityName" : null, + "entityKind" : "ShapeNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 13, + "depth" : 3, + "layer" : 3, + "computedX" : 668.0, + "computedY" : 254.0, + "placementX" : 668.0, + "placementY" : 254.0, + "placementWidth" : 2.0, + "placementHeight" : 44.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 2.0, + "contentHeight" : 44.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/ShapeNode[14]", + "entityName" : null, + "entityKind" : "ShapeNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 14, + "depth" : 3, + "layer" : 3, + "computedX" : 870.0, + "computedY" : 254.0, + "placementX" : 870.0, + "placementY" : 254.0, + "placementWidth" : 2.0, + "placementHeight" : 44.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 2.0, + "contentHeight" : 44.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/EllipseNode[15]", + "entityName" : null, + "entityKind" : "EllipseNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 15, + "depth" : 3, + "layer" : 3, + "computedX" : 766.0, + "computedY" : 293.0, + "placementX" : 766.0, + "placementY" : 293.0, + "placementWidth" : 8.0, + "placementHeight" : 8.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 8.0, + "contentHeight" : 8.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/EllipseNode[16]", + "entityName" : null, + "entityKind" : "EllipseNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 16, + "depth" : 3, + "layer" : 3, + "computedX" : 666.0, + "computedY" : 294.0, + "placementX" : 666.0, + "placementY" : 294.0, + "placementWidth" : 6.0, + "placementHeight" : 6.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 6.0, + "contentHeight" : 6.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/EllipseNode[17]", + "entityName" : null, + "entityKind" : "EllipseNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 17, + "depth" : 3, + "layer" : 3, + "computedX" : 868.0, + "computedY" : 294.0, + "placementX" : 868.0, + "placementY" : 294.0, + "placementWidth" : 6.0, + "placementHeight" : 6.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 6.0, + "contentHeight" : 6.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pdf[18]", + "entityName" : "TwinFormat_twin-output.pdf", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 18, + "depth" : 3, + "layer" : 3, + "computedX" : 585.0, + "computedY" : 160.0, + "placementX" : 585.0, + "placementY" : 160.0, + "placementWidth" : 170.0, + "placementHeight" : 92.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 170.0, + "contentHeight" : 92.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pdf[18]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pdf[18]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 599.0, + "computedY" : 217.0, + "placementX" : 599.0, + "placementY" : 217.0, + "placementWidth" : 22.0, + "placementHeight" : 22.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 22.0, + "contentHeight" : 22.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pdf[18]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pdf[18]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 599.0, + "computedY" : 217.0, + "placementX" : 599.0, + "placementY" : 217.0, + "placementWidth" : 22.0, + "placementHeight" : 22.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 22.0, + "contentHeight" : 22.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pdf[18]/SvgIcon[0]/SvgLayer1[1]", + "entityName" : "SvgLayer1", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pdf[18]/SvgIcon[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 599.0, + "computedY" : 217.0, + "placementX" : 599.0, + "placementY" : 217.0, + "placementWidth" : 22.0, + "placementHeight" : 22.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 22.0, + "contentHeight" : 22.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pdf[18]/SvgIcon[0]/SvgLayer2[2]", + "entityName" : "SvgLayer2", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pdf[18]/SvgIcon[0]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 599.0, + "computedY" : 217.0, + "placementX" : 599.0, + "placementY" : 217.0, + "placementWidth" : 22.0, + "placementHeight" : 22.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 22.0, + "contentHeight" : 22.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pdf[18]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pdf[18]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 629.0, + "computedY" : 224.227, + "placementX" : 629.0, + "placementY" : 224.227, + "placementWidth" : 86.4, + "placementHeight" : 7.546, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 86.4, + "contentHeight" : 7.546, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pdf[18]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pdf[18]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 599.0, + "computedY" : 193.838, + "placementX" : 599.0, + "placementY" : 193.838, + "placementWidth" : 96.534, + "placementHeight" : 8.325, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 96.534, + "contentHeight" : 8.325, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pdf[18]/ParagraphNode[3]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pdf[18]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 599.0, + "computedY" : 176.207, + "placementX" : 599.0, + "placementY" : 176.207, + "placementWidth" : 82.484, + "placementHeight" : 7.585, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 82.484, + "contentHeight" : 7.585, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]", + "entityName" : "TwinFormat_twin-output.pptx", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 19, + "depth" : 3, + "layer" : 3, + "computedX" : 785.0, + "computedY" : 160.0, + "placementX" : 785.0, + "placementY" : 160.0, + "placementWidth" : 170.0, + "placementHeight" : 92.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 170.0, + "contentHeight" : 92.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 799.0, + "computedY" : 217.0, + "placementX" : 799.0, + "placementY" : 217.0, + "placementWidth" : 22.0, + "placementHeight" : 22.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 22.0, + "contentHeight" : 22.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 799.0, + "computedY" : 217.0, + "placementX" : 799.0, + "placementY" : 217.0, + "placementWidth" : 22.0, + "placementHeight" : 22.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 22.0, + "contentHeight" : 22.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]/SvgIcon[0]/SvgLayer1[1]", + "entityName" : "SvgLayer1", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]/SvgIcon[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 799.0, + "computedY" : 217.0, + "placementX" : 799.0, + "placementY" : 217.0, + "placementWidth" : 22.0, + "placementHeight" : 22.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 22.0, + "contentHeight" : 22.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]/SvgIcon[0]/SvgLayer2[2]", + "entityName" : "SvgLayer2", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]/SvgIcon[0]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 799.0, + "computedY" : 217.0, + "placementX" : 799.0, + "placementY" : 217.0, + "placementWidth" : 22.0, + "placementHeight" : 22.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 22.0, + "contentHeight" : 22.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]/SvgIcon[0]/SvgLayer3[3]", + "entityName" : "SvgLayer3", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]/SvgIcon[0]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 799.0, + "computedY" : 217.0, + "placementX" : 799.0, + "placementY" : 217.0, + "placementWidth" : 22.0, + "placementHeight" : 22.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 22.0, + "contentHeight" : 22.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]/SvgIcon[0]/SvgLayer4[4]", + "entityName" : "SvgLayer4", + "entityKind" : "Path", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]/SvgIcon[0]", + "childIndex" : 4, + "depth" : 5, + "layer" : 5, + "computedX" : 799.0, + "computedY" : 217.0, + "placementX" : 799.0, + "placementY" : 217.0, + "placementWidth" : 22.0, + "placementHeight" : 22.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 22.0, + "contentHeight" : 22.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 829.0, + "computedY" : 224.227, + "placementX" : 829.0, + "placementY" : 224.227, + "placementWidth" : 92.16, + "placementHeight" : 7.546, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 92.16, + "contentHeight" : 7.546, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 799.0, + "computedY" : 193.838, + "placementX" : 799.0, + "placementY" : 193.838, + "placementWidth" : 95.049, + "placementHeight" : 8.325, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 95.049, + "contentHeight" : 8.325, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]/ParagraphNode[3]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinFormat_twin-output.pptx[19]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 799.0, + "computedY" : 176.207, + "placementX" : 799.0, + "placementY" : 176.207, + "placementWidth" : 82.484, + "placementHeight" : 7.585, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 82.484, + "contentHeight" : 7.585, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/ParityNote[20]", + "entityName" : "ParityNote", + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 20, + "depth" : 3, + "layer" : 3, + "computedX" : 622.0, + "computedY" : 133.397, + "placementX" : 622.0, + "placementY" : 133.397, + "placementWidth" : 200.517, + "placementHeight" : 8.603, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 200.517, + "contentHeight" : 8.603, + "margin" : { + "top" : 0.0, + "right" : 690.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_one layout graph[21]", + "entityName" : "TwinProof_one layout graph", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 21, + "depth" : 3, + "layer" : 3, + "computedX" : 48.0, + "computedY" : 29.0, + "placementX" : 48.0, + "placementY" : 29.0, + "placementWidth" : 202.0, + "placementHeight" : 54.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 202.0, + "contentHeight" : 54.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_one layout graph[21]/EllipseNode[0]", + "entityName" : null, + "entityKind" : "EllipseNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_one layout graph[21]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 64.0, + "computedY" : 59.5, + "placementX" : 64.0, + "placementY" : 59.5, + "placementWidth" : 9.0, + "placementHeight" : 9.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 9.0, + "contentHeight" : 9.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_one layout graph[21]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_one layout graph[21]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 82.0, + "computedY" : 60.991, + "placementX" : 82.0, + "placementY" : 60.991, + "placementWidth" : 97.92, + "placementHeight" : 8.017, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 97.92, + "contentHeight" : 8.017, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_one layout graph[21]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_one layout graph[21]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 82.0, + "computedY" : 41.606, + "placementX" : 82.0, + "placementY" : 41.606, + "placementWidth" : 65.474, + "placementHeight" : 8.787, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 65.474, + "contentHeight" : 8.787, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_1 page = 1 slide[22]", + "entityName" : "TwinProof_1 page = 1 slide", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 22, + "depth" : 3, + "layer" : 3, + "computedX" : 272.0, + "computedY" : 29.0, + "placementX" : 272.0, + "placementY" : 29.0, + "placementWidth" : 202.0, + "placementHeight" : 54.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 202.0, + "contentHeight" : 54.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_1 page = 1 slide[22]/EllipseNode[0]", + "entityName" : null, + "entityKind" : "EllipseNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_1 page = 1 slide[22]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 288.0, + "computedY" : 59.5, + "placementX" : 288.0, + "placementY" : 59.5, + "placementWidth" : 9.0, + "placementHeight" : 9.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 9.0, + "contentHeight" : 9.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_1 page = 1 slide[22]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_1 page = 1 slide[22]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 306.0, + "computedY" : 60.991, + "placementX" : 306.0, + "placementY" : 60.991, + "placementWidth" : 97.92, + "placementHeight" : 8.017, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 97.92, + "contentHeight" : 8.017, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_1 page = 1 slide[22]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_1 page = 1 slide[22]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 306.0, + "computedY" : 41.606, + "placementX" : 306.0, + "placementY" : 41.606, + "placementWidth" : 77.083, + "placementHeight" : 8.787, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 77.083, + "contentHeight" : 8.787, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_shapes stay native[23]", + "entityName" : "TwinProof_shapes stay native", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 23, + "depth" : 3, + "layer" : 3, + "computedX" : 496.0, + "computedY" : 29.0, + "placementX" : 496.0, + "placementY" : 29.0, + "placementWidth" : 202.0, + "placementHeight" : 54.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 202.0, + "contentHeight" : 54.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_shapes stay native[23]/EllipseNode[0]", + "entityName" : null, + "entityKind" : "EllipseNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_shapes stay native[23]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 512.0, + "computedY" : 59.5, + "placementX" : 512.0, + "placementY" : 59.5, + "placementWidth" : 9.0, + "placementHeight" : 9.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 9.0, + "contentHeight" : 9.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_shapes stay native[23]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_shapes stay native[23]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 530.0, + "computedY" : 60.991, + "placementX" : 530.0, + "placementY" : 60.991, + "placementWidth" : 110.16, + "placementHeight" : 8.017, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 110.16, + "contentHeight" : 8.017, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_shapes stay native[23]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_shapes stay native[23]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 530.0, + "computedY" : 41.606, + "placementX" : 530.0, + "placementY" : 41.606, + "placementWidth" : 76.56, + "placementHeight" : 8.787, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 76.56, + "contentHeight" : 8.787, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_render-pptx[24]", + "entityName" : "TwinProof_render-pptx", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]", + "childIndex" : 24, + "depth" : 3, + "layer" : 3, + "computedX" : 720.0, + "computedY" : 29.0, + "placementX" : 720.0, + "placementY" : 29.0, + "placementWidth" : 202.0, + "placementHeight" : 54.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 202.0, + "contentHeight" : 54.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_render-pptx[24]/EllipseNode[0]", + "entityName" : null, + "entityKind" : "EllipseNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_render-pptx[24]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 736.0, + "computedY" : 59.5, + "placementX" : 736.0, + "placementY" : 59.5, + "placementWidth" : 9.0, + "placementHeight" : 9.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 9.0, + "contentHeight" : 9.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_render-pptx[24]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_render-pptx[24]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 754.0, + "computedY" : 60.991, + "placementX" : 754.0, + "placementY" : 60.991, + "placementWidth" : 67.32, + "placementHeight" : 8.017, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 67.32, + "contentHeight" : 8.017, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_render-pptx[24]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "TwinOutput[0]/TwinOutputHero[0]/TwinProof_render-pptx[24]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 754.0, + "computedY" : 41.606, + "placementX" : 754.0, + "placementY" : 41.606, + "placementWidth" : 84.484, + "placementHeight" : 8.787, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 84.484, + "contentHeight" : 8.787, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + } ] +}