Skip to content

Fix marginTop/marginBottom returning undefined when selection spans unmeaningful paragraphs#3306

Open
BryanValverdeU wants to merge 3 commits intomasterfrom
u/bvalverde/fixSpacingIssue
Open

Fix marginTop/marginBottom returning undefined when selection spans unmeaningful paragraphs#3306
BryanValverdeU wants to merge 3 commits intomasterfrom
u/bvalverde/fixSpacingIssue

Conversation

@BryanValverdeU
Copy link
Contributor

@BryanValverdeU BryanValverdeU commented Mar 11, 2026

When a selection spans multiple paragraphs and the cursor lands on an unmeaningful paragraph (one that contains only a trailing/leading SelectionMarker), the previous call to getSelectedParagraphs with removeUnmeaningful=true would skip those paragraphs. This caused getFormatState to see a mix of paragraphs — some with marginTop/marginBottom set and some without — which triggered the conflict-resolution logic and returned undefined for those margin values, breaking the "space before/after" toolbar buttons.

Fix: pass removeUnmeaningful=false in formatParagraphWithContentModel so that all selected paragraphs (including unmeaningful ones at the edges) receive the same format, keeping margins consistent across the selection.

Also fix the isChecked logic in spaceBeforeAfterButtons so the button highlights correctly when a positive margin is present, and add overload + implementation guard for the new removeUnmeaningful parameter in getSelectedParagraphs.

Add unit tests for the new removeUnmeaningful=false and mutate=true paths in collectSelections, and for formatParagraphWithContentModel covering multiple paragraphs, list items, table cells, no-selection return value, and apiName threading.

To fix https://outlookweb.visualstudio.com/Outlook%20Web/_workitems/edit/370198

Torepro

Restore this snapshot:

