From 62ec66cd15db8b21b8c581da40ef79e72477ca2b Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 26 Nov 2025 11:36:27 +0100 Subject: [PATCH] :wrench: Adding more e2e tests for nested frames with clipping --- .../get-file-frame-nested-clipping.json | 1089 +++++++++++++++++ .../playwright/ui/pages/WasmWorkspacePage.js | 2 +- .../ui/render-wasm-specs/shapes.spec.js | 16 + ...s-a-file-with-nested-clipping-frames-1.png | Bin 0 -> 24421 bytes 4 files changed, 1106 insertions(+), 1 deletion(-) create mode 100644 frontend/playwright/data/render-wasm/get-file-frame-nested-clipping.json create mode 100644 frontend/playwright/ui/render-wasm-specs/shapes.spec.js-snapshots/Renders-a-file-with-nested-clipping-frames-1.png diff --git a/frontend/playwright/data/render-wasm/get-file-frame-nested-clipping.json b/frontend/playwright/data/render-wasm/get-file-frame-nested-clipping.json new file mode 100644 index 0000000000..1a4d016d8f --- /dev/null +++ b/frontend/playwright/data/render-wasm/get-file-frame-nested-clipping.json @@ -0,0 +1,1089 @@ +{ + "~:features": { + "~#set": [ + "fdata/path-data", + "plugins/runtime", + "design-tokens/v1", + "variants/v1", + "layout/grid", + "styles/v2", + "fdata/pointer-map", + "fdata/objects-map", + "render-wasm/v1", + "components/v2", + "fdata/shape-data-type" + ] + }, + "~:team-id": "~ueba8fa2e-4140-8084-8005-448635d7a724", + "~:permissions": { + "~:type": "~:membership", + "~:is-owner": true, + "~:is-admin": true, + "~:can-edit": true, + "~:can-read": true, + "~:is-logged": true + }, + "~:has-media-trimmed": false, + "~:comment-thread-seqn": 0, + "~:name": "Nested clipping", + "~:revn": 44, + "~:modified-at": "~m1764151542189", + "~:vern": 0, + "~:id": "~u44471494-966a-8178-8006-c5bd93f0fe72", + "~:is-shared": false, + "~:migrations": { + "~#ordered-set": [ + "legacy-2", + "legacy-3", + "legacy-5", + "legacy-6", + "legacy-7", + "legacy-8", + "legacy-9", + "legacy-10", + "legacy-11", + "legacy-12", + "legacy-13", + "legacy-14", + "legacy-16", + "legacy-17", + "legacy-18", + "legacy-19", + "legacy-25", + "legacy-26", + "legacy-27", + "legacy-28", + "legacy-29", + "legacy-31", + "legacy-32", + "legacy-33", + "legacy-34", + "legacy-36", + "legacy-37", + "legacy-38", + "legacy-39", + "legacy-40", + "legacy-41", + "legacy-42", + "legacy-43", + "legacy-44", + "legacy-45", + "legacy-46", + "legacy-47", + "legacy-48", + "legacy-49", + "legacy-50", + "legacy-51", + "legacy-52", + "legacy-53", + "legacy-54", + "legacy-55", + "legacy-56", + "legacy-57", + "legacy-59", + "legacy-62", + "legacy-65", + "legacy-66", + "legacy-67", + "0001-remove-tokens-from-groups", + "0002-normalize-bool-content-v2", + "0002-clean-shape-interactions", + "0003-fix-root-shape", + "0003-convert-path-content-v2", + "0005-deprecate-image-type", + "0006-fix-old-texts-fills", + "0008-fix-library-colors-v4", + "0009-clean-library-colors", + "0009-add-partial-text-touched-flags", + "0010-fix-swap-slots-pointing-non-existent-shapes", + "0011-fix-invalid-text-touched-flags", + "0012-fix-position-data", + "0013-fix-component-path", + "0013-clear-invalid-strokes-and-fills", + "0014-fix-tokens-lib-duplicate-ids", + "0014-clear-components-nil-objects", + "0015-fix-text-attrs-blank-strings", + "0015-clean-shadow-color", + "0016-copy-fills-from-position-data-to-text-node" + ] + }, + "~:version": 67, + "~:project-id": "~ueba8fa2e-4140-8084-8005-448635da32b4", + "~:created-at": "~m1764144613130", + "~:backend": "legacy-db", + "~:data": { + "~:pages": [ + "~u44471494-966a-8178-8006-c5bd93f0fe73" + ], + "~:pages-index": { + "~u44471494-966a-8178-8006-c5bd93f0fe73": { + "~:objects": { + "~u00000000-0000-0000-0000-000000000000": { + "~#shape": { + "~:y": 0, + "~:hide-fill-on-export": false, + "~:transform": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:rotation": 0, + "~:name": "Root Frame", + "~:width": 0.01, + "~:type": "~:frame", + "~:points": [ + { + "~#point": { + "~:x": 0, + "~:y": 0 + } + }, + { + "~#point": { + "~:x": 0.01, + "~:y": 0 + } + }, + { + "~#point": { + "~:x": 0.01, + "~:y": 0.01 + } + }, + { + "~#point": { + "~:x": 0, + "~:y": 0.01 + } + } + ], + "~:r2": 0, + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:r3": 0, + "~:r1": 0, + "~:id": "~u00000000-0000-0000-0000-000000000000", + "~:parent-id": "~u00000000-0000-0000-0000-000000000000", + "~:frame-id": "~u00000000-0000-0000-0000-000000000000", + "~:strokes": [], + "~:x": 0, + "~:proportion": 1, + "~:r4": 0, + "~:selrect": { + "~#rect": { + "~:x": 0, + "~:y": 0, + "~:width": 0.01, + "~:height": 0.01, + "~:x1": 0, + "~:y1": 0, + "~:x2": 0.01, + "~:y2": 0.01 + } + }, + "~:fills": [ + { + "~:fill-color": "#FFFFFF", + "~:fill-opacity": 1 + } + ], + "~:flip-x": null, + "~:height": 0.01, + "~:flip-y": null, + "~:shapes": [ + "~u571478fd-6386-8085-8007-2b11cd2fc79a", + "~u1a629c22-3d11-80b1-8007-2b2bf3d82765", + "~u1a629c22-3d11-80b1-8007-2b2c061d3786" + ] + } + }, + "~u571478fd-6386-8085-8007-2b11c3aa600f": { + "~#shape": { + "~:y": 440, + "~:transform": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:rotation": 0, + "~:grow-type": "~:fixed", + "~:hide-in-viewer": false, + "~:name": "Rectangle", + "~:width": 456, + "~:type": "~:rect", + "~:points": [ + { + "~#point": { + "~:x": 669, + "~:y": 440 + } + }, + { + "~#point": { + "~:x": 1125, + "~:y": 440 + } + }, + { + "~#point": { + "~:x": 1125, + "~:y": 609 + } + }, + { + "~#point": { + "~:x": 669, + "~:y": 609 + } + } + ], + "~:r2": 0, + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:r3": 0, + "~:constraints-v": "~:top", + "~:constraints-h": "~:left", + "~:r1": 0, + "~:id": "~u571478fd-6386-8085-8007-2b11c3aa600f", + "~:parent-id": "~u571478fd-6386-8085-8007-2b11bf4e9c11", + "~:frame-id": "~u571478fd-6386-8085-8007-2b11bf4e9c11", + "~:strokes": [], + "~:x": 669, + "~:proportion": 1, + "~:r4": 0, + "~:selrect": { + "~#rect": { + "~:x": 669, + "~:y": 440, + "~:width": 456, + "~:height": 169, + "~:x1": 669, + "~:y1": 440, + "~:x2": 1125, + "~:y2": 609 + } + }, + "~:fills": [ + { + "~:fill-color": "#B1B2B5", + "~:fill-opacity": 1 + } + ], + "~:flip-x": null, + "~:height": 169, + "~:flip-y": null + } + }, + "~u571478fd-6386-8085-8007-2b11cd2fc79a": { + "~#shape": { + "~:y": 204, + "~:hide-fill-on-export": false, + "~:transform": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:rotation": 0, + "~:grow-type": "~:fixed", + "~:hide-in-viewer": false, + "~:name": "Board", + "~:width": 535, + "~:type": "~:frame", + "~:points": [ + { + "~#point": { + "~:x": 333, + "~:y": 204 + } + }, + { + "~#point": { + "~:x": 868, + "~:y": 204 + } + }, + { + "~#point": { + "~:x": 868, + "~:y": 851 + } + }, + { + "~#point": { + "~:x": 333, + "~:y": 851 + } + } + ], + "~:r2": 0, + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:r3": 0, + "~:r1": 0, + "~:id": "~u571478fd-6386-8085-8007-2b11cd2fc79a", + "~:parent-id": "~u00000000-0000-0000-0000-000000000000", + "~:frame-id": "~u00000000-0000-0000-0000-000000000000", + "~:strokes": [], + "~:x": 333, + "~:proportion": 1, + "~:r4": 0, + "~:selrect": { + "~#rect": { + "~:x": 333, + "~:y": 204, + "~:width": 535, + "~:height": 647, + "~:x1": 333, + "~:y1": 204, + "~:x2": 868, + "~:y2": 851 + } + }, + "~:fills": [ + { + "~:fill-color": "#FFFFFF", + "~:fill-opacity": 1 + } + ], + "~:flip-x": null, + "~:height": 647, + "~:flip-y": null, + "~:shapes": [ + "~u571478fd-6386-8085-8007-2b11bf4e9c11" + ] + } + }, + "~u1a629c22-3d11-80b1-8007-2b2c061d3788": { + "~#shape": { + "~:y": 1173, + "~:transform": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:rotation": 0, + "~:grow-type": "~:fixed", + "~:hide-in-viewer": false, + "~:name": "Rectangle", + "~:width": 456, + "~:type": "~:rect", + "~:points": [ + { + "~#point": { + "~:x": 1254, + "~:y": 1173 + } + }, + { + "~#point": { + "~:x": 1710, + "~:y": 1173 + } + }, + { + "~#point": { + "~:x": 1710, + "~:y": 1342 + } + }, + { + "~#point": { + "~:x": 1254, + "~:y": 1342 + } + } + ], + "~:r2": 0, + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:r3": 0, + "~:constraints-v": "~:top", + "~:constraints-h": "~:left", + "~:r1": 0, + "~:id": "~u1a629c22-3d11-80b1-8007-2b2c061d3788", + "~:parent-id": "~u1a629c22-3d11-80b1-8007-2b2c061d3787", + "~:frame-id": "~u1a629c22-3d11-80b1-8007-2b2c061d3787", + "~:strokes": [], + "~:x": 1254, + "~:proportion": 1, + "~:r4": 0, + "~:selrect": { + "~#rect": { + "~:x": 1254, + "~:y": 1173, + "~:width": 456, + "~:height": 169, + "~:x1": 1254, + "~:y1": 1173, + "~:x2": 1710, + "~:y2": 1342 + } + }, + "~:fills": [ + { + "~:fill-color": "#B1B2B5", + "~:fill-opacity": 1 + } + ], + "~:flip-x": null, + "~:height": 169, + "~:flip-y": null + } + }, + "~u1a629c22-3d11-80b1-8007-2b2c061d3787": { + "~#shape": { + "~:y": 1042, + "~:hide-fill-on-export": false, + "~:transform": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:rotation": 0, + "~:grow-type": "~:fixed", + "~:hide-in-viewer": true, + "~:name": "Board", + "~:width": 518, + "~:type": "~:frame", + "~:points": [ + { + "~#point": { + "~:x": 1106, + "~:y": 1042 + } + }, + { + "~#point": { + "~:x": 1624, + "~:y": 1042 + } + }, + { + "~#point": { + "~:x": 1624, + "~:y": 1466 + } + }, + { + "~#point": { + "~:x": 1106, + "~:y": 1466 + } + } + ], + "~:r2": 0, + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:r3": 0, + "~:constraints-v": "~:top", + "~:constraints-h": "~:left", + "~:r1": 0, + "~:id": "~u1a629c22-3d11-80b1-8007-2b2c061d3787", + "~:parent-id": "~u1a629c22-3d11-80b1-8007-2b2c061d3786", + "~:frame-id": "~u1a629c22-3d11-80b1-8007-2b2c061d3786", + "~:strokes": [], + "~:x": 1106, + "~:proportion": 1, + "~:r4": 0, + "~:selrect": { + "~#rect": { + "~:x": 1106, + "~:y": 1042, + "~:width": 518, + "~:height": 424, + "~:x1": 1106, + "~:y1": 1042, + "~:x2": 1624, + "~:y2": 1466 + } + }, + "~:fills": [ + { + "~:fill-color": "#dc0606", + "~:fill-opacity": 1 + } + ], + "~:flip-x": null, + "~:height": 424, + "~:flip-y": null, + "~:shapes": [ + "~u1a629c22-3d11-80b1-8007-2b2c061d3788" + ] + } + }, + "~u571478fd-6386-8085-8007-2b11bf4e9c11": { + "~#shape": { + "~:y": 309, + "~:hide-fill-on-export": false, + "~:transform": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:rotation": 0, + "~:grow-type": "~:fixed", + "~:hide-in-viewer": true, + "~:name": "Board", + "~:width": 518, + "~:type": "~:frame", + "~:points": [ + { + "~#point": { + "~:x": 521, + "~:y": 309 + } + }, + { + "~#point": { + "~:x": 1039, + "~:y": 309 + } + }, + { + "~#point": { + "~:x": 1039, + "~:y": 733 + } + }, + { + "~#point": { + "~:x": 521, + "~:y": 733 + } + } + ], + "~:r2": 0, + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:r3": 0, + "~:constraints-v": "~:top", + "~:constraints-h": "~:left", + "~:r1": 0, + "~:id": "~u571478fd-6386-8085-8007-2b11bf4e9c11", + "~:parent-id": "~u571478fd-6386-8085-8007-2b11cd2fc79a", + "~:frame-id": "~u571478fd-6386-8085-8007-2b11cd2fc79a", + "~:strokes": [], + "~:x": 521, + "~:proportion": 1, + "~:r4": 0, + "~:selrect": { + "~#rect": { + "~:x": 521, + "~:y": 309, + "~:width": 518, + "~:height": 424, + "~:x1": 521, + "~:y1": 309, + "~:x2": 1039, + "~:y2": 733 + } + }, + "~:fills": [ + { + "~:fill-color": "#dc0606", + "~:fill-opacity": 1 + } + ], + "~:flip-x": null, + "~:height": 424, + "~:flip-y": null, + "~:shapes": [ + "~u571478fd-6386-8085-8007-2b11c3aa600f" + ] + } + }, + "~u1a629c22-3d11-80b1-8007-2b2c061d3786": { + "~#shape": { + "~:y": 937, + "~:hide-fill-on-export": false, + "~:transform": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:rotation": 0, + "~:grow-type": "~:fixed", + "~:hide-in-viewer": false, + "~:name": "Board", + "~:width": 535, + "~:type": "~:frame", + "~:points": [ + { + "~#point": { + "~:x": 918, + "~:y": 937 + } + }, + { + "~#point": { + "~:x": 1453, + "~:y": 937 + } + }, + { + "~#point": { + "~:x": 1453, + "~:y": 1584 + } + }, + { + "~#point": { + "~:x": 918, + "~:y": 1584 + } + } + ], + "~:r2": 0, + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:r3": 0, + "~:blur": { + "~:id": "~u1a629c22-3d11-80b1-8007-2b2c031523df", + "~:type": "~:layer-blur", + "~:value": 4, + "~:hidden": false + }, + "~:r1": 0, + "~:id": "~u1a629c22-3d11-80b1-8007-2b2c061d3786", + "~:parent-id": "~u00000000-0000-0000-0000-000000000000", + "~:frame-id": "~u00000000-0000-0000-0000-000000000000", + "~:strokes": [], + "~:x": 918, + "~:proportion": 1, + "~:shadow": [ + { + "~:id": "~u1a629c22-3d11-80b1-8007-2b2c0899422b", + "~:style": "~:drop-shadow", + "~:color": { + "~:color": "#000000", + "~:opacity": 1 + }, + "~:offset-x": 40, + "~:offset-y": 40, + "~:blur": 4, + "~:spread": 0, + "~:hidden": false + } + ], + "~:r4": 0, + "~:selrect": { + "~#rect": { + "~:x": 918, + "~:y": 937, + "~:width": 535, + "~:height": 647, + "~:x1": 918, + "~:y1": 937, + "~:x2": 1453, + "~:y2": 1584 + } + }, + "~:fills": [ + { + "~:fill-color": "#FFFFFF", + "~:fill-opacity": 1 + } + ], + "~:flip-x": null, + "~:height": 647, + "~:flip-y": null, + "~:shapes": [ + "~u1a629c22-3d11-80b1-8007-2b2c061d3787" + ] + } + }, + "~u1a629c22-3d11-80b1-8007-2b2bf3d82765": { + "~#shape": { + "~:y": 937, + "~:hide-fill-on-export": false, + "~:transform": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:rotation": 0, + "~:grow-type": "~:fixed", + "~:hide-in-viewer": false, + "~:name": "Board", + "~:width": 535, + "~:type": "~:frame", + "~:points": [ + { + "~#point": { + "~:x": 333, + "~:y": 937 + } + }, + { + "~#point": { + "~:x": 868, + "~:y": 937 + } + }, + { + "~#point": { + "~:x": 868, + "~:y": 1584 + } + }, + { + "~#point": { + "~:x": 333, + "~:y": 1584 + } + } + ], + "~:r2": 0, + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:r3": 0, + "~:blur": { + "~:id": "~u1a629c22-3d11-80b1-8007-2b2c031523df", + "~:type": "~:layer-blur", + "~:value": 4, + "~:hidden": false + }, + "~:r1": 0, + "~:id": "~u1a629c22-3d11-80b1-8007-2b2bf3d82765", + "~:parent-id": "~u00000000-0000-0000-0000-000000000000", + "~:frame-id": "~u00000000-0000-0000-0000-000000000000", + "~:strokes": [], + "~:x": 333, + "~:proportion": 1, + "~:r4": 0, + "~:selrect": { + "~#rect": { + "~:x": 333, + "~:y": 937, + "~:width": 535, + "~:height": 647, + "~:x1": 333, + "~:y1": 937, + "~:x2": 868, + "~:y2": 1584 + } + }, + "~:fills": [ + { + "~:fill-color": "#FFFFFF", + "~:fill-opacity": 1 + } + ], + "~:flip-x": null, + "~:height": 647, + "~:flip-y": null, + "~:shapes": [ + "~u1a629c22-3d11-80b1-8007-2b2bf3d82766" + ] + } + }, + "~u1a629c22-3d11-80b1-8007-2b2bf3d82766": { + "~#shape": { + "~:y": 1042, + "~:hide-fill-on-export": false, + "~:transform": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:rotation": 0, + "~:grow-type": "~:fixed", + "~:hide-in-viewer": true, + "~:name": "Board", + "~:width": 518, + "~:type": "~:frame", + "~:points": [ + { + "~#point": { + "~:x": 521, + "~:y": 1042 + } + }, + { + "~#point": { + "~:x": 1039, + "~:y": 1042 + } + }, + { + "~#point": { + "~:x": 1039, + "~:y": 1466 + } + }, + { + "~#point": { + "~:x": 521, + "~:y": 1466 + } + } + ], + "~:r2": 0, + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:r3": 0, + "~:constraints-v": "~:top", + "~:constraints-h": "~:left", + "~:r1": 0, + "~:id": "~u1a629c22-3d11-80b1-8007-2b2bf3d82766", + "~:parent-id": "~u1a629c22-3d11-80b1-8007-2b2bf3d82765", + "~:frame-id": "~u1a629c22-3d11-80b1-8007-2b2bf3d82765", + "~:strokes": [], + "~:x": 521, + "~:proportion": 1, + "~:r4": 0, + "~:selrect": { + "~#rect": { + "~:x": 521, + "~:y": 1042, + "~:width": 518, + "~:height": 424, + "~:x1": 521, + "~:y1": 1042, + "~:x2": 1039, + "~:y2": 1466 + } + }, + "~:fills": [ + { + "~:fill-color": "#dc0606", + "~:fill-opacity": 1 + } + ], + "~:flip-x": null, + "~:height": 424, + "~:flip-y": null, + "~:shapes": [ + "~u1a629c22-3d11-80b1-8007-2b2bf3d82767" + ] + } + }, + "~u1a629c22-3d11-80b1-8007-2b2bf3d82767": { + "~#shape": { + "~:y": 1173, + "~:transform": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:rotation": 0, + "~:grow-type": "~:fixed", + "~:hide-in-viewer": false, + "~:name": "Rectangle", + "~:width": 456, + "~:type": "~:rect", + "~:points": [ + { + "~#point": { + "~:x": 669, + "~:y": 1173 + } + }, + { + "~#point": { + "~:x": 1125, + "~:y": 1173 + } + }, + { + "~#point": { + "~:x": 1125, + "~:y": 1342 + } + }, + { + "~#point": { + "~:x": 669, + "~:y": 1342 + } + } + ], + "~:r2": 0, + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:r3": 0, + "~:constraints-v": "~:top", + "~:constraints-h": "~:left", + "~:r1": 0, + "~:id": "~u1a629c22-3d11-80b1-8007-2b2bf3d82767", + "~:parent-id": "~u1a629c22-3d11-80b1-8007-2b2bf3d82766", + "~:frame-id": "~u1a629c22-3d11-80b1-8007-2b2bf3d82766", + "~:strokes": [], + "~:x": 669, + "~:proportion": 1, + "~:r4": 0, + "~:selrect": { + "~#rect": { + "~:x": 669, + "~:y": 1173, + "~:width": 456, + "~:height": 169, + "~:x1": 669, + "~:y1": 1173, + "~:x2": 1125, + "~:y2": 1342 + } + }, + "~:fills": [ + { + "~:fill-color": "#B1B2B5", + "~:fill-opacity": 1 + } + ], + "~:flip-x": null, + "~:height": 169, + "~:flip-y": null + } + } + }, + "~:id": "~u1dc9717a-2217-80f7-8007-2b11bac2823f", + "~:name": "Page 1" + } + }, + "~:id": "~u44471494-966a-8178-8006-c5bd93f0fe72", + "~:options": { + "~:components-v2": true, + "~:base-font-size": "16px" + } + } + } \ No newline at end of file diff --git a/frontend/playwright/ui/pages/WasmWorkspacePage.js b/frontend/playwright/ui/pages/WasmWorkspacePage.js index 851bb8af49..d594232c47 100644 --- a/frontend/playwright/ui/pages/WasmWorkspacePage.js +++ b/frontend/playwright/ui/pages/WasmWorkspacePage.js @@ -42,7 +42,7 @@ export class WasmWorkspacePage extends WorkspacePage { } async waitForFirstRenderWithoutUI() { - await waitForFirstRender(); + await this.waitForFirstRender(); await this.hideUI(); } diff --git a/frontend/playwright/ui/render-wasm-specs/shapes.spec.js b/frontend/playwright/ui/render-wasm-specs/shapes.spec.js index f1d9b46dd8..040cf66953 100644 --- a/frontend/playwright/ui/render-wasm-specs/shapes.spec.js +++ b/frontend/playwright/ui/render-wasm-specs/shapes.spec.js @@ -258,6 +258,22 @@ test("Renders a file with nested frames with inherited blur", async ({ await expect(workspace.canvas).toHaveScreenshot(); }); +test("Renders a file with nested clipping frames", async ({ page }) => { + const workspace = new WasmWorkspacePage(page); + await workspace.setupEmptyFile(); + await workspace.mockGetFile( + "render-wasm/get-file-frame-nested-clipping.json", + ); + + await workspace.goToWorkspace({ + id: "44471494-966a-8178-8006-c5bd93f0fe72", + pageId: "44471494-966a-8178-8006-c5bd93f0fe73", + }); + await workspace.waitForFirstRenderWithoutUI(); + + await expect(workspace.canvas).toHaveScreenshot(); +}); + test("Renders a clipped frame with a large blur drop shadow", async ({ page, }) => { diff --git a/frontend/playwright/ui/render-wasm-specs/shapes.spec.js-snapshots/Renders-a-file-with-nested-clipping-frames-1.png b/frontend/playwright/ui/render-wasm-specs/shapes.spec.js-snapshots/Renders-a-file-with-nested-clipping-frames-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5d41d8eb513dd0d224e3177cdf3ff3dd3e6ff028 GIT binary patch literal 24421 zcmeIa2{@E(-!Ohj;V#jlxFbR(*|Ux;NsO;kI!^&);;Fu<&*HqP*MOm3z97 zpru*-wbQ0y-+^nqCqEw)*g4Lx=ql?#nT794C@8<>D zw(k%2z2M=#5Rg8{%f0VA|34Yn@jhM}^R;X?|(-vAO zCugM}%9?vhNO#^34tQq)&i;u#gyx*Y`;Qk76uPihwyMJ<4Go5tW5LfO=Z~G^eP@xI zAZY;651=kM>KZuNt*6qf&YsmCIql#&zZyr$$PkmVlCR#}iouN#!-8&(73G;`hHQMr zeB+mLA!?qjEU&V`G^~rZ22>99C_6ejI}O#|p}dUROpmYxm#DMf|AMFY8AnJ6;uNy&gp?eZ z+4yvd-b%|xtDL0-iu!GHX6|`*4EW(YP7^`B7{M^HR#sH%;@Rk}H=W(U+EgsfG>>de zhePvD#XcqF77jggUvTGA0tHg;T=|CJbeARdTZ|NE_Iub!*wk6bWY(!@mp>7f@=D4| zwM%dI#7OC?LJW!)2ORRdbFJn>!JS3&KNuMUfgg8ub+ev0O~8PNXSd7s%x)T1gw9VC z&0xNn+80_K)n|R`^D$ii{1pRt!q<)#x!Tg%3-uM(U20ZmN)3MjH!B#)K{`s-po=9tBd+)<_0RmW~av-%I?&n7W#5=GF-I! z{EbB=K5nz*f1YhK(iJY|v?NI&r6 z{${5Q%yL5=lx@ULesB~2F#+L@|IhF8zd}U+wS)fxJ@?;?#CGpc9^jmMXiuRFB&cA< z?wo6*b418oEeD-z4>JB)EC^Een+jy*%!zZZukrZYRB(f5ak4txeg3~HYVQ00Y<#Gi z6k45Y4{rP{4urSv(rjS5GYI`$_}{d^f51@vGr|w<`QO^we}VAt7390x)m&5O;JwM; z#hZ89!9oROn?QqF@Ww(Bw??+MTGwm6Ll1@Di%Ctf)UE~%WAEbsZ382tCa;EVrM9Q}_v!M3p6Z7z^vzv8-@u|DD1Gbg|hy44;`E%YrP0eYYJ&v%c- zNP2`G0+^*As`LzN+m=s*$cp(_wDf-#EBs&NY+vwmox0uO$rVcA2LF5B|9pPzA62gZ zA&D9Mn-kHG(WO1ItxO(rn8SFcVa*^{os7nDHBscz1vx|Z_1Y0D`T0z&-pcf1u~nvb zs0q+gt{KMUuxK=SeAX$UxdFz!PiBPwMq;k$E&wR{Uu7KA{3hBya#-K@*x9kS`d4~} zE7n|ux4H_Po?57YI)BG6ZGhL)yzCe&ORFK`+0+Cpd%La4v-H;1ma?YqYnANph&ytP zBwHxGhBHPDS{Qb^7VI^fcqcRB41W0|$=-??X(F zZsp<*)}bz3PZ8vB&|sLjrf;#3p5w6@%tSPv#S4LJ?sXbY=kw?vx?By~Z!mN}Gl z$_85KRK7M?#+d_ipJ#`LIT4dx#+yt{b~Bgs+w`k9+_FWEPaDTrUe-^tsR$jPQnx}D z*DxL*B#jW4BXq;2rpJt9gyw3&tm)ifxHSgM?*>E~to}%>Fd$$G!gU#ChPp1e7okhN z%O&FKE&584h4bBW8Dp395F3w&o<5bwKOZPY1uXP!wA!L2Q5+^tFCu(nrh|}j^{N4D zV)oNFcoVUMW|@E{U@S9quJ%wJih~+Sqy+tN4ZMaycV@)erEH2I04!KU@*Q(T@-2H1 z5Hs~?RKQ|2U7wMGg&+OR146}o`~Gc7p|-+z?IrKi@q^;E)mijztz4hLrJnuq#VM=_0 zgkIZ>{~d3nvy>PTId%0Q1@xS@9(`|YZprNd>MU2E;Dlu; zbf(3{r6OdLarKR+TKCpR1|`{~sJv<^u1uvn(Ty{#-*d-cbIc_oXsUZ|Zg7xshti4e zE_{uvU2XIr6#LK@Kmqg_%4BbiB544V2;!YXR~gZJ=i>vNX&q!e&Wqu6sE^3UW{uD} zWSY+uwxW8N`zDK0^V}wlxU%k$8ZmI1ytr88Tsv}oo|T&F9KQ1Dtej*>dCjq#P-mmZM<7AzkBEs!wv-8KmSQ%dI1cF99dAvOzijRtL7 zLn=`@i2{R!BhMZIPxgVCPz}&(+gtGtM5w>Z(a)@I{{(r>y4=Y<=VtYGTa18lze=jcYoym z6JT{Exm(;kvF69ev#s}U@7?X+Bv0M&X{wKJqnX^Md5Jxy@wQ*uxxl}2soAqDL}$Nk zEAiCs0kC3n9$Z#B_KJuJaZ7ve7NBvwu!o98wA#In<|t5K=%ZFT-|Shwaq`IHa}2Hc z&!_F>30Ed17;p(78x)8eafie)Zr4+2I3d`RsU2R$daQK*B0QA%>h)fNpO;_2b;CWi zr($K2O{`PgtU2;p&Z%vec9!<}9`9zTQZcr6b}ReaNj{$3Fo$21X?yf>-53d4PPRDLV7i(j8?yc+QmV-jmwTybwx4PkROe}B97jdDpPUcEPgH*`F%ph3pysN4( z&3;m=`sAJCI|dYecDLERZn`p2rM2%KlJ5qMYb1(p{V3|~d`Z4FzS(j}^v2oAD>>L$ znVt+{0%hfTv!|TTXU7M=IzPIV4W9844j%e?Y3C7}PC0#o4As$2yztiyFC^cwKS02) zig%`b#0&JCwz@7@*wD4S`~Lo7KXVu7bYss&NZ_%1%571NPoqiS#UIzLiaXy`ExafC zrQXag2Xg|%46JW?2hf|xcXkiWs(a+&@Z9T2YmM?L7i+8RvAEwCMFB^STEmTf-ZgqR ze^B_>lE%ELD=)7I-tPPn?*+UIm;>pgaA<~HTOyK9-|ra7H-V*%+0tnWH5%!qW<_~O z@kijIj!#Rj4G1df@a}6Cx(nj#SFPr!*E*y5Zd~F9XOW31w6&^-!sTNhKi`eqFUPH4);)S% zrboc?58!(C){fE)rW(IHiZuM#kGUJ!etdg?0PIb3KuAHi!4p-`wOc3gvyrt`yJ~OP^xz@$b zli#n?&3`1R@#SOsg`(5%6=SrU&h%*8T<@+9xrWmOF|%FStrKVh zVPU@>p{;~gTb319^v|qRup{hNHoIQvb6yHK@l#6%Opv9Gs=A_XeW%IqyH3-@>$7p> zz5ISUalAJ!`~>ycfSnrGKIZ^pTZW%A) z-aD#L@&n&=d6dEIz`rFhdHmHk;5LR{IK}R};s0|=*lR2T+=gB42raNOqpP*4sp;F& z((J59Z4YfF%+79a>ufox%%>MDnj)JKkZDSO$^G#oCIfm zxV|2G(7$kiX3u8X#Vj?u+x@KxzC*ef15( zT2QLHOW^NwlU2_#L#w;GwLkVstT?m0Qxvdnhn4a@G1ui)0(43;CPWO1cxT3T8L z25M?*27T#sh5DC7EVdp;W zO^SS7-Lsj!`$0ytV^MZ&m+y#@La*Oo`9p=4`djmxm6h&kp>)O*#8*c6G7FK7U5LsS z;PJk{y%Fs(y;eQuh}$mG&Fdc*XFBM$?A1*&nX%=2x8uVyb=rkmWFh0x2DcZ)T?&FJaNe#`<5rEQa@@102((@1B{l27x8XroOV{xfG)9<}dk{(C3(uV?rg38i!^HwC~Em5A&M2)TTyShE{ z5nHVg$^ayynX?mM*=}=9xisR60X@<{60M@LNg#ymArS}!$|gHPg1YMnhb;X7LR}wd z*ovPIL<|nakN3jRA}6RF(CK+^i2;q0?ohg)5t6Tb*LL}8FqYB&2V>u|M#;FJo`kT9 z3dM?h;S7-*%S%gVENzz!agol^FA%NrEo@?UMW5ine4qrO+W~6r@oV(W%AtiolAm5e zhenB(%1HSuN@38~t-X;7C%0ADJ)&NWZ(8H{m@n+}B5Qe>1ZyotPfdbfXXSgE8;gWwWR5OQj-H(tK zgY_hZVz?TtwyH`GJ+6aRAQ;NGk*naXkkm7sFq*1`ts%t#H_PzDHoB+vzYibRU=PYx zZ@q5B@f3iT0F=G5$twQr62{4C?qui~_Li@XL;}fAs1r5#QH}XM{7jdwpfNrDl6xi+ z#PoQu1ob18XvnnRKSN=L0>1daNRjIKg4#6L@A#77hmCoOChzp8qqfW^-1hjl;=8pt zf8a5$N3{mr=7=R)C3!2|Vd!DmP+c}tnfYl=z3$$2>U{KY_2Fr}QP~Lzs}6}59JKW$ zW2gUx44+PzgG0A|S-0g3B=qxpiw*zPQBGi~G+@8oIukhn7pn7v2(XW24OEptwiFNH z?xdK@<1y=|PCL`|Hb%be#{?T+R3%GAAQ zLz~65TPH&jS_wOmO>MxS;Il8na)rMz4w}y7ZyeIhf-!l-kaQw9FX1Si~P;; ztJ6JCSojcXW5|BeBxX6!P(^7&gBK~(4h&{3Wz#|W06%1%EYEQkNgOne^91vi`MUakqhpopWQ*R_BuO%Q7DX5zaGpBv_TYWMVSB)V==Lj$PV#f7il4VjrM zMiL|GNZgX>(5N<`UU4YD=r>DFL`+EFS7BK~*5gu zh$w{F#Owtqs7YXFB{vxe4x72QET4(%h`>#8>{V+|?ge~IK@_B`)wY0grO%{Nd+Fno zCxl{jByBxi^r*`dPdyiP#~q;)5+#kdJG9e#y*C4U$_6w9)jChfCnw2hOw)pjo}9{+ zKZ-`yh_xbKQ2Cf$p)%#W6K!bKE5nUN)m6(@xDBw+Yb1h(GbBael%-fHM!Y{Rf*f4V zBg#KW(r8%h#o@-8BLf7h#dU^bR)>xME^p-i0&Ep>s+g_4CX#5qn3SGMP(-VN%zjX1;5G5 zQ}sZ6kkRNFYHFv0q}I%Wvc6u9ABeJO>9C2BBsYOj2@vTx+$O<_J;L$kFbwBYT{h^o zqzEaJYxA$Iyiv3>{L_cqVYH4;G$}%7xn8=uDrbHEx4?6}KXSP|v6t}6bZ7sWooto_ z&R}IE!V|;>hgnNil2Eg_IWOBIN4)}-jP?&oWo~wcNouW+sd1KV4J11>rpV({PYhkE z8J4VdO`_iu#*t|k)O;=LTLfD(6X(JUO5~$Uc@!SqtP-s|(>ju_5~;?I@pph>3@E^5 z6N4|Pqf1K%tgP4!>iTlNj+Fj{yPW;W)K@2bv}S^v_lFceCJDRM;_k5FwDz#Wj^1rE zNNM+);|7K**=?!mi~6eN%H~MRJVK}J_hpozjb}S74K17L61)0^e>5Ic%f9NZo>o*s z8l${pQEU?lih61)^y|k3DT0F7kjim*9B!>}we;p}3UjA0D zpFZwy7Vh+MEa}T3kguo_x__!Ft1nLu7y&=$c5Nl>FFjmM(rMJm^}Eav_o46{Dfk+` z7oDvueuI}WxvW?z!GB;;R&$@p(9J!+Lg zO7WDR293sGCV2|({GdNf7rEN})YGdq=%bVTy)3P*sx7-FHlj;YejGhY|#D zWOA|;k{^f+I)|K!Wq+k97;Y#pwh|@bE3Lv_XkVavJA4EaLjPIoHag$1q}0F?1-z5C ztzK2)rTy|IiYp;Ci8is1CQHTk`a1k&Vq<%J5Xgi}2t-2g(fbDc?tu4CL&>`52c-~N zB@j^yeq(xjj@oF{#c!L^NIJ8^QC69;gx}g2XTLuShJ-yo>ytGd?tg~#mA1=4t%>v;~6-F}AYxoR71R z;KT8FNB$gAi$G=?sw{?hblk$``oZ{KI{4hne2~y_b(-u#joC5){_+RH(QDtZsSchU zow@E31klSJ*GU-HhzEb~rNQV_HE{TZDd+0nm#z)rAY4)mRXQl+I`O1Q!|_G#c;$ob z1dF4L#D}x$b;;WiL8MP$5u1n;J*P5G8P`ZaaQ#ctc-}d5M`yqL!DTQ&wy*6+Z{6eh z(fE@P;w-3Z;t#A_LQtZs`PX>%#-n*x~L;* zrQXI6@K4X}&JFoxd2(qw=K`;z3aHiqU`?ygxQzgr9;V3cQ?@kS2YR=DFfCuK+zW^0 zo?UHA>UD?2w_Or2r7CN3!9a6*IGfoGb0>pgLgwXh|5gez6SY8Ik4jyH$iQ0-m$i4+ z4XE>QsTf{dsAWX))UhF>03ZR^mm9QW6acxS-|I-xF7-40F7gUrp7?^l(duJd#;e!(SzZAr{Ojd**UV7oGzRTE6(f_hA`aO5thEP$zyNE)t6c}EWOl2&S*u@K zuz|^R$6+C$AoCY)>^{2pv&q%WAU&1wHc`XdE9!OmKbI{FOpCHiMVX~|1A`LV8x2-> zX)!W|cOR>>*rq@5HwFX#d41M@4A1#LwhPA+tSxA*ALLua5EO=2f^jVBPm}ipga)d(z>9p z5WEPruPBa^SyOu!LV(%kTSN0SlaJu19JhWyd1OtJU_b77fOGHyR3HBZ!qu;c3!t;U z3(OyHo7f-mt+o+_1|dJ^B~`*AQQ6M3!-5tME!&{{)+??)Ao{>yZ&LP&540 z&AUNClMBl9K)2%fn+F4QYT+*uKL$BCKRD}jKsNOX*(Ph(G?RcclnK26I^Ae36OTNT z=7VihFL;8_a$zjfp==}{sDBsUDXnFUIb!DtsB+ij7~&cr;SIu13kaQAOZP0 z5uGSw0@i&rxgf}ZAh6s(^~}$Xekp7`7g#h@I;5;MAQmm=aaway1Ww*ev~4|+oD?HX z4_sd?Vl5XLL|kGr-7A&SrIU5h9vf*N%f5zO*S!LjiWbu<8d#k#r3WI5Ez+euEQpGR z@jYm(Jf1{8HO%&vkM;bxx*y)v|M*xiQLrGtLA8tY7#`Z=&?fxa0d+z}%@zo@pbuo);`zpv2qp=K&m8sy2>c(2k)Z+j`j99)E@ltIeo zX3bCvEE|JGG#j_oc>J(;lpr0!H{PDEbgHcNkutn2Ww06(Q&Sl?e{yzT3AWUCt$s!5 zLh}HQFr4d$O(4xo;_qoGQMgnK_#RheDbBxY~M=( zm)sm{-p{H7K1SSqkS*o*U2L`X^wRPx^Ar}oC!`DlwOLuymkT=|8F6PyNuoq3pz>>_ zQ%Ja%u&`U%oBG`D5JcHIzLC3-`#=0o(QY3M3Sy7FM6z_ih$Sq1E-0v|FUKZ3*!D}< z{{8#&m8x{_R~czEX1g^R+Tk9 zZDj+mG?Nc_kSo=M&rz}2LTa5=L)~0*G~9j~Ej^`s+jDn#>KDjll1F^Y?GTqQ^~Pc0 zUQ&k3l`*~E*(qNdb|)}pWNem)3GN=7^?3&LO>fb3i`SZ6@832A>F?b3VS$mmk{jt( z-D&A$@1CH_@=6~jvuL2<49|Su=Gi226<@^^Z1eU&S!J*HEwL&4J(h-Fd-l{=x5`hR zg211rjx*7^hSj~Fg*#?|2L_L6CUf(NIa`EUbF_wIo zp$vXnAD-~&m2szZazzz^TGc83mo}}od|I4{NJ|x<=$xtna~u$B(v5 z^ti$(qV2_AhF&A%&qmt%0F#m*AY4X zTflI?sQstlYQ3o{NAdNsRu_!_B3%)<#?2!CsNPzWFbG}HhniIru!mZMWC)i8AmD3yCr^w}{7=geEXH7ZNgM;B-;WZW^J73T7U-wcwExGI)&a zZDJi>deW`$vTNN0rf@fw1VJE@^QsAb=r?F$-{F7Wto||@@Q8B$)?5Mm;)GdZ~f>a#NQ9L(LcNI z(9O-06bh+TiE%wb(u*gS42C7FyFq|p^`9PQKDoJ?+T9e~9Ag|3l2_?;T65(v$@R4+ z^m(zI;V>)U3nbNs_M4XR^V}qxyc5F4!T~d7Y>FPAq0TLq|7PlQfd+U)JcQrlwYmP(i%8df3h;R-{e>!RFl6T@EM0BZjKf z5+;4$s;IDM5U)?HWD0Ng^vk%_h=W}k2xW+Hdc}|slc^c1MD)@MsU#1igt|n$=G%)J za(6Xe&Ln^tpHmb{KyiE$Lt_Q>SJSURo6o)okpgoaiTxT9==v>uM8s)|m78~42PV|K z-HD$k*qFPvc5KI7@8Uicl>o6U%wTAr)P{F@v<2n>L?uirm>-N%QXS3vK<~<4O3IU7 z()oTUWk}hovXiR*OWcOwh~lm54^cWPsi`-`Y+8vWr6Z)kgP^PZAo&9Q(uE6g7zfXB z9SPxj271en=^Yq~K=eE0h_u7RLG+VCbvoJR5Q!z7 zscy!)|5YHETd}Hh3GC-N3Zc3~<&!TFSHwu~`$*xdqv5O=t0W}zVG z)PO}ugklU*678M_rx)fmZ0%jU$k;p&_msDpO(e+As`aG7ACoucgu5%-WlJ#87?0&6 z)?q67$?i=Z7zgtFcgMd0SoSRD1vP_!2ys_RJwrz(^aSRWRLPwn*f4H?(O*)XU>isY zt?NvMrB^QkfD}LXxd84>`2Y=JM;_lOZi_-7bB*FvD!YQH96O&1{X6_LuG)*UlZRud@xZ>1~zr1d3IdX`|#)l6^ z9wCGjz{yrVB+Zlsn^iKgYPa1zPWcgJqS#aS%!hcq#)Xl*z?wbxy!IM_xs07Hrbz=n z+#2bcv$^}%{>jS2iBK~&tJRf3D_e?MEs141qF;VQ`7uX2rCZN*I%KR-^sILHIuPv2 z<%<#7k}6a+0TQbuHM0`kxxn9UdSQ>Ta2PPmb$!Z?Q$u231z|<=p&Il53-cBU-1<5WClto|O%}AHWY4SlKo~N=}|bxWS?9!3-)Xkj||( zdn>if^tnp@1pJ;3K1Gi%qZ5zzl>zYxHIKtxXMIskUvFYF zrfLA+vPy&8{dFT3JIhGQq|-O+jU&RFJFY+<4=Lw_BziRwbe{qx_(T{qUL ztVP#|;O3yp4?|PBIW`f?$O$R`#XkmZa6y%bIi@waT0!xZR^WOrW&Q?7dHyyFsGGgq3Gfor@j-;ZcXedrl zTJ9BSMDQcFL8Bj0vf?=0WC|Fvc@1_jHR+_VYpSXy2!td=!rCpy6T!W84xkW^o}9qS zQbAVGEFD<-vCoiwg``Fu46I!0u=3N%agSYhmvhWGaSp6AE`Vvq4ib8ifx@Guz6~J- z)310oK~5;>csEy}rx%n_YrhG_+*L|WqSL`zw-EoPb~$u^yDap=2dyXLzB-)*!qO%k z->uOD+Iq$>SZ-430=LB>(aO^o%&JI9nS07ptA?h8rBW8D-8S^GzLWMdA0EnTrI%O6 zZGu&9X-TQ^E#-Si?uK zG;s^UX}LWcbHB)eHC+s%^GHeKyP3*+a|^f1XqET+y>4CqD6Kz|WMd-_n#xs4NKea2 zNy(?y%0rCz0YMeL$QQ5lzCai`L7iN(L z&%W4N6!fxY%@xrr7+E-!823bb<_%v4;}4uTEC_{>l&H4DWR>7ZdWJ?Tr!BMh7lp$@_%qxFKQ5dGAoR>EQ4pMtyU`1^E^ zl*V^b37PRdzSCA&-W2rSbqgm)FFHB%IUOMG-*4`1fWl@MFALV~=Az$@D)$_5XA%4K zjW)V+6}!ZWq{vTB+^003NF1<+&LSVTrVjPhOGXBO*3OrqH#TwcnfqiR*n3pLUW87o z3D-3>p=-7erUH&~+XXEk^55H1RrMT;fUd7p8ZNg2KkB#Jr0X1-Ab4({^d!crY-yd& z<7>R_O^xma`_d?79boguNDGw$4F2qIUW-_tSgIsgQ^Pj~W;BG6ndrmWJllfAEf8+_w02%xAJo>j-BpAH|QvZX5GFJlNTpk536LXrs2Y znLXw!=bn84JJiY?EzhZZC2|`M1p~x9@))Lhj0^s)lT~~$u#oxJpo}Ha`H<(KV3TJw zjP_1s`sSJS~MQ^J&fq5sPlQ-78psySUFQy5-&V zGydQX9F>_y)WQfOpy20GknnVJHHBKwPl?mks(*)}HUuWL)xXQ5{yMEfQwMsuifrAKKS7c#ua>&IgwDcIg-X zF)Uc`s~i398nD-Q&(C4$P9Me@yAv2Z59&jhjKJa{MRtg~VEqp{1)ZEbf3F75uSk4a z7yNW{?X;0gC-o-SQA=)EE9TqlJM?pwFf4i>SfI8t*O~n-=H_sj8vVPNWj!T8%yOJE zNj@Y|>I*n3{EhIo&5T=Aw}Z=7dpB}~>VJ#bs6fdM)bjYs{+w%b5}Ufy$ujN*jYZ6i z&ZPa8+9ghq-9xrt{I{J1EG07J0r_NtTm3~PeD})~8)YF$taboPO;-WzYWRuXnvOhK zlwa1UyI92(B3_xW_o(O{;fVGOQ1v--TZq6C^4XN#8L4g(Gaqh`58@ahvqVfdG2A$a zuRQc83$a_(+fom<72Xk?`k+YFahsjQZMDY6h`ClpL|v)++SrOriu>L3DeCy9)d|b_(0Q0mQQ3E|xe})mt#U2V$Ma%y zXO8XbCf~ii!Nxjb7cwP(c~^B={rpD6l_whcGc$)pt-4qnGgJT&64>$cX>Dyn-);js zKLofH`0XqI*ft|_Uw`-m*gnDvzHHn5*LVOpr|_@A|Hat&^n8{3Y&2lLqr>2S%!`%r z@Kx}CI=#~%DfDC}4eSY%5=LS?p(U!)9yIU`)&`+6ORdb`&_V}r8<9bCopHc zvki!RtiYIR>?l$SFXd4^1Vf+r5PI689rh%qb)-_p+Z?;HR%W<`2zkhkN7MUyYt0W{xVB9~Fgwy3hMTw4J=XN18lM^lCZ?b2#rV zjX(Uy)E%J1np)Picgil~HEN(y+G6W1Y3Ys<<{Lcqgdav9o%`W*S5=e&g)xO(o+^57 zbnrOOt1i3a79C^01{l4<7&U z)$!6Yvf9+(0XF%0G=LkQj@X(e+oYs4eY3gZ0;p=<-e2dzSA0YmCzo0J%oFamra(?R zm4ktGr%p(ghuN7Y|AI?CeI=86JrnPqcHB&&!CJzk{;rP1#deTtej+E#l5*Tra!;Q3 z5Q_Gmq3ryjV*`CIF8^I;fw@`j?1MlQkI+eeShv2?3Lc=&SO%1s55}JO2bkA_4i{(C zr8Oe+R2LDh@}H*krc2TJC2dg9JHS+)e%xg?19!ai@=7AOvYY#1IX{VpsIeQWVuBm& z{0LMVU6?QGW1Zs3!+3WXdK}b=@8a`*G0|+6OBgr86GfyacL1vL+XCx!h6U@GQx6$vJ$X5-cxO*s-NZz-ZbiLDxpmY=wD?c?ydUu09l;nY* zNWO1gjj!Tyy3}2_LscK9;W};o+(Z2q(cY}nZ8@Bibgl5$Ybv5Cq7R>MVS8kCz6a|( ziH;iUP9Y*|%1XLu%+08es%E#;g)4qN{@nDy3E*OeQIDE`Cbi|PTrTntAd(#gs(#fF zySR~S%`ZtC!aO&uf;AZ0ThEeSmFzq3o{!P8)o2!*&N>xa^`%&^<^5aBtn9lw8oZFp z2mLW11KkeEyeH0U@oMLb5c3ClN-IMLZm;ppQ-H{?+Z4*$YP)qy6zFx3y!U^=D1_}Hv3OM2w@isl^}7D*bGNjhfVbz;ZATpm+xd2-V7mY_yt?vzQMbz+{! zu7@BAjJPBST;$;cJStTl599`3`S_;|G}#u?6gVxTt=}G!dFMGX&fv|QW6Ymvf-l@1 z1cwF%fV!N0pbh|lFmmhjb~~p3(7F7FhbvlhOTM)TH9`aI^?5WR=NGQ;J+&W*)cR{^ zXZ0OFjioy`Z<~3(Ectf(#`5aRqiOpkz*(Njc=pSIcVINE{UmBQ1)9$PvZNrwPOc|j z-wX%Z)gPC*y5Q#p`zQcby0))p??$Q^tqhf_cOO11x5r5N>kdijb67ntsOnH^YlC?z z#-@-%HmqeWHB1)YdAP64dx*s4l%@Hlt1d@=y$w%jL^}3V$UQwm7JVKyk zs5VC!ME}oA^`1kFk0a>)z6g+^^ut?GjHH=kgze8ylgC)PdoUkdXDY#e?GF;!?=9`)2oB4l@QK zP@dl23*#f4t*##DN~&`$n-av?@YxEaI;#&Y#Hmyte-O+Z;#_m8?wAjxDGBQ=2i^MX zv6}#Jx%d0`#1fy{qe3x8Vuwv$Vk#;_nP0vo?fbs5LbK8@!Ma_SAf10C7qRx4K8&JI zwTPGAOGi?troeM;5BBxcuxf1ynZ4^%Cf4EX75hDLaZEjbLPw&_a1AnyS_mG1V`M$b znvNh0fwG*QUR;b|hJB0@u09A#>d)(P@3(K?%0?n8;k53eZ1A+ae(2`v{HY_Y&CMbv ze$0g-@JOB%R(GY#zUSdSib2@eWU9&*Q)<4xB|T zHi*`SQ0KRM8&MS}*2FmaVHN2yG2y9OUu*S7)W>86T-8c< zdSUgd{Y|knCHq20V(26kJd8E+vi9KiGpQm;Sg-K+py)`0Cx^Nzpp1JmE_muUsPB3w z{A@`^p#^7(Hx-b^uLn`)cmbguJpm8f-n@B3aW3B%sH^QWteUqF?^845e-@nE8a7nr zH$F(b^I#vz3abZRBK^69*5e$$h|e}f@0K2Bb%}!_&|y`WX~^*^8vuERka>#VyScSB zI^#zS!3wq2cjxQ~abP}E&u^)i!^YidH4LlGb_re}mVsYxcO}g#`AN8}PdsH%DGuF8 zepfxtr#MdFdXJUC`UKngUAnP$A7`0?qfZ5JxkFOT$r>up)q4z3?`c>(Jr2rS0$1sA z|C%Lfn7!9%Vd$ys#$)<|`cXS0*^R%GQ{2qtl|U^?F1yBpWLKYjXsxeRLfgN1s%^DDA#Sp z@gw+E?pb@QrZrP&NAxKrchK*lm0kd`{w+XGb4ES#@vEn|t~ZbZV)b4dbsdy<(|qQt z5fkHM=_-j?1wTWYJ5@HGvO zX}Q@3YTuJtkf?gCU0?hpNb*t^Vos**ZaeP9yO_yF^F>DejNf`IFLU7I*AYvv-TF>$ zfCB>^djceSR+jYan=}gx99~}kb6;JKMnUZLlzV+Clh0Q8oq7;XB)_9Q0Zn@SrAhc~d0Z##k8vW_^+y*Le z^Lom-ZphRj6Xym>EDwm$yC1S%xb>yD6~u&OitjY)oq1sN>xHlydPS~i|K*30E#Fn? z=MU@!_<6SV`#aO;j=7GOzX_N_$!Dr5rQr0fYd6!>IGI2iazRlq{(1C5w4-XB-@)f}r!5{Y@Hms_21j-~*kAonG|8_-F1kkw z7#dtb)_!5gs9>(XPpcY}i%848o_WZ`TIAtXnEQzjr_@2JDgmoJ@~@{RUn?iu>Nt`H zpY4BOBo>`vsV#VZM7a4_0$ecW9{Qp$m}TJmDGHRl9_hEJcW*raknAQ46$Mmq##8yt z6MIR1;S}?Z58f!{D=%p){4Jt@p2qbOC3ADAv=TWfMbVU(SU_LTr0)V3FcJ%Fy4jXV nt8nA@XJj2=Xal3i)=+PO({3*(u9R~Xhnb1xg@W@p{`h|YE%fFK literal 0 HcmV?d00001