<h1 style="direction: ltr; text-align: left;"><span style="font-family: Calibri; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■</span></h1><div style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><br></div><h1 style="direction: ltr; text-align: left;"><span style="font-family: Calibri; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■</span></h1><div style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><br></div><h2 style="direction: ltr; text-align: left;"><span style="font-family: Calibri; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■</span></h2><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■</div><ul style="flex-direction: column; display: flex;"><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</li></ul><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■</div><ul style="flex-direction: column; display: flex;"><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</li><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■</li><ul><ul style="flex-direction: column; display: flex;"><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</li><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</li><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</li><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</li><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</li><ul style="flex-direction: column; display: flex;"><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</li></ul></ul></ul><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■</li><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■</li><ul style="flex-direction: column; display: flex;"><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</li><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</li></ul></ul><h2 style="direction: ltr; text-align: left;"><span style="font-family: Calibri; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■</span></h2><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; margin-right: 0px; margin-left: 0px; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><span style="font-weight: 600;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</span></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■</div><ul style="flex-direction: column; display: flex;"><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</li><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</li></ul><div style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><br></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; margin-right: 0px; margin-left: 0px; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><span style="font-weight: 600;">■■■</span></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><br></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><span style="font-weight: 600;">■■■■■■■■■■■■■■■■■</span></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><br></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; margin-right: 0px; margin-left: 0px; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><span style="font-weight: 600;">■■■■■■■■■■■■■■■■■■■■■■■</span></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■</div><h2 style="direction: ltr; text-align: left;"><span style="font-family: Calibri; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■</span></h2><div class="scriptor-paragraph" style="direction: ltr; text-align: left; margin-right: 0px; margin-left: 0px; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><span style="font-weight: 600;">■■■■■■■■■■■■■■■■■■■■■■■</span></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><br></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; margin-right: 0px; margin-left: 0px; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><span style="font-weight: 600;">■■■■■■</span></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><br></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; margin-right: 0px; margin-left: 0px; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><span style="font-weight: 600;">■■■■■■■■■■■■■■■■■</span></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><br></div><h2 style="direction: ltr; text-align: left;"><span style="font-family: Calibri; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■</span></h2><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><span style="font-weight: 600;">■■■■■■■</span></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><table class="scriptor-paragraph" style="direction: ltr; text-align: left; border-collapse: collapse; border-spacing: 0px; box-sizing: border-box;"><tbody><tr><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■</div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■</div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■</div></td></tr><tr><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■</div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAAAXNSR0ICQMB9xQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUATWljcm9zb2Z0IE9mZmljZX/tNXEAAAFbSURBVEjHzdXPKwRhHMfxuW+iZJVfxV7GVVv+Aa7c7Iq7peQg5ToSoZxXOTgph5XCX0COLk4uiohVOFBIWe+p79bT0/PMzDOb+NbrMM88+9ln5vkxXhAE3m/x/jSc6sYEFrCEWRTRmzqc6sQarlAzuEYZvlM4NYxLS6juFqOJwqkhPCUMrvtAITKc6pDHraXwgP6o8FXHwHPs41uud43hVA9uHIJP0CqrqSptL+oEq+EjygjinKINTTjAl3JvyhS+6DDiZgk+MtxfMYUva53usYdPpe0MWQk/tPz5lil8XutUlvYZub5AOzI4jniyTVN4QetUrW8OahI5tMQEh+ZM4V240zq+Y0zuZyzvWPWGAds63zb84BUlef9xk12J2kR9MpFpdmg46nzc2VLU1m0S4f4oJT0Vx/GYMPgZ067nuY8dOZBsoRUMNvIl8mVC18MNgg1Z+/n//Q1txA+8dVQWMPJL5AAAAABJRU5ErkJggg==" alt="Badge Tick1 with solid fill" width="23" height="23" style="width: 23px; height: 23px; display: block;"></div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAAAXNSR0ICQMB9xQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUATWljcm9zb2Z0IE9mZmljZX/tNXEAAAFbSURBVEjHzdXPKwRhHMfxuW+iZJVfxV7GVVv+Aa7c7Iq7peQg5ToSoZxXOTgph5XCX0COLk4uiohVOFBIWe+p79bT0/PMzDOb+NbrMM88+9ln5vkxXhAE3m/x/jSc6sYEFrCEWRTRmzqc6sQarlAzuEYZvlM4NYxLS6juFqOJwqkhPCUMrvtAITKc6pDHraXwgP6o8FXHwHPs41uud43hVA9uHIJP0CqrqSptL+oEq+EjygjinKINTTjAl3JvyhS+6DDiZgk+MtxfMYUva53usYdPpe0MWQk/tPz5lil8XutUlvYZub5AOzI4jniyTVN4QetUrW8OahI5tMQEh+ZM4V240zq+Y0zuZyzvWPWGAds63zb84BUlef9xk12J2kR9MpFpdmg46nzc2VLU1m0S4f4oJT0Vx/GYMPgZ067nuY8dOZBsoRUMNvIl8mVC18MNgg1Z+/n//Q1txA+8dVQWMPJL5AAAAABJRU5ErkJggg==" alt="Badge Tick1 with solid fill" width="23" height="23" style="width: 23px; height: 23px; display: block;"></div></td></tr><tr><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■</div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAAAXNSR0ICQMB9xQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUATWljcm9zb2Z0IE9mZmljZX/tNXEAAAFbSURBVEjHzdXPKwRhHMfxuW+iZJVfxV7GVVv+Aa7c7Iq7peQg5ToSoZxXOTgph5XCX0COLk4uiohVOFBIWe+p79bT0/PMzDOb+NbrMM88+9ln5vkxXhAE3m/x/jSc6sYEFrCEWRTRmzqc6sQarlAzuEYZvlM4NYxLS6juFqOJwqkhPCUMrvtAITKc6pDHraXwgP6o8FXHwHPs41uud43hVA9uHIJP0CqrqSptL+oEq+EjygjinKINTTjAl3JvyhS+6DDiZgk+MtxfMYUva53usYdPpe0MWQk/tPz5lil8XutUlvYZub5AOzI4jniyTVN4QetUrW8OahI5tMQEh+ZM4V240zq+Y0zuZyzvWPWGAds63zb84BUlef9xk12J2kR9MpFpdmg46nzc2VLU1m0S4f4oJT0Vx/GYMPgZ067nuY8dOZBsoRUMNvIl8mVC18MNgg1Z+/n//Q1txA+8dVQWMPJL5AAAAABJRU5ErkJggg==" alt="Badge Tick1 with solid fill" width="23" height="23" style="width: 23px; height: 23px; display: block;"></div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAAAXNSR0ICQMB9xQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUATWljcm9zb2Z0IE9mZmljZX/tNXEAAAFbSURBVEjHzdXPKwRhHMfxuW+iZJVfxV7GVVv+Aa7c7Iq7peQg5ToSoZxXOTgph5XCX0COLk4uiohVOFBIWe+p79bT0/PMzDOb+NbrMM88+9ln5vkxXhAE3m/x/jSc6sYEFrCEWRTRmzqc6sQarlAzuEYZvlM4NYxLS6juFqOJwqkhPCUMrvtAITKc6pDHraXwgP6o8FXHwHPs41uud43hVA9uHIJP0CqrqSptL+oEq+EjygjinKINTTjAl3JvyhS+6DDiZgk+MtxfMYUva53usYdPpe0MWQk/tPz5lil8XutUlvYZub5AOzI4jniyTVN4QetUrW8OahI5tMQEh+ZM4V240zq+Y0zuZyzvWPWGAds63zb84BUlef9xk12J2kR9MpFpdmg46nzc2VLU1m0S4f4oJT0Vx/GYMPgZ067nuY8dOZBsoRUMNvIl8mVC18MNgg1Z+/n//Q1txA+8dVQWMPJL5AAAAABJRU5ErkJggg==" alt="Badge Tick1 with solid fill" width="23" height="23" style="width: 23px; height: 23px; display: block;"></div></td></tr><tr><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■</div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAAAXNSR0ICQMB9xQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUATWljcm9zb2Z0IE9mZmljZX/tNXEAAAFbSURBVEjHzdXPKwRhHMfxuW+iZJVfxV7GVVv+Aa7c7Iq7peQg5ToSoZxXOTgph5XCX0COLk4uiohVOFBIWe+p79bT0/PMzDOb+NbrMM88+9ln5vkxXhAE3m/x/jSc6sYEFrCEWRTRmzqc6sQarlAzuEYZvlM4NYxLS6juFqOJwqkhPCUMrvtAITKc6pDHraXwgP6o8FXHwHPs41uud43hVA9uHIJP0CqrqSptL+oEq+EjygjinKINTTjAl3JvyhS+6DDiZgk+MtxfMYUva53usYdPpe0MWQk/tPz5lil8XutUlvYZub5AOzI4jniyTVN4QetUrW8OahI5tMQEh+ZM4V240zq+Y0zuZyzvWPWGAds63zb84BUlef9xk12J2kR9MpFpdmg46nzc2VLU1m0S4f4oJT0Vx/GYMPgZ067nuY8dOZBsoRUMNvIl8mVC18MNgg1Z+/n//Q1txA+8dVQWMPJL5AAAAABJRU5ErkJggg==" alt="Badge Tick1 with solid fill" width="23" height="23" style="width: 23px; height: 23px; display: block;"></div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAAAXNSR0ICQMB9xQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUATWljcm9zb2Z0IE9mZmljZX/tNXEAAAFbSURBVEjHzdXPKwRhHMfxuW+iZJVfxV7GVVv+Aa7c7Iq7peQg5ToSoZxXOTgph5XCX0COLk4uiohVOFBIWe+p79bT0/PMzDOb+NbrMM88+9ln5vkxXhAE3m/x/jSc6sYEFrCEWRTRmzqc6sQarlAzuEYZvlM4NYxLS6juFqOJwqkhPCUMrvtAITKc6pDHraXwgP6o8FXHwHPs41uud43hVA9uHIJP0CqrqSptL+oEq+EjygjinKINTTjAl3JvyhS+6DDiZgk+MtxfMYUva53usYdPpe0MWQk/tPz5lil8XutUlvYZub5AOzI4jniyTVN4QetUrW8OahI5tMQEh+ZM4V240zq+Y0zuZyzvWPWGAds63zb84BUlef9xk12J2kR9MpFpdmg46nzc2VLU1m0S4f4oJT0Vx/GYMPgZ067nuY8dOZBsoRUMNvIl8mVC18MNgg1Z+/n//Q1txA+8dVQWMPJL5AAAAABJRU5ErkJggg==" alt="Badge Tick1 with solid fill" width="23" height="23" style="width: 23px; height: 23px; display: block;"></div></td></tr><tr><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAAAXNSR0ICQMB9xQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUATWljcm9zb2Z0IE9mZmljZX/tNXEAAAFbSURBVEjHzdXPKwRhHMfxuW+iZJVfxV7GVVv+Aa7c7Iq7peQg5ToSoZxXOTgph5XCX0COLk4uiohVOFBIWe+p79bT0/PMzDOb+NbrMM88+9ln5vkxXhAE3m/x/jSc6sYEFrCEWRTRmzqc6sQarlAzuEYZvlM4NYxLS6juFqOJwqkhPCUMrvtAITKc6pDHraXwgP6o8FXHwHPs41uud43hVA9uHIJP0CqrqSptL+oEq+EjygjinKINTTjAl3JvyhS+6DDiZgk+MtxfMYUva53usYdPpe0MWQk/tPz5lil8XutUlvYZub5AOzI4jniyTVN4QetUrW8OahI5tMQEh+ZM4V240zq+Y0zuZyzvWPWGAds63zb84BUlef9xk12J2kR9MpFpdmg46nzc2VLU1m0S4f4oJT0Vx/GYMPgZ067nuY8dOZBsoRUMNvIl8mVC18MNgg1Z+/n//Q1txA+8dVQWMPJL5AAAAABJRU5ErkJggg==" alt="Badge Tick1 with solid fill" width="23" height="23" style="width: 23px; height: 23px; display: block;"></div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAAAXNSR0ICQMB9xQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUATWljcm9zb2Z0IE9mZmljZX/tNXEAAAFbSURBVEjHzdXPKwRhHMfxuW+iZJVfxV7GVVv+Aa7c7Iq7peQg5ToSoZxXOTgph5XCX0COLk4uiohVOFBIWe+p79bT0/PMzDOb+NbrMM88+9ln5vkxXhAE3m/x/jSc6sYEFrCEWRTRmzqc6sQarlAzuEYZvlM4NYxLS6juFqOJwqkhPCUMrvtAITKc6pDHraXwgP6o8FXHwHPs41uud43hVA9uHIJP0CqrqSptL+oEq+EjygjinKINTTjAl3JvyhS+6DDiZgk+MtxfMYUva53usYdPpe0MWQk/tPz5lil8XutUlvYZub5AOzI4jniyTVN4QetUrW8OahI5tMQEh+ZM4V240zq+Y0zuZyzvWPWGAds63zb84BUlef9xk12J2kR9MpFpdmg46nzc2VLU1m0S4f4oJT0Vx/GYMPgZ067nuY8dOZBsoRUMNvIl8mVC18MNgg1Z+/n//Q1txA+8dVQWMPJL5AAAAABJRU5ErkJggg==" alt="Badge Tick1 with solid fill" width="23" height="23" style="width: 23px; height: 23px; display: block;"></div></td></tr><tr><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■</div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><br></div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAAAXNSR0ICQMB9xQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUATWljcm9zb2Z0IE9mZmljZX/tNXEAAAFbSURBVEjHzdXPKwRhHMfxuW+iZJVfxV7GVVv+Aa7c7Iq7peQg5ToSoZxXOTgph5XCX0COLk4uiohVOFBIWe+p79bT0/PMzDOb+NbrMM88+9ln5vkxXhAE3m/x/jSc6sYEFrCEWRTRmzqc6sQarlAzuEYZvlM4NYxLS6juFqOJwqkhPCUMrvtAITKc6pDHraXwgP6o8FXHwHPs41uud43hVA9uHIJP0CqrqSptL+oEq+EjygjinKINTTjAl3JvyhS+6DDiZgk+MtxfMYUva53usYdPpe0MWQk/tPz5lil8XutUlvYZub5AOzI4jniyTVN4QetUrW8OahI5tMQEh+ZM4V240zq+Y0zuZyzvWPWGAds63zb84BUlef9xk12J2kR9MpFpdmg46nzc2VLU1m0S4f4oJT0Vx/GYMPgZ067nuY8dOZBsoRUMNvIl8mVC18MNgg1Z+/n//Q1txA+8dVQWMPJL5AAAAABJRU5ErkJggg==" alt="Badge Tick1 with solid fill" width="23" height="23" style="width: 23px; height: 23px; display: block;"></div></td></tr><tr><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■</div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><br></div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAAAXNSR0ICQMB9xQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUATWljcm9zb2Z0IE9mZmljZX/tNXEAAAFbSURBVEjHzdXPKwRhHMfxuW+iZJVfxV7GVVv+Aa7c7Iq7peQg5ToSoZxXOTgph5XCX0COLk4uiohVOFBIWe+p79bT0/PMzDOb+NbrMM88+9ln5vkxXhAE3m/x/jSc6sYEFrCEWRTRmzqc6sQarlAzuEYZvlM4NYxLS6juFqOJwqkhPCUMrvtAITKc6pDHraXwgP6o8FXHwHPs41uud43hVA9uHIJP0CqrqSptL+oEq+EjygjinKINTTjAl3JvyhS+6DDiZgk+MtxfMYUva53usYdPpe0MWQk/tPz5lil8XutUlvYZub5AOzI4jniyTVN4QetUrW8OahI5tMQEh+ZM4V240zq+Y0zuZyzvWPWGAds63zb84BUlef9xk12J2kR9MpFpdmg46nzc2VLU1m0S4f4oJT0Vx/GYMPgZ067nuY8dOZBsoRUMNvIl8mVC18MNgg1Z+/n//Q1txA+8dVQWMPJL5AAAAABJRU5ErkJggg==" alt="Badge Tick1 with solid fill" width="23" height="23" style="width: 23px; height: 23px; display: block;"></div></td></tr><tr><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAAAXNSR0ICQMB9xQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUATWljcm9zb2Z0IE9mZmljZX/tNXEAAAFbSURBVEjHzdXPKwRhHMfxuW+iZJVfxV7GVVv+Aa7c7Iq7peQg5ToSoZxXOTgph5XCX0COLk4uiohVOFBIWe+p79bT0/PMzDOb+NbrMM88+9ln5vkxXhAE3m/x/jSc6sYEFrCEWRTRmzqc6sQarlAzuEYZvlM4NYxLS6juFqOJwqkhPCUMrvtAITKc6pDHraXwgP6o8FXHwHPs41uud43hVA9uHIJP0CqrqSptL+oEq+EjygjinKINTTjAl3JvyhS+6DDiZgk+MtxfMYUva53usYdPpe0MWQk/tPz5lil8XutUlvYZub5AOzI4jniyTVN4QetUrW8OahI5tMQEh+ZM4V240zq+Y0zuZyzvWPWGAds63zb84BUlef9xk12J2kR9MpFpdmg46nzc2VLU1m0S4f4oJT0Vx/GYMPgZ067nuY8dOZBsoRUMNvIl8mVC18MNgg1Z+/n//Q1txA+8dVQWMPJL5AAAAABJRU5ErkJggg==" alt="Badge Tick1 with solid fill" width="23" height="23" style="width: 23px; height: 23px; display: block;"></div></td><td class="scriptor-paragraph" style="direction: ltr; text-align: left; border-width: 1px; border-style: solid; border-color: initial;"><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAAAXNSR0ICQMB9xQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUATWljcm9zb2Z0IE9mZmljZX/tNXEAAAFbSURBVEjHzdXPKwRhHMfxuW+iZJVfxV7GVVv+Aa7c7Iq7peQg5ToSoZxXOTgph5XCX0COLk4uiohVOFBIWe+p79bT0/PMzDOb+NbrMM88+9ln5vkxXhAE3m/x/jSc6sYEFrCEWRTRmzqc6sQarlAzuEYZvlM4NYxLS6juFqOJwqkhPCUMrvtAITKc6pDHraXwgP6o8FXHwHPs41uud43hVA9uHIJP0CqrqSptL+oEq+EjygjinKINTTjAl3JvyhS+6DDiZgk+MtxfMYUva53usYdPpe0MWQk/tPz5lil8XutUlvYZub5AOzI4jniyTVN4QetUrW8OahI5tMQEh+ZM4V240zq+Y0zuZyzvWPWGAds63zb84BUlef9xk12J2kR9MpFpdmg46nzc2VLU1m0S4f4oJT0Vx/GYMPgZ067nuY8dOZBsoRUMNvIl8mVC18MNgg1Z+/n//Q1txA+8dVQWMPJL5AAAAABJRU5ErkJggg==" alt="Badge Tick1 with solid fill" width="23" height="23" style="width: 23px; height: 23px; display: block;"></div></td></tr></tbody></table><div style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><br></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><span style="font-weight: 600;">■■■■■■■■■</span></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><span style="font-weight: 600;">■■■■■■■■</span></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><ul style="flex-direction: column; display: flex;"><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</li><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</li><li style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0)); direction: ltr; align-self: start;">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</li></ul><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><span style="font-weight: 600;">■■■■■■■■■■■■</span></div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div class="scriptor-paragraph" style="direction: ltr; text-align: left; font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));">■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■</div><div style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0_0_0_, rgb(0,0,0));"><br></div><div style="font-family: Calibri; font-size: 11pt; color: var(--darkColor_rgb_0__0__0_, rgb(0, 0, 0));"><br></div>
  1. Select all with Ctrl + A
  2. Apply Add or Remove Spacing Before and after
image

Before
Toggle state of the buttons is not working well

After
Is working well.

…nmeaningful paragraphs

When a selection spans multiple paragraphs and the cursor lands on an unmeaningful
paragraph (one that contains only a trailing/leading SelectionMarker), the previous
call to getSelectedParagraphs with removeUnmeaningful=true would skip those paragraphs.
This caused getFormatState to see a mix of paragraphs — some with marginTop/marginBottom
set and some without — which triggered the conflict-resolution logic and returned
undefined for those margin values, breaking the "space before/after" toolbar buttons.

Fix: pass removeUnmeaningful=false in formatParagraphWithContentModel so that all
selected paragraphs (including unmeaningful ones at the edges) receive the same
format, keeping margins consistent across the selection.

Also fix the isChecked logic in spaceBeforeAfterButtons so the button highlights
correctly when a positive margin is present, and add overload + implementation guard
for the new removeUnmeaningful parameter in getSelectedParagraphs.

Add unit tests for the new removeUnmeaningful=false and mutate=true paths in
collectSelections, and for formatParagraphWithContentModel covering multiple
paragraphs, list items, table cells, no-selection return value, and apiName threading.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@BryanValverdeU BryanValverdeU force-pushed the u/bvalverde/fixSpacingIssue branch from 126b470 to d10f567 Compare March 11, 2026 23:05
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR addresses inconsistent paragraph margin format state when a selection spans “unmeaningful” paragraphs (e.g., paragraphs containing only SelectionMarkers), which previously caused marginTop/marginBottom to resolve to undefined and break the space-before/after toolbar toggle state.

Changes:

  • Extend getSelectedParagraphs to optionally skip removing “unmeaningful” selections via a new removeUnmeaningful parameter (defaulting to current behavior).
  • Update formatParagraphWithContentModel to include unmeaningful edge paragraphs during formatting to keep margins consistent.
  • Fix ribbon toggle logic for the “space after” button and add unit tests covering the new selection/formatting paths.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
packages/roosterjs-content-model-dom/test/modelApi/selection/collectSelectionsTest.ts Adds tests for removeUnmeaningful=false and mutate=true behaviors in getSelectedParagraphs.
packages/roosterjs-content-model-dom/lib/modelApi/selection/collectSelections.ts Introduces removeUnmeaningful parameter handling and a new overload for the mutable path.
packages/roosterjs-content-model-api/test/publicApi/utils/formatParagraphWithContentModelTest.ts Expands test coverage for multi-paragraph, list, and table scenarios, plus return value and apiName threading.
packages/roosterjs-content-model-api/lib/publicApi/utils/formatParagraphWithContentModel.ts Passes removeUnmeaningful=false to ensure all selected paragraphs get formatted consistently.
demo/scripts/controlsV2/demoButtons/spaceBeforeAfterButtons.ts Fixes isChecked logic so “space after” highlights when a positive margin is present.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants