⬆️(dependencies) upgrade Blocknote to 0.51.1

Upgrade Blocknote to 0.51.1 to get the latest
features and bug fixes.
This commit is contained in:
Anthony LC
2026-05-19 21:36:26 +02:00
parent 9cde092250
commit 41f76ebde8
19 changed files with 446 additions and 1213 deletions
@@ -6,7 +6,7 @@
/ca 1
>>
endobj
12 0 obj
14 0 obj
<<
/Type /ExtGState
/CA 1
@@ -27,48 +27,44 @@ endobj
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/ExtGState <<
/Gs1 9 0 R
/Gs2 12 0 R
/Gs2 14 0 R
>>
/Font <<
/F2 10 0 R
/F3 11 0 R
/F10 13 0 R
/F24 14 0 R
/F10 15 0 R
>>
/XObject <<
/I1 12 0 R
/I2 13 0 R
>>
/ColorSpace <<
>>
>>
endobj
22 0 obj
18 0 obj
<<
/S /URI
/URI (http://localhost:3000/docs/022d048c-6d07-4e58-b3fc-9c43a28712e9/)
/Type /Page
/Parent 1 0 R
/MediaBox [0 0 595.280029 841.890015]
/Contents 16 0 R
/Resources 17 0 R
/UserUnit 1.388889
>>
endobj
23 0 obj
17 0 obj
<<
/Subtype /Link
/A 22 0 R
/Type /Annot
/Rect [35 490.995483 38.292969 508.995483]
/Border [0 0 0]
/F 4
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/ExtGState <<
/Gs2 14 0 R
/Gs1 9 0 R
>>
endobj
24 0 obj
<<
/S /URI
/URI (http://localhost:3000/docs/022d048c-6d07-4e58-b3fc-9c43a28712e9/)
/Font <<
/F24 19 0 R
/F2 10 0 R
>>
/ColorSpace <<
>>
endobj
25 0 obj
<<
/Subtype /Link
/A 24 0 R
/Type /Annot
/Rect [38.292969 491.490015 50.292969 509.490015]
/Border [0 0 0]
/F 4
>>
endobj
27 0 obj
@@ -82,7 +78,7 @@ endobj
/Subtype /Link
/A 27 0 R
/Type /Annot
/Rect [50.292969 490.995483 53.585938 508.995483]
/Rect [35 490.995483 38.292969 508.995483]
/Border [0 0 0]
/F 4
>>
@@ -98,89 +94,94 @@ endobj
/Subtype /Link
/A 29 0 R
/Type /Annot
/Rect [53.585938 490.995483 142.367188 508.995483]
/Rect [38.292969 491.490015 50.292969 509.490015]
/Border [0 0 0]
/F 4
>>
endobj
31 0 obj
32 0 obj
<<
/S /URI
/URI (http://localhost:3000/docs/022d048c-6d07-4e58-b3fc-9c43a28712e9/)
>>
endobj
32 0 obj
33 0 obj
<<
/Subtype /Link
/A 31 0 R
/A 32 0 R
/Type /Annot
/Rect [50.292969 490.995483 53.585938 508.995483]
/Border [0 0 0]
/F 4
>>
endobj
34 0 obj
<<
/S /URI
/URI (http://localhost:3000/docs/022d048c-6d07-4e58-b3fc-9c43a28712e9/)
>>
endobj
35 0 obj
<<
/Subtype /Link
/A 34 0 R
/Type /Annot
/Rect [53.585938 490.995483 142.367188 508.995483]
/Border [0 0 0]
/F 4
>>
endobj
36 0 obj
<<
/S /URI
/URI (http://localhost:3000/docs/022d048c-6d07-4e58-b3fc-9c43a28712e9/)
>>
endobj
37 0 obj
<<
/Subtype /Link
/A 36 0 R
/Type /Annot
/Rect [142.367188 490.995483 145.660156 508.995483]
/Border [0 0 0]
/F 4
>>
endobj
17 0 obj
22 0 obj
<<
/Type /Page
/Parent 1 0 R
/MediaBox [0 0 595.280029 841.890015]
/Contents 15 0 R
/Resources 16 0 R
/Contents 20 0 R
/Resources 21 0 R
/UserUnit 1.388889
/Annots [23 0 R 25 0 R 28 0 R 30 0 R 32 0 R]
/Annots [28 0 R 30 0 R 33 0 R 35 0 R 37 0 R]
>>
endobj
16 0 obj
21 0 obj
<<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/ExtGState <<
/Gs1 9 0 R
/Gs2 12 0 R
/Gs2 14 0 R
>>
/Font <<
/F2 10 0 R
/F1 19 0 R
/F1 24 0 R
/F3 11 0 R
/F37 20 0 R
/F42 21 0 R
>>
/XObject <<
/I1 18 0 R
/I2 26 0 R
/I3 33 0 R
/I4 34 0 R
/I5 35 0 R
/I6 36 0 R
/I7 37 0 R
/I8 38 0 R
/I9 39 0 R
>>
/ColorSpace <<
>>
>>
endobj
42 0 obj
<<
/Type /Page
/Parent 1 0 R
/MediaBox [0 0 595.280029 841.890015]
/Contents 40 0 R
/Resources 41 0 R
/UserUnit 1.388889
>>
endobj
41 0 obj
<<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/ExtGState <<
/Gs1 9 0 R
/F37 25 0 R
/F42 26 0 R
>>
/XObject <<
/I3 23 0 R
/I4 31 0 R
/I5 38 0 R
/I6 39 0 R
/I7 40 0 R
/I8 41 0 R
/I9 42 0 R
/I10 43 0 R
>>
/Font <<
/F2 10 0 R
>>
/ColorSpace <<
>>
>>
@@ -192,10 +193,10 @@ endobj
(react-pdf)
endobj
55 0 obj
(D:20260505110445Z)
(D:20260519193319Z)
endobj
56 0 obj
(chromium-4903-0-doc-export-override-content)
(chromium-2538-0-doc-export-override-content)
endobj
52 0 obj
<<
@@ -205,7 +206,7 @@ endobj
/Title 56 0 R
>>
endobj
19 0 obj
24 0 obj
<<
/Type /Font
/BaseFont /Helvetica
@@ -216,7 +217,7 @@ endobj
58 0 obj
<<
/Type /FontDescriptor
/FontName /HRJUFI+Inter18pt-Regular
/FontName /ICGQIN+Inter18pt-Regular
/Flags 4
/FontBBox [-742.1875 -323.242187 2579.589844 1109.375]
/ItalicAngle 0
@@ -232,7 +233,7 @@ endobj
<<
/Type /Font
/Subtype /CIDFontType2
/BaseFont /HRJUFI+Inter18pt-Regular
/BaseFont /ICGQIN+Inter18pt-Regular
/CIDSystemInfo <<
/Registry (Adobe)
/Ordering (Identity)
@@ -247,7 +248,7 @@ endobj
<<
/Type /Font
/Subtype /Type0
/BaseFont /HRJUFI+Inter18pt-Regular
/BaseFont /ICGQIN+Inter18pt-Regular
/Encoding /Identity-H
/DescendantFonts [59 0 R]
/ToUnicode 60 0 R
@@ -256,7 +257,7 @@ endobj
62 0 obj
<<
/Type /FontDescriptor
/FontName /XKLDZR+Inter18pt-Bold
/FontName /COFOOE+Inter18pt-Bold
/Flags 4
/FontBBox [-790.527344 -334.472656 2580.566406 1114.746094]
/ItalicAngle 0
@@ -272,7 +273,7 @@ endobj
<<
/Type /Font
/Subtype /CIDFontType2
/BaseFont /XKLDZR+Inter18pt-Bold
/BaseFont /COFOOE+Inter18pt-Bold
/CIDSystemInfo <<
/Registry (Adobe)
/Ordering (Identity)
@@ -287,7 +288,7 @@ endobj
<<
/Type /Font
/Subtype /Type0
/BaseFont /XKLDZR+Inter18pt-Bold
/BaseFont /COFOOE+Inter18pt-Bold
/Encoding /Identity-H
/DescendantFonts [63 0 R]
/ToUnicode 64 0 R
@@ -296,7 +297,7 @@ endobj
66 0 obj
<<
/Type /FontDescriptor
/FontName /QHBJWW+Inter18pt-Italic
/FontName /SIECWW+Inter18pt-Italic
/Flags 68
/FontBBox [-747.558594 -323.242187 2595.703125 1109.375]
/ItalicAngle -9.398804
@@ -312,7 +313,7 @@ endobj
<<
/Type /Font
/Subtype /CIDFontType2
/BaseFont /QHBJWW+Inter18pt-Italic
/BaseFont /SIECWW+Inter18pt-Italic
/CIDSystemInfo <<
/Registry (Adobe)
/Ordering (Identity)
@@ -323,11 +324,11 @@ endobj
/CIDToGIDMap /Identity
>>
endobj
13 0 obj
15 0 obj
<<
/Type /Font
/Subtype /Type0
/BaseFont /QHBJWW+Inter18pt-Italic
/BaseFont /SIECWW+Inter18pt-Italic
/Encoding /Identity-H
/DescendantFonts [67 0 R]
/ToUnicode 68 0 R
@@ -336,7 +337,7 @@ endobj
70 0 obj
<<
/Type /FontDescriptor
/FontName /NBHLIK+GeistMono-Regular
/FontName /XUXSGJ+GeistMono-Regular
/Flags 5
/FontBBox [-1738 -247 654 1012]
/ItalicAngle 0
@@ -352,22 +353,22 @@ endobj
<<
/Type /Font
/Subtype /CIDFontType2
/BaseFont /NBHLIK+GeistMono-Regular
/BaseFont /XUXSGJ+GeistMono-Regular
/CIDSystemInfo <<
/Registry (Adobe)
/Ordering (Identity)
/Supplement 0
>>
/FontDescriptor 70 0 R
/W [0 [500 600 600 600 600 600]]
/W [0 [500 600 600 600 600 600 600 600 600 600 600 600]]
/CIDToGIDMap /Identity
>>
endobj
14 0 obj
19 0 obj
<<
/Type /Font
/Subtype /Type0
/BaseFont /NBHLIK+GeistMono-Regular
/BaseFont /XUXSGJ+GeistMono-Regular
/Encoding /Identity-H
/DescendantFonts [71 0 R]
/ToUnicode 72 0 R
@@ -376,7 +377,7 @@ endobj
74 0 obj
<<
/Type /FontDescriptor
/FontName /VMRKYJ+Inter18pt-BoldItalic
/FontName /GRLMEW+Inter18pt-BoldItalic
/Flags 68
/FontBBox [-795.898437 -334.472656 2596.191406 1114.746094]
/ItalicAngle -9.398804
@@ -392,7 +393,7 @@ endobj
<<
/Type /Font
/Subtype /CIDFontType2
/BaseFont /VMRKYJ+Inter18pt-BoldItalic
/BaseFont /GRLMEW+Inter18pt-BoldItalic
/CIDSystemInfo <<
/Registry (Adobe)
/Ordering (Identity)
@@ -403,17 +404,17 @@ endobj
/CIDToGIDMap /Identity
>>
endobj
20 0 obj
25 0 obj
<<
/Type /Font
/Subtype /Type0
/BaseFont /VMRKYJ+Inter18pt-BoldItalic
/BaseFont /GRLMEW+Inter18pt-BoldItalic
/Encoding /Identity-H
/DescendantFonts [75 0 R]
/ToUnicode 76 0 R
>>
endobj
21 0 obj
26 0 obj
<<
/Type /Font
/BaseFont /Helvetica-Bold
@@ -449,7 +450,7 @@ endobj
endobj
47 0 obj
<<
/Dest [17 0 R /XYZ 595.280029 828.640015 0]
/Dest [22 0 R /XYZ 595.280029 828.640015 0]
/Parent 4 0 R
/Title (Hello Title Toggle)
/Prev 46 0 R
@@ -458,7 +459,7 @@ endobj
endobj
48 0 obj
<<
/Dest [17 0 R /XYZ 595.280029 833.640015 0]
/Dest [22 0 R /XYZ 595.280029 833.640015 0]
/Parent 4 0 R
/Title (Hello title 4)
/Prev 47 0 R
@@ -467,7 +468,7 @@ endobj
endobj
49 0 obj
<<
/Dest [17 0 R /XYZ 595.280029 833.640015 0]
/Dest [22 0 R /XYZ 595.280029 833.640015 0]
/Parent 4 0 R
/Title (Hello title 5)
/Prev 48 0 R
@@ -476,7 +477,7 @@ endobj
endobj
50 0 obj
<<
/Dest [17 0 R /XYZ 595.280029 833.640015 0]
/Dest [22 0 R /XYZ 595.280029 833.640015 0]
/Parent 4 0 R
/Title (Hello title 6)
/Prev 49 0 R
@@ -485,7 +486,7 @@ endobj
endobj
51 0 obj
<<
/Dest [17 0 R /XYZ 595.280029 828.640015 0]
/Dest [22 0 R /XYZ 595.280029 828.640015 0]
/Parent 4 0 R
/Title (copy/pasting out of doc)
/Prev 50 0 R
@@ -512,7 +513,7 @@ endobj
<<
/Type /Pages
/Count 3
/Kids [8 0 R 17 0 R 42 0 R]
/Kids [8 0 R 18 0 R 22 0 R]
>>
endobj
2 0 obj
@@ -626,27 +627,34 @@ endstream
endobj
69 0 obj
<<
/Length 2894
/Length 3564
/Filter /FlateDecode
>>
stream
xœ­W_lGŸÙ>;ÛgßÝlêîymÇñí]R;¾8Î9½ìÞÙ‰]§gǦ»ICîb;IC’¦!-)¤%ü)WBH >OH}è¬CKŠPŠ<PT ñÀ/•©ù}»wŽÝ&$|ÚßÌ÷›™ïß|³¾tñ…%ÖÈ®2™µž^ª.²ðï <¹Ó¨õ§çìs õþ?ñ4Ÿ«^¾v¹‚—±ðâ%£ÖïÁë‡..Õå¿ÆëƒSg_:ö¥0&_8}îÒå°¯5áÕyò©sµ~7–2NSOþdìO[Ç[òÿ`-ò‡$ýËöý5h÷½ùçÒuùMbR¸ÖþÛÝ?b÷£ÜÇ¿€ôC¶ñOÃ3À.±wx3?Ïoûhè·²Ó¬ «ô³9ö:Æ®C9þ÷.~eV–ncÿ6ÆVÏH¬þ]êZ½³z†u†?éé6Éêí†9·k³ncÖíÚ<¿<Ëscõ ¾mõ»õ¾t›;Òïø^6u“ýfÖõ9¿î þn„EØÂŸ5Øï06–M©l€:…è¤b+ƒ‘>­³Amª ’Æ¥QÍRSƒ¡¨ý^Û­Ö[Ñ[·´SÙ&ŒÅì÷XaíGcïÂ)¬è÷ðk3®(\s©¿Xôû©3ÂÂVôt ý<r R¸¶0WÐ_!ú¤T”viýÊUm¸ÉW_Êë¾ÄŠ7ÔE‹ˆÃàêþKÙÀ¤6PØ“O1‰séi&Iü¸ÄŸb¬ASÐ䘪u¤;b©Xo*–äß¾ûcnÝýÃ÷äwþ59(ÏRnŒ¯Þ‘¶J]Lg{ #LUYR¯2U&˼Ê8fŠÂª"¿âì‘Îd¼µ9º©±é\ohL¦Õî¾¾á]¹ÜÐ`²£¡¯ÏìÖñäÐ`nw‡¦ñÑÉóùüùIï…V7:1tððáƒCSQ·õ¥hñå¹¹+¥ãž6¼çÙgžy6Ÿ×Ü39…N]ЩZe
÷ÔP¹$±ªêkå¬#ѪÇtèÑÂ[´z$qMÛ6˜ÞUS‡[ÏåóçÖÞ33ôóWŠÅ+ós/ˤ=ðËQ Cœ}[æ’ÌŸœñ²[h‡6¬Ê¡ÂîiU‘$iX:¤O‰u0\§m]|Ɉt QœÅ͸Ó·¤‡bC5õcf,T=67-%Ží˜ÍÍKmÇsù£#wßäc“ÓÓ“wEq,Ãgè›⨨\U8òL‚Ë^aª*W±;âHþ[‹ãcê[: È•4O×ã¸mwB¿õmËJð&is/ª]y–çJ‹{72ñÄÞýÉüèôÓ=§«¶·+â6îÏŽäÌéÙ}<ºsfP{|¤»§£+ÑÔ¼}_ºttÇtVÈe»û»£›·ç­NOX£áïˆtÅØ±Ð›"¹åWUŽŒFZKü§i¬Òå‡ùœQŽ65Fè0È,ÆcX˜êŽ™ÃCÃC‰¡„¿ÿÖ[sï¿_ºþž›¼reòîoLB¥;lPrÙ8žQ<sxÊx³ ÁæÝ’g(4Í3SB;|Ä»tÑïUNËó®z«aÙY0Oè©”`ž`ŽY\NÅÎn £r2#$ËL™©Œ-cñ†O0ÛíŽQ©Ø¾wl¿Wv„äÌ]6DÔpª‹B)_^Aò`‘ZÚš¢Ñ•æ··€¦½ÒÎÛ!3+»KÞJ’KÁ†Š%ä´H8.í'’ŽS#èÆ¢!n•…Òwd¥ŸovJ %¡•Ü”{½Ù£.Èú²kˆrC°Å¡Ï3ü ú1Tëb'ÉwóVÙ5àåª!šÊn#Éšåå*z…O‡·DÔYlŠÈ)ôq¦ºuMUo¶²bÜTÙ Ï[¬¢¨§=¯fg,ÂÓö2Bµ h ôVaSƒSvEƒi‹ˆi#˜-p7<a,ú 'lƒ„d®ªOo¡VJ BHAèËÆ2öòwª½ðÐŒ[)ëÕYÏ5½”gˆÂa2üRS%#,Ñè¤WP¯GÐ5mébÚU!8)ø Ñh¤m3ÌRØ ƒV…ŠG”J1жÉZilfNÉH­%Î&kc"EÃUx*80½b”–Í*5p6Ó) ÂСd]K„Ö¬Ã-6?`ºèÁ,¦ß3mý¤f+0èÆf| ”°‹n¦¼$q‹åKRI,V‹Ñjj¢Å™¤!ÑJ½YôZƒxŰPkà>XÀÎ"æTŒåŠ!bp[F´YSs®¯,½±yɼœíÖÔŒ;u8ÔSoÆã–ÏÚœy×oks¯Ú"–¦#‡Ô²ýzµâ%x±{Ëø4€û`¯½ŒcÛÖ”‰iu¬‡rš‚“L#,™€þݬ„Ðg¬Ý„¿Áö­ FÑJXÌgRiÎm¦m”D3Òo³‰”³ÊÏ:;9Š_;³m<‡ŒWýx$-^KëÝpW6&ÒÑaùœÚNø›ÚG,_¦v‹å+Ôê–¯R»Õò5jµüj»,?Bíc–ßHmÚ2ëþZž6¬àÇè´d„µN˜\>
3ë„}k‹¡Ð°˜hI?ÐNõvh*Ù¹Þ¾ì3 W7ì£Ö„}ÔöÀ>j{aµ}°Úm°Ú~ØGívØGíì£6kù awXض³b èñЇ0K9»Ó;ÒbÎãã8
Æ¢iVGL*ìeèdý`=Ä~³V¢Œø*O”\E²rh{ÄÙeÃæÃX-ä”>½'Ží}u¡q–üiðõ]ÜgŽø»x‚lÍÁ0àþúã°TG2b·•íÈgÄÈ¢"±@߃±d¯‘5&¨$Àµ——'Ì Ôª.n¤Îqxxµ+):@SPN{še¶Øä¤—–³¦aä—±æÞ4#®'4Ó®³ Q¡šR˜qo(†jè7”>ugS¥mBÑ6ƒæxEhÎ'k…ª]x+)NeI‰KbÅ©êÀªtŸœS…j¨ÿæ8blb‡qº±šœ`¬wŸM̰¦j("†Š„S?µ*V$%zI ïZ%½·!_÷…Qµ¯æ 37­‰DS 7'hSŠâ¾51¡§s³F:i_4H¯Z(„Ö‹ÞÁõß.aï—íµh™”òO¬ÓÄ©‡«B8Ÿ4¹âêG–¼8.:·¬ãN5ò^ÖßÉã8·û7Hgõò©}ß¹›áXb4ý° ‹–Ø›^†n”c0êT4+vbF)0™ò³/ô|hvh:%¨‰ã“ÅÉ ×·ü&Ü5õ)ÿcJOü¿²˜l¢:7QªÖåKÊ«é9<š®{åz{Ó)³æ—š5k.8$Âc¯œðö¬Èá”O>`|
Ëñx»Ø ü¤%ö ™&/–àncoÝ[‡,Jh1 ø”µÂØ8@˜±Vx02 ŒÀq̇ÀgˆCàiëäñŽ
ÇŽz†x:F¼}x:N{*´'*íIàíI`8‰C`‰8N‡À©@¯"Ðé@/BÏz:èEès^„Îz:èEè| ¡çàãüZ/=Q|>„û/’ÓƒžÞçq×Ö8—BHœ¯q^Ää±µU¿ô‚—CH3^
!Ñ¿ˆuj„/…WBH„—ÁÝ·¶Þ+A/ 9„D¿3k„¯†_ !¾îkë½ôú7BHôo†è×0³FøV‰°B"¼f­l
¾l…¦¯(’\Â?M(ƒž‘%!÷”/×/ë̿ťê
xœ­WolWroÿ‘”)‰”HQ6y©Õ[\Ò²$R´L9ô’”lÉR(YNv\‘–d;®³'u\'MsÍ5ÕáŒâp(P\Ц÷!(rîQnR]PŒ0Š~hÞ!@Ñ= Eq@Q#Ò\¤þf—”¥œ•¶@%ì¾y3óÞÌüfÞ¼åí[¯®0{‹É,pe¥ºÌÜ¿÷𤯀QŸÿ-žžk_[jÌÿO×õêðÒ—^»­×ç#x½ãÖJCþ¼>½|íõKî\ú+×oßqçMûðÊ\ºqùz}>ÏX‹ŸqZzéÇÿþ s±5û¬UþIÿéÐý«3ÿþ?þ<½é“îËŸcª1É5Ƙüo+öÏÓ_ü¤?c;ÿZð °ÛìcÞÂ_æë|]º-½/ýT.ÉåoÈëŽÝÈì
k®Ùûx÷á“ìHÿ÷6þK¬$=‚?mŒm^•>ÝüLêÚü|ó*ëtÿ¥O¥G$kŒ;Ö<ª¯z„Uêë,ügY–ë›ïñþÍï4æÒ#ž—þšcÓëì/çíç÷Ë‚ÿÐ˼léFOÆT6@“œJ±”!oŸÖéQ›ê¬YiBÓLå€ê°üÖÚúúj9¦²=à­±ÜÖ?ñ~PX¡ÖÃß³Eî]›æË…ÚAš¯{™Ë`…r´ÖO¬O¼o1®äÞ]Zhè/ç?-¤í ²OU[Öùæ;BùVMb…ê²Æ
äahó*ÿsYÇ"Èõ)Ybòe&q.½À$‰/* øs(.MU &U-cÁÞX06Äwã{ÜÜøÉïÉÿbjHž§Z™Øü\Ú/u±(;–Ë0IVeI}‹©Š¬*o2YæUÆùø Sùãl–³½¡@‹Ïâ<êñuÄÕî¾¾ÔH:=<ÔñôõÝZ8Ô1<”h›z9›}yªüjÀöOŸ:sæÔð´ß¼î/¼±°p¯¸XÖRG_zñÅ—²YÍ¾Š”³1øÔŸZáU"7ðÄ •K«*®Ág‘p ŒÂVÞªíô£#Ò´þ¡tj¤î7O]Ïf¯Ÿª¿çæè!ÎÞ+î]x£P"/è. pD!ví#™K2?=-B%;×oX•Ã…ÑU$)%ÍF§Åaˆ"Œ˜Û¼mˆŸ.ÉH³H{3D!2BFPó틇#u÷ƒFÐu=¸0#…/ŒŽÏ ,ŒeÇÏJm‹éTú|fãû||jffjã/(%`æ…¿q'ŠÊU…£Î$@ö&SU¹
ëÈ#á·•ÇÏD÷EÂ>j%ÎãvPê€[_RšäÍ“¬Fº$B–§‹ËGÛ;ùì±Ù±™z®T­òˆ×öHe²'çÏõŒ.ú熴#™îžHW¸©åÐñxñüᙤ6Nvìö7Êš‡ó=nÏÞ^é> ² .šÏ ¸åwTŽŠFYKðÓ4VñÀù¦_!ϰÙr.ÌÕh“ÏK‡AfAô"ÂXw*h¤†SÃáá° ‡ùÝßÿÁ~üãâýoóôÔ½{SurŠš4KÓ>`ÚÍìßÝô7÷ë­^EæQó§‘øÈN¦
æ¶¹‚y¹ì.Ý‹ÔKUd`|Æ£JTEŠ&9™¨oÓóD=Ïx¸ªîÐ%tb;t•*hª®YOoôi:™:Ôw"=gF¢'ѵ_g{Ðßĺy7!qÏÒè¨S…ž~§,Ãt®‡ÃšÑÝ×ﯔG£²ø—¡Rrî…µñ££ÇýåÖ›ç*WîÀ~sØ^<27÷½ôÀ°¿çD¼0ì)XG’žé ¯¬üC[Ë”Ôs¨pjÞJêM‡b½‡ÜKì$/ÿÄés‡s&cÔÖG£“e§ÑÉ‹*GöŸCWbŠGA‚f§ù"ñöT,¬â)ñõ“¸Û®ÍÎþÍì¬[cYl¾·J3+¹(îƒ1ŽöyøŒÌP_Q+J©€o7aFEuÑÚÌšƒm±`Ðã‹ÆQPTVÀ'8œýé'•£G&>\àŸL e¿¸¿@öeôïÏPOŸ¢¯EØöZÎ×õL{"KÔ[8 =œ:Ä:S0zl+çar½è¥Â§ñÜæÚ÷vrÖy`ïŽÐî-REÚ)Áítäûe´É™›ÙìÍ™ÙÙìÇ{ÿ¹?=õüûSσœûàÖ+œ?ÿÁ+·>8Ço-Oð?ŒwãÂw¿¾2±q1¾¹Éo.ó«üR?óƨ»ùj yx[¤â”ƒÇx]ewÆ •ŸR³ˆ+Œ§8‚y2ÍpàÜä'e¤–íã{wï:¹ü ¶®`Y©˜ ‚d‹PIÍé(µß-^¦Á+çö8_LZ0¨ø:ã‘Qä.ìù¯Ãé;Ͼ÷ÞÝk’‰ÏÙd³ <cxð”ð_V,]Ÿgë¼Çõç3ÁL]°³v±¬ëøi™›Ú™s¶‰ŠƒåÊ%}õ¬-¤ÞªûY²d\ŒÆb‚•Ë…5Ä•¯X ÁM¡W.%„d1#²©/?CafåE{^¯T¬šÊ[µ^9/¤üÂùê²PJwÖp¹`#îZK˜[ûu†µÖÎÛ!3+Ù+åµ.9SÈqÎÛdOtäóu…¨¾¬‹‡%¡ô[;È›óÅ¥¢ÐŠvLȽåùó6”£«¶.J%°rТ2å²^sµáÑA°ê3] ’|4lh¬VuÑT²+àè$k"*MTº­ AE–ðç—›·æ8]DuMW×l‰4ÖUv±\^®â£/^.×#(ëËˆÇ°Ê ¡š:<Pz«ˆÉ“/ÙÂcXÂkXÈTBsàúrÍsÑÒIHáF]÷é-ÔJqI¨1óúª¾
[µAµÍÙ•R´:_¶r¬¬‹Ü²(áRw%!<¦ðåãkh,ê^L Ë@¹VUH/ ¾G„g !|¦NÞ¶ ,…]Ôi‘«”I¥Rp¼m2×|-,_´b[…³ÇÜYH~w y„^Ñ‹«F•’ê€Í¢”¡GádÃK¤Ö¨\Í»,=XÅ¢OBÛ¾¨ÅtzÐŒ EX‰±òЏլIRQ,W 0¡ªë¢5?E€@†D€fó˜œ|±QÀEK°,‚ùоZÑE°%D›9½`×”åB¹G4¯w¢Ýœž³§Ï¸Ìh üv‡2k¬-Ö®µµå¯Z"§#‡Ò²j­ô
à%xr!÷–ðÓð!^k†ÙÀ@ÌÀ²uå´'™8eD2 ÿ'ÁÝ™¬]RXc¬Ý^yÁޝ¡Ù9Ù
›¬Æ¤â‚-Ú K/Š”_³’³ôÊŸv¢—Y;³,‹AÆ«µ7.¾v®ÄŽ'DĬq;7{ÍšLã>³¦Ð5k*ûÍšFã3fÍCc—YóÒxÀ¬ùhŒ›F¡U€´¡'¿@§%!ÌmÂŽ-áMW˜Ø&ìÛÞr…ºÉDk|×8ÔGn¨çöøbˆO‡_݈FñÑØƒøhìE|4ö!>ûˆÆ¤©g‚=lÂlgEGÓ㕼“RÂ$Õì )ÇÅaœÇ#8
“ú.Ù4ªƒûWjD)ú¡FŠk-Z*N¨©<\´Ñ)Êámðì¦3bê)ÇóvsuŠ¿lÇö©¾Ÿuü‰óë¼pÜÈÔFx˜bMðtÿqXª™„5“‘lBdþ'UöÔ"E¬£WOê“Ôí©ÕÕIc=įŇ®‹)Ãy8„Çл:Dj
Úi¯£Vó3KìÉÇWV“†®gW±ç±jzÒÝOh†ÕÐÖE…zJnÎ~ èª} ô©ûÊuÚ&4mÃYaLT„–ÿòq­P·so%%_YFQâR…XÉW£ +Ôé¾¼¦
×Ðÿ 䨀… º±šòŽì÷#†ÛS54$CEÁ©¿´+v$'zÉ ïz'}b m`¡ƒ«öÕ±0²€i|K$šù„1IF)‹Ç· ¤`\¤[°“z:y_gêäW=BëÅìÔöo7‰O«öz¶ *ùg·y’o¤«B8_¹‘âúG’Pœ‘¼]ŠâNÕ³ådm‡pnOìÎGK;¤ÖS×~ÕŠ¼)Æâ_e°`ŠcñUøF5† vUEB“b+ŠNÈTŸ}.òU| YnèT ŽO'Ïݬ5á®i,ù?–ôäÿWSLÔDzZÕ¶z‰•ë~N¢Å¨œÄìX<fÔq©G³Á)@v=¾FpÂÛ“"S>µ ÛñP»G1ÌŠEÀ­Oàâm 5kRA‹Ï™kŒM€(àDÌ™kÜá̃p8gHgÄéq–tˆxžtˆxÁ|€^˜eƒâU6p—w”Ë;Ozœ¨IÏ¡.žCý
é9Ô"Ù,‚¨M"ªd“ˆ‹d“ˆ%Ò9 b™tˆX!".¿
 ®8~õ’ãQW¿ˆúUÇ/¢®9~uÝñ‹¨—¿ˆú0În%ð†397]òÈ[º3³0{wm]ç¶K’ΫŽ¯ë¼†Åã[»þš3sVÜqIZñºK’ú]ìSWøu—$…{.I
o@÷øÖ~o:3Gý7\’ÔßrIRÿM¬¬+¼í’¤ðu—$…ß‚î³[û½ãÌõo¸$©ÿ¶K’ú»XYWø—$…U—$…ošk{œ/[¡E×I.âGÚ`ÙŠ ïŠ{Jw—uâ¿o¶Çc
endstream
endobj
72 0 obj
<<
/Length 245
/Length 273
/Filter /FlateDecode
>>
stream
xœ]Á †ï<…í¡¢I»îEšºKݦe{&CZrÈÛLÖI³„¥Ïöocók÷ÜY¿'{Œ U‰0àh,«jPFÆÈËIxÆ“¸_çˆSgµƒ¦aü=¥çVØ=)7à>Ç^ƒÂ`ì»ÏkO~ñþެmA¡Nín¿ˆ “ôЩ”7q=$Õ_ÅÇêjâª|I:…³ƒ°#²æ˜¬mt²–¡UÿÒ—"´üá·˜<A•ár*Pè',pÎð¸•=œiÚÖ7ÏÍ7ºï$—Ò:tHÚ#o`,ÞoíÏ*z?Çž}=
xœ]‘Ï Æïy
»C•&éÚUŠ"MÝ%‡ýѲ=“!-€9äí†uÒ@úÙþ,û£¼öO½VÊ7gø€¤ÒÂábVÇFœ”.ª„â>½|f¶(ƒxØs¯¥¶-Ê÷^¼Û`÷(̈w1öê:¥'Ø}^Š «µß8£öp(ºÊÐî™Ù6#”$Ý÷"ä•ßöAõWñ±Y„š¸J#q#p±Œ£cz¢=„Óµ2œ®@-þ¥Ã6¤%ÿbî·š^*©IPÈ &8F8ç²{cS„:w;“¦Jð¡ .²f$iø<e\#Z~³ˆ¯Îwè_È–hˆÒxû:klTÑýwy[
endstream
endobj
73 0 obj
@@ -678,56 +686,58 @@ x
Áœj‚ ì $*G‚;XÛQ¨¬ÿÑŠÚFìøZÍ`£T€£Ÿ“&@?@aýT‚ýHòÃѨñÆÖ«Éw—ç|Ÿ‹º…F‚g‘§`Üß‹Ÿ|ÎÂï¯K¥®
endstream
endobj
40 0 obj
16 0 obj
<<
/Length 219
/Length 567
/Filter /FlateDecode
>>
stream
}QÉ
1 ½ç+òvñ .èm¤àA<7pðûmgêX—±¯$äeá5e${£{,´!b…®€[WŒ]nL<IB)d
þ}j]űҢëÔ±(!þ‡>ºßÂöÀA­ˆðGXã²yÉx(½úZcØEÛ˜²{Ü*ûÄÇªØ „nÚÚVöâ˜E¿f³Éî~r»Õ|Œ®Œ’K—
Í›Îß6¶ÉÔ$eýä™D–h÷°!mÑ.ajýÈF»Fš¾ +*¾^™ÃJyoG
ÝVMoÜ ½ó+øalü!U=dÓ®ÔC¥t-õåÐÐm­”þýŽmXc>l6q.Ë2~˜Þ¼1p
X.8þU9gU À%U-yÑ…÷/pšÉî‡×XÜŽ’‰Ó Íî(èý- ¢Ã["…d¢õ€<yÈÒ³²GdÆG¾€,=+Ü„ªi£p ºÌʵ1my ?é3…`EÞS(ŠÜ°"Àò'å`Í»€udêK¯¾-z¸l®¯êðcwI·{½(öÛïDпdOnnññw¯wh-Êûèg„ò´ ¨U4f!)!Läý\ÁÈž‘Þ…€’eo@¹ŠœÍ†ûüœ—@Þ¢Ñalk‘d,·í¾FdܳÜV­¨MéûY‡°óõ`Ó4ÑAÔ Ä—’—§* 7m0%ªÉªK,ó§7ýKçNŠŽxüØn’£1sÐ$žP³‘5'“›_¡¬š'31>×Ö]ÅŒm'7^w¿_ä‚AÑÖ4ꨧ9ªçîžÃ‡{Î8CàuÙXN­®=9ÎC?äæ ŠU`Ͱ"¿ ±XKÝVºEð ëÝg
·´ùF¾4¸3K±þ¦öÒï,ν­ÎYé±asdÑÁY1 ʇM‡ n¤uQ‡¶èl󨽔«Jç㡱§–‚L¾ÇÈ–ï+Ž¥ ]>œ\œLßpß×ô uJJ=°{MÒœ$f5u1•6ÿþ#qwå㬳,
endstream
endobj
6 0 obj
<<
/Length 1393
/Length 1322
/Filter /FlateDecode
>>
stream
xœíËnÜ6ð®¯à,Ãá›@àCÒ6@Rè!È!‘í¦€6@kÀýýÎ II+q³*°©µeJ³Ãáh8œ)
¯à-Z1)NôûîÏr€0ŽþKGE*¡¥.Ø  }ƾúáæþþæ×woD×)¦¸ë¿v¯ÞÝøýG6dxs5ã:ëºBÎ?iZ\Ýv^+DbÓØLi›Ãæ/Dô2B™´ .ðÍQ:g} Œ‰B}W?w?^¡xUç¤Õ&ꈿP´÷,{½ŠrA6T¦¡+] UIe ˜ M
’W!Z¡äççϦQ#´=©QÈJÜ%©C0Ö²Ê<)T‡ ªO…øsS•4.Éi]؆*UËìê'|w»3âyµÔ·µd<¹Q
a‹–\Xk)¶”d¤WPñU¤…ÚÊ˨¢V†4êœøëfeœÑü¡„èRÉoƒr1j²Ö4ý4»y nQøï¼<gZ!Tnöüå2ÕŽ‰bÓ‚UêëöªMÚÛ°j $[€y´Õ5g‰A ×Û§ sÔhXîäó…±ïðíZ ù1ÝzB`,Ês~ïq$wñcºõÌqà{m}÷¥ûM|KA"`À%ãgMN vLtq³°hI¨T­HV´}Áâ4äÇ}G¨u2@
. “¡€ÉÔa|Fì¢E™èÜw4‚Á¡£ fúq¡˜]¼ª8b3dX—aUHfG¢ð+¸Ÿæ6 žøÝöYŠÌŽÁ<™à ;yË 6êêË>S.aáÛ Õ29C6ðº8?Ùï-uh鹫
Iï|¡Ô9î5@Óob»C³ˆh9æ€ÓâI9ÅÔ°# ¢M)/v.Ñ»½Ã%¥Û è6tëL$ór„º‡ÑD_|ñ¾8â÷süŒúÅ]ÑdÛ7*ºfžk¹«Ã„M)ÆgœÏ#Ö,sDu–Q Ë…ùžb Ox¡å³ïÌH³†–O¢Î¼‡Z>ç4j-Ÿ5”Íe>F¹e6³|{I%2mÙÆí†Ï ˜Ë·¿t^üÝ]v>"ëë¢ÿ©¶¤Šü_˜‘ä=#·sɰaÛ]
gÛr»¦z' Xë¶”ÍÆ˜gïfÆù…›=ýÌ4¥pJDÆ è9³áª#ˆ9>ÞbâË`R‚邊„£
!h/Lð¸ï¬Ò´œÃ™Îc­´s쬧¹sà…LåNk¯Iˆ¤E¢q>f:ëˆ5µ¸d~ÖPŽæ·hÇ5½Y›¥! HÈ8’šèÊLtPyv¸öLg¸°Òñæ³6ìê’lí‰Ü}¤xÆ÷Jëb¢“°MéØ„çŸŽ­Z¦ããqâaç
@øv%•Iêôq ìÌx>˜ä dw€XêÉt!ÀI0>@‹ÌOíþ,[L á¨õ´,Hoɦ‚ôQ  ÞFÛ ÿç&Ô®ÅpÄà¶ZÝR«<ñ8ë·ä’Gá%í.^:ÜÈš“Ÿ¯Ðxæ„<—>;ˆš—ñ¿ §q¤ßè éÉäã;9cÌLZ—¾íÄÁóßÃ:³Ì enû7hR£þuåde‰9õ»ŸpfÅ$£N#h³[‡Whùì«àCus\—`õ-?z¬S)bùªé[íV-¬Z)À}”½=8: /³-#Ä•-i‰vº2% úó™’=¶g´Çmk³÷`”}îÞãù;ö±ƒV,x©@;𤂸-˜B­yÇmÁðqSe1‚k`I§–à˜sËÀý·©Ï©´ÕÁ¯¨ŽsõñãÜIžýQÀÒ3³sºþÂÒÀ.
xœíËn7ì>_¡XE”D=€À‡$mÐ
¤6ÐCC2¶“³)Rîï—¤4¯µÞ)àÔ^ÇžÕˆCQ’")j Êеº%:ecU¿í¾Õ ”CþÕi”Õ¶bgûâÍÅõŸýÅïo_©þª3BqÕí^¼½õùŠf½›f6dxu¶àº:#Î?[V]vï_BR³Ô\mžR '*Á›àÚeÎczsÒˆ>¤(˜t¢Ìuök÷Ó‰7
€¨½uÉ&z"ÑÞ‰ìãµc(Œºa*p [Ù¹c*m¼-úl “WFïâá½YÔ)ëZŠ7YÛ÷b²À†dÓQ#†æc%þÔ4%ĨÒ’¶%€o˜Ò´Ü.’}âw÷;§ ݯ•ú¶•\à0Ê1®±ÆÛVJ-#9 ŒøÑl…qLÐÉ$k[Qý}qË9S¸ñGRHeƒS²ì­y~tHò—$üw^OÁ3¯·Dþî23Ū©ÏÛ«6[oŪeÐâîÑ&VljII‹Ö;ä:Zr,<¨c¹£¶½Ýª¡tó­gå‚¡öË{O3eHºùÖ ÇAîcë»/ÝêëR
.;¿Xri`¦£Œ[„%O"£Zò’ï žÔ$PºëŽQ€'T\$&C³§%e³KždâW0pÝñ ‡ŽgXè§iŒvfÄ1›¡€ÌºNv,м‚ëY·ì$)
; Á ò–?@Ý=Ø©ÇXæ”ð‰pM çÔ.¸ÐûÀËüì¿—<`u¡±PÈ: •Ò–¼ÏÔ͸IQ[ŽÍ"¢<´NG<ž¶† [µÁÌïHKÊ·¡ðmè]b÷BÆ&;0‡ÉEŸcñŽXœðÛ%~Aý®ä²ípÍ:8“°¹ÏµÂé ásNé ïç‰j–ƒ:~Gî‡Ú/ï½à€,æèϦJ´@Üý(ik9ûÆãþ‡¾+—kLk³µ‹Œlë}lȲ¿€zóWµÑ^á)ÄSrÎÀ‹Eñ¤›o=#è7Ô~ùcdh9¡âkK²ÞL³X1»J1¤Ã«»¡±µ…--³œÑ¶¼.¢å0A»}ß¹‰æ6´Û3uá=LÐn¿¤1· Ý~4ÊRæ}”k´YóëS>-ñé}:¹ÓNºsúú·.¨ºÓîýb}^í?3øpö2Š–ÏÒî+¯° +¾ÀÔ3”oeàf2
¨xkNPqElwÆÅœvÂìø‹Àh¹šã|GÙ”*?)rhÕ ¤r¯ÁS TÀl”ÐE“ÇÅb´A¹
pÝyc 襜º@eó%X©¹A*Uuh˜u°,D¶ªÉL¸
Gf-s½÷JøyÇ嚼Ţ”£üfë|‘†*¡àXj¦«šØhŠv´ö#ÎÑ;…ÎI9Ùæ*³ÕŸ]i\iBhkÝå”q{ÎQô^í1eþ(ºª2#{òy"øÝíxžxX]ß.¹µqÙþ2Ìù¬mrK8@ªG‹|Bõ¢"äé¼ñq¥ßßË×àa¯÷´<(¬ÙMÙ½‚O¾™n¸P¸Aøƒ»P»  Êd¥5µÊqçÙkö’G%íÿ¿ ³;øŸLrž%áëÒ—"ýŸé4Môëb!º£ÙŸýäsf¶¤ô]ë'øϰ|ý ̯ç*
endstream
endobj
15 0 obj
20 0 obj
<<
/Length 5410
/Length 5364
/Filter /FlateDecode
>>
stream
xœí][㸱~ï_á?Ð
XôC²'Áž‡ Af439Ÿ`³ÀÉßIQÅ;eÙÛÝ[Û뱫,Ūdeûäÿž±þG2<H…/Óõég÷‡íøBGó¿~ãGý—|ãgïoy]È@Ü»›ãÏÚß}ÿåÿÿwúò—?ýþ2ýò„ì¿Lÿ÷ô»?ý‚/ÿøEŸõãzfâ"ÿÁ³ê½õA[þ#¹`rùðõéoß!„´1ý ú}¡ú%þ¬ÿõ3žŸ¹H>(̧s:(2
‰­B¼è«Ã82.…ÕÈ— úûåÃ?ý×}©ËÅ9 Á± Z².ûÙºmûó}„…¢”Êùè7éCrº%F„ÕH[|HG6`ɹào؇_îáC.°cʇȰŽâWçµ1Ù;:EW9€,ÔÓ“D—ëÓÈÑ@¤v§2ò·@.I“¬ÆºvÕ·XUWLæZ–ó×—ñ‹É]ó7÷ìÿ;=ýÏÓ_/›“ƒ J2Š© #Szøèñ0¨‘(†±àL QJ=) Ò<ÓMoÃ6Ûɸ\43×ò¯/O_½8âå2òPÙ´Rÿ…èámÈYgG7¢ùY+ž—%ʾ‰¬nµü¾|ÿOûcг¤G ì-—µ¡Îï7‘ŒÞȸyØÅ˜¹ŽÌSŸ}07Ý™ã¿îõfjÌ-­“RH…|õǦ  Qr£ûÝ̲a÷ãc9vóß³™¢ÌbCø2jù[ —¤É?–`cÿ[¬ª+&s-ËùëËøÅä®ù›{öÿ¯.6ÛªbW³´ìÖj y)BÂ-M6Âs#ëU[W®Ën’Ì8Ù¥véß¹HÌ è7ÓùÏz­Î+9‘p2pfñ齌ûåYZÂW6°œPpÐÞ½äkòRoq²‡Ž?ü¤Ñ¡rÿ?qiSýô‡??‘Ë¿Ÿ~zúÛßõu~¶pØ·u=mŒxÞìl*”QÕÓayb-¬Õô!/áÔŸ #U±±DDvÈž-Bú°)òA›»öÌÈ ôPô*|žND,íœãè~ðì}åá&kÄ;£Œ— Ýu­½'àÖf®ÅÕÍo¥Ö²°¡L„ò}n[n%k[ÿÊñ_—¾h0öæD÷‹¡_g»Öö 'Äh²Ö ¥ÆŒ #‚©åÖÔÏ­ÍÆÕW·™…ݳ®ô0u[,››(rm”ß¿š£"WŒ²—‹ˆ”1»—f÷àÌ.›{_š"Õì¸ j¤Xûö»ÄIõã“~LÞëÏ›ol•»øÇìç¡Ánnºý<ÓÒËEº9·Çgœ‡YÒi¦1»<þ¶^hÙ­Ïnùa¯vtÛtCœ”nï ½¯t{é[¤ª+v™ÊfgSñŒª®xãéö⌟ âÉŒ)‘û¥Û7…ÿA›»úÞ\_Æ/윲@E¯ÂçéDÄòØÎ9ŽîÏÞW¹tÛ7âÑÆ„Kõ¯5²wN·= K·ë`C™åûܶ›ÓíBü×¥/Œ™ø†Òí_cÛÜ‹*0R6ã´÷LÜ-cüÑ¥³ú5Á.ó¤Ë}'³ùV3YŽÓ 'Ó¨`. 56Ì©æX{KÚf¯aÚ«a ÓaaöÍ— Éd®‚ Ê6ù€|ßó6>â®Jé;xÕšR?,¨i?=îvc›ÿqgÊ–êÑŤ-’¤+””ƒö8TØ<¦ùaaÿy.¶ÖON¸cÖ÷–ô«»Ý(-œgr®ÚÌPXO,œ rƒÒSŒ÷#aļII†å º0ñkLTÚ!,å\+»™Šywx©›0tHzo@/ ^‘û›‘»•Oó|íãÑÌÛ„h#Eg÷~L^1Sƒ$„ðl­ìüÇõ2Ån>tôŠ>ì´®RÂ<·Ú˜äÁ¾÷i¦j|änÑ!óT`ÿâl9ÙLÄ{oµá¢ue4ç¥q†°0;9—h;](_–þk¯ajG“NZp:Í·0K±LÊñSò3I[B…M<êå—ªG’ÍörIšüc=eżpã&Œ5R9Ö)Ëö*î•gg¿[›>}9¼àœæû·8øžÅž­kªo‘ª®˜ü°ov6ʨêŠé0À<±ÖjHzP—pi€Ï£®ßql*ÄæK!œ=ãø¦Ð?®w¾×yZqlçG÷Bç9w§3cÂ;¾ˆê[kT»÷9ëAË­_-k^9öïùç£6]öº–!7; tÍgå|ËM—
dÀ”HœüâÂ>ËÛ¯|×'‚ô¥QI˜½\&ÿXdOEY1/$FOÌ ¥ÅßAíV¸¼´ #,ø@…Âr¼60¦ËkžpQ¡¡ý ÈØ Ï/„ °çw8´Sîà-缺oëšê{¤ª+&|M…2ªºb: sO¬…½.¼&|ÚÙg6`L„%9*܆~>¾=ÓËMXx§Xîà09L+2Yg1Da•VL'Û9'h½p,{ÝÏJÓ&ç7€>ùC}> 9÷­º‚æâõ¬g]*ȹÀ9##YÜœ•^øÕÒ„®£ ÞQš‘Ó:'°n\<¦Z}µ5²7ŠÒ[ɺ`S±Üò¯¨õ–fRf_½^™¬ë‹û°ab°pfÿ;¹$Mþ±6Gc<+æo}S.Õóļ0ù]Ù¥ˆjɾ\’ÖOVè±מ4^§) Ù„‹ò í‡xÎ^x~>=¿Ã¡ro ó]3»][×Tß#U]1ùàÛìl*”QÕÓq˜ob-ìÕôá5áÓÈ>“‰Ød",ÉQáìåãÛ3½Ü„…áwKJ#ßFªºb7½EiAUWL'Û9'hÝp,zÝGdÆdâü:è#¯ 84i„œû–âAs‰õ¬g]ÚÀ¹O¿»s“F†§jBV{TºáWIúrŒ&xGiFvNëœÀºqñ˜Ê$hõõV&ŸK•‰@öSœo¾2qëË(\ª`>¾ƒ”®|vrIšücí4¢HVÌ Ûú6
—êyb^˜ü®ø)âܳP.IÛg¾Õ ¤TŒíGyè¢|CÁÏØ Ïχ °çw8´Sîà-a¾ëB·këšê{¤ª+&|M…2ªºb:óM¬…½>¼&|ÚÙÝÂY KrT8{ùøöL/7aáAøÝ’ÒÈ·‘ª®ØMoaÚ_RÕÓ‰CÆvÎ Z7™1™8¿úä+MZ'!ç¾¥xÐ\b=ëY—6pîÒïþ\ऑᩚÕ•nøUÒ„¾£ ÞQš‘Ó:'°n\<¨2Ù·új+Âò•  9o¾2që q›˜”JìÊZ_ʽž¶£ìR‘Ò/·ÕŒ¸-g_Ì á~BH–-Û\’–9‚ša)ínRhf?œ3ÖÂó3«¡r׎„óž ™ßÒ5îo (‹Ó¯íüE’в8uƒwJÁ,:»{‘·ZÀç/wyw'±íl¥#Ö6!ŒëC¸%#U]±›Â´¼¤ª+¦`-Ãóo PÌÊö±–6˜8¿åºK¨;{y2î[
ÍÅkLÏzáo—þö¯Îç ßW5¡©=*½+/Ý]«~  £¥?;_uNNݘxPU°oõÕVó÷ù³Ÿ¤¢tTo¿*p+ˆTn‘Jó«TrWTîå’4ùÇÚ¬JÒ¬˜Ö5Ì\ÚÆË,æ…ÉԹž…rIZg Žõ<AÌÇýT-ôP¾ WK  0çw7´SîÞ-A¾kƶkëšê{¤ª+&z›M…2ªºb:òM¬…½.´&\Zì.é+%9$œ¹|t{¦–›ð ônihäÚHUW즶 ±/ªêŠéÄÀb;ç­E§û€L[Lœ^‡|ñ‡&¬“psßò:h.±–õ¬I4ý¤û@pÒ¸ðTMÀjJ/ú*BWvÑî(ÁÈÎg“W7*S‘­¾ÚŠÄþØRþTT’ùû£o»"YÖ–9K`Di8 ²Ü–ÛË%iòEöT™ó‚·´¹o“r¯½euŸ.#ØóÂ2S0óû˜Œ›1¥4¢%Ox&ÛÈ~Xg¬gÜÌ^G¯í=»%¬÷\Õöm]SýŽTuÅäƒm³³©PFUWL‡a퉵WCÒÔ„OÀúŒc‹‰¨¤Fƒ3—nÏdr„Þ-ÿ =jj²?™E©}VS“§ñ¯b;çĪ„%gû0LŒÏnÀyì%ð‡:|Zî[cï[‹Ö­æhÃã>©îZãož¦C­!è„YeíïÉš0f¹¹ªgfê‹þƒêŠ]£¯·¬Lûs¦¹ú‚ #{üOÌÞ¡¾XV÷1(&˜³"xtàßÉ%iòµ™— Y1/l sùÛ&å^O^/üœ-ØóÂ:OŒrL²ß;ˆ<“k$HÙ2Ö‚³ónÌy½¶÷ì–°Þ5CÛµuMõ;RÕ¶ÍΦBU]1‡õ&ÖB^ IP>­ƒÕß…+G%5œ¹|t{&“›ð ônifèÙPS“ýÉ,Làóšš<ˆÛ9'VÝ ,8Û‡aÆ`|vç°×Àš¦N@Ë} è}kñºÕ¼­xÜåÔ}kü ƒ`Ó4`¨5½0+¯ý]yC †ÃÌ!7WõÌL}ÑL}±oôõÖ¼xÛ‚1ÌÞþm‹eá@îÇrÎ)äJÓ½\&ÿXŸ+0%æ…máBÒ%nž˜&¿+~‡ä2|}¹$-ňЀ‰ö¶¸è+ÄãH•J¸¨ÐÐ~dgì…çBÌ~‡C;åÞæGÐ "Áqé{¤ª+&|M…2ªºb: sO¬…½.¼&|ÚÙg=ØPl2–䍨3&âÛ3½Ü„…áwK8#ßFªºb7½…ù|IUWL'Û9'h½p,{ÝGdÚdâüÐG _@p¨Ïg!ç¾¥uÐ\¼žõ¬K8w9w.pÎÈðUMÈjJ/üjiBWŽÑï(ÍÈÎiX7.T˜ì[}½•‰x—¨ŠiÜ”2N·åy?0ÇMð¸ð¸Û
¶µàqË-wÑ ÌŒ¼¬ó€ÇÍ~Ó;Jà¯ñLªœ¦žFM=P¸áH
xœí]ێ丑}¯¯È(™7ñ êÁžµ1û``< øÁðC·ªË»@×ãÖ¿o’¢$Šw*•9U519Ù•)ňC2‚Ễ/H?±þG2<H…/ÓëÃÏîíøBGó¿~ãGýH¾ñ³÷XÞD2÷î¦Ãxà³öwßýÿÿ¾þåO¿¿L¿< {Ä/Óÿ=üîO¿àË?~Ñgý¸ž™¸Èßò¬zo}Ò–ÿH.˜\>½<üí;„Ö#¦ŸT¿/ôS¿ÄÏúŸQÿÅó_ÄŸ.’
3ÄéÅœDž.„ŠŒBb«Oú*ä0ŽŒKa5òé‚þ~ùôßÿõI_êr1BHp,ˆ–¬Ë~¶nÛ¾°R”R9ý.}HN÷¡DȰi‹éÈ,9üûðë-|È–bLù0ðÖQüæ¼6&{G¢ˆâ*¥“zz’èòú0r4©Ý©Œü-KÒ䫱®]õ-VÕ“¹–åüõeübr×üÍýõÿþçᯗÍÉA%ÅT‘)=|ôxÔHÃXp&Ð(¥ž”iþÒMoÃ6Ûɸ\43×ò¯¯/^ñry¨lZ©!zxrÖÙÑèE~ÔŠÇe‰²o"«[-ÿ@/ßÿÓÅþôl£zéÆQ{Ëem¨óûMä£w2nîv1f®#óÔgŸÌMwæø—½ÞL¹¥UcR
©ð¯þØ$Jnt˜Y6죸s|,Çn~<š)Ê,6„/Ó¨–¿rIšüc 6ö¿Åªºb2ײœ¿¾Œ_Lîš¿¹¿þÿÕÅf[Uìjb––ÝZCí4/EH¸¥ÉFxn`$b½jëÊu¹ÑM'»Ô.ýÛ"‰ya²ýæ`:?¬÷Ðê¼’ 'gŸÞ˸_ž¥%|eË í ÙK~M^ê5NöÐñ‡Ÿ4:tBîÿ'.mªŸþðçrù÷ÃOû»¾Îg ‡}[¯§/À›M…2ªºb: 2O¬…µ>ä%œZá#ad *6–ˆÈÙ³¥BHï6EÞ ²ss¯=3ò=½
ÿN'"–ÇvÎqt?xö¾òp“5âÑÆ„KnºÖÞpk3¯ÅÕÍo¥Ö²°¡L„ò}n[n%k[ÿÊñ_—¾h0öæD·‹¡_g»Öö 'Äh²Ö ¥ÆŒ #‚©;åÖÔÏ­ÍÆÕ‹ÛÌÂô0u[,››(rm”ß¾š£"WŒ²§‹ˆ”1»—f÷àÌ.›{_š"Õì¸ j¤Xûö»ÄIŸõó‹~NÞëçÍ7¶Ê]ücöóÐ`77Ý~žiéé"ÝœÛã3ÎÃ,é4S‰˜][/´ìÖg·ü°W»@ºmº!NJ·÷†>Vº½ô-RÕ»Le³³©xFUW¼ót{qF „ñdÆ”ˆÈíÒí«Â'ÈÎͽúÞ\_Æ/윲@E¯Â¿Ó‰ˆå±sÝž½¯ré¶oÄ;£Œê_kdoœn{@;–n×Á†2Ê÷¹=lW§Û…ø¯K_43#ð¥Û¿Æ¶¹5T`¤lÆi[Æø³Kgõk‚]æI—û(Nfó­f²§N¦QÁ\jl˜Sͱö–´Í^ôWÃ:¦ÃÂì›/6’É\”mòù¾ç;l|Ä]•"Òwð0ª5¥¾[PÓ~ºß:ì.Æ6ÿãΔ-Ô½‹I[$IW()íq.¨°yNóÓÂþy.¶ÖON¸cÖ÷–ôÅÝn”ÎŒ39Wmf(¬' N†K¹Aé)F‰ÛŒ‘0bÞ¤$Ãr]˜ø5&*íÁ–r®•ÝLż;¼ÔM:$½7 —¯ÈýÍŒÈÝÎÊ—y¾öñhæmB4ˆ‘¢³{?'¯˜©A¶Vvþãz™b7EvZW)áFž[mLò`ßû2S5>r·èy*°Çu¶œl¦ â½·Úp Ѻ2šóÒ8ÊœK´‚.”/Kÿ¿µ×0µ£I'­ 8æ[˜¥X&åø)ù™¤­!‡Â& õòK Õ#ÉæG{¹$Mþ±ÈžŠ²b^¸r©ë”e{÷ʳ³ß­MŸ¾^pNóýÎk|ËâbßÖkªo‘ª®˜ü°ov6ʨêŠé0À<±ÖjHzP—pi£®ßql*ÄæK!œ=ãøªÐß ®7¾×yZqlçG÷Bç1w§3cÂ;¾ˆê[kT»÷9ëAË­_-k^9öùç½6]öº–!7; tÍgå|Ë¿¤K2`J$N~qaŸåíW¾×‚ô¥QI˜½\&ÿXdOEY1/$FOÌ ¥ÅßAíV¸¼´ #,ø@…Âr¼60¦ËkžpQ¡¡ý ÈØ Ï/„ °çw8´Sîà5强oë5Õ÷HUWL>ø6;
eTuÅtæžX {5$]xMø´²lÀ*6™KrT¸ ý||{¦—«°p'ün9N±ÜÁar˜Vd²Îb‰Â˜N
8¶sNÐzáXöºŸ•¦M&Îo}ò‡ú|rn[uÍÅëYϺT(;ssFF²¸9'*½ð«¥ ]9F¼£4#;§uN`ݸ¸O-´úfkdo¥·’uÁ¦$bw¸ä_Që-̤̾z½2Y×÷a!ÂÄ`áÌþwrIšücmŽÆxVÌ Þú¦\ªç‰yaò»²KÕ2’}¹$­Ÿ¬Ðc3®=i¼N R² åÚñœ½ðü|{~‡C;å^æ›fv»¶^S}TuÅäƒo³³©PFUWLÇa¾‰µ°WC҇ׄO ûH$b“‰°$G…³—oÏôrî„ß-)|©êŠÝô¥ýU]18Dl眠uñèu“‰óë @¾‚àФurn[ŠÍ%Ö³žuiç>ýîÎNžª YíQé†_%MèË1šà¥Ù9­sëÆÅ}*“ Õ·[™<—*ì§8ß}eâÖ—Q¸TÁ||)]9:øìä’4ùÇÚiD‘¬˜¶õm.Õóļ0ù]ñSĹg¡\’¶Ï|«AH©ÛòÐEù†‚!ž±žŸA`Ïïph§ÜÁkÂ|Ó…n×Ökªï‘ª®˜|ðmv6ʨêŠé8Ì7±öjHúðšðidw g1,ÉQáìåãÛ3½\……;áwKJ#ßFªºb7½…iIUWL'Û9'hÝp,zÝGdÆdâü:è#¯ 84i„œÛ–âAs‰õ¬g]ÚÀ¹K¿ûs“F†§jBV{TºáWIúrŒ&xGiFvNëœÀºqq§Êdßê›­LËW&|@R™/ä¼ûÊÄ­/ÄmbR*u°+k})÷zÚŽ²?þIERH¿ÜV3â¶œ}1/Lþ…û !Y¶lwrIZæjn„Q¤´»ý1½wH¡™ýpÎX Ïϸ;˜ü®†6Ê];Î[.d~K¯qEYœ6xmç/
”T”Å©¼«P
fÑÙØ‹¼Õ>¹Ë»;‰mg+±¶ á`\ï‚À-iŒ¼©êŠÝ„¦å%U]1kž]€ú`Vö°µ´ÁÄù(Ð]BÝÙ˳qÛR8h.^czÖ |»ô·u>ù¾ª MíQé…\yéîZõ[-ýÙùªsrêÆÄª‚}«o¶*˜¿ÏŸý$¥£zÿU[A¤rˆTš_Ý ’»¢r/—¤É?ÖfU’fż°®aæ’Ð6^f1/L~W¼¤Îõ,”KÒ:cp¬ç b>¦è§j¡‡òí¹ZÚ\xz>9¿»¡r÷® òM3¶][¯©¾Gªºbò¡·ÙÙT(£ª+¦ã ßÄZØ«!éBkÂ¥uÀî’¾bP’C™ËG·gj¹
wBï–†F®TuÅnj û¢ª®˜N,¶sNÐzÑXtºÈ´ÅÄéuÈG_!phÂ: 7·-¯ƒækYÏš´AÓOºd' ¬ö¨ô¢¯’!teMàŽŒì|Ö9yu£â>IÐê›­Hì-å?AE%™¿?ú¾+’em™³F”†³ Ëm¹½\&ÿXdO•Y1/xKKñ6)÷Ú[V÷iá2=1/,33¿ÉÑȸSJ#Zò„g²ì‡uÆZpvÁíÁ,áuôµ½gׄõ–«Ú¾­×T¿#U]1ù`Ûìl*”QÕÓaX{b-äÕt5áÓ°>âAàØb"*©ÑàÌå£Û3™\…„;¡wË?CφššìOfQjŸÕÔäéDü«ØÎ9±êaÉÙ> Óã³p{ ü¡Ÿ–ÛÖØûÖ¢u«yÚð¸Oª»Öøë§iÀPk:aVYû{ò†& ‡™Cn®ê™™ú¢§ºb×èÛ-+Æ'óÓÄþœi®¾`ÃÈîÿ³7¨/–Ä} Š ¦Á¬øwrIšücmæ%hVÌ ÛÆ\þ¶I¹×“× ?çcËöļ°Î£†“„ì÷"Ïä R¶Œµàì¼Ûs^G_Û{vMXoš¡íÚzMõ;RÕ¶ÍΦBU]1‡õ&ÖB^ IP>­ƒÕß…+G%5œ¹|t{&“«p'ônifèÙPS“ýÉ,Làóšš<ˆÛ9'VÝ ,8Û‡aÆ`|vç°×Àš¦N@Ëm è}kñºÕ¼­xÜåÔ}kü ƒ`Ó4`¨5½0+¯ý]yC †ÃÌ!7WõÌL}Ñ¿O}±oôíÖ¼xÛ‚1ÌÞÿm‹eá@îÇrÎ)äJÓ½\&ÿXŸ+0%æ…máBÒ%nž˜&¿+~‡ä2|}¹$-ňЀ‰ö¶¸è+ÄãH•J¸¨ÐÐ~dgì…çBÌ~‡C;å^æ{Ð "Áqé{¤ª+&|M…2ªºb: sO¬…½.¼&|ÚÙG=ØPl2–䍨3&âÛ3½\……;áwK8#ßFªºb7½…ù|IUWL'Û9'h½p,{ÝGdÚdâüÐG _@p¨Ïg!ç¶¥uÐ\¼žõ¬K8w9w.pÎÈðUMÈjJ/üjiBWŽÑï(ÍÈÎiX7.îT˜ì[}»•‰ø¨ŠiÜ”2N·åï~`7àq7àq·lk3Àã–[î¢A˜yYç›ý¦1v”À/ñLªœ¦žFM=P¸áH
·Ãa
·€·êÌÂ-º6 p
·LЀÂí8r€ÂíðÈ
7 p{åñË/ú¡ç_¢’é?1Ÿµ"„OÚAZàI+„xÒ€' xÒ€' xÒ€' xÒGxÒ€'í`úO>êǧRú?ʨlHÿŒ,’€Œ ÈÈÜ‚dd@FddíCÈÈ€Œ ÈÈ€Œ ÈÈîšþO®ȧÿŒK16¤ÿÀøŒ_Àø…ƒÀøŒ_ÀøŒ_§ ¿#¿€ñë¥Þv×½”zS¡ûÁê©7ÐjÅÐj ´ZÐj­Ðj­Ðj­Ðj­Ö=ÓþÏn×=›öÜ´áÔUÃPW¥Â
ÔU@]ÔU@]µÚê* ®ê* ®êªc_•ÅîQøº,C„6ìÚ5ÔÆ`ÔP©°5PC5PC­v
¨¡*úè PCe£ÿ›§†ŠòwRþ¾+$Bbù!và`‘ LÀÁLaqLÀÁtÓP&à`&à`¦{—öû®…*›OR‘T a²ö¨ŽüÕ‘ª# :ª# :ª£lk3@u”[î¢A˜yYçÕ‘ÍöäË…ëÚ€a¦sóïfÞ#Duê'ç‘ÏD“é Gç#Ußþ£Xþ#à?r_Êþ#à?þ£ö¡üGÀüGÀüG÷å?z¹0]#Ìߺ4_Ð$/Úà FЉU`, °(’cË´3R,30#¹ä˜‘€ ˜‘Ú‡0#30#5E˜‘€é03ÒË…ë_‰éRP5 >—äSº,àƒR1ÑPcR$c0&¹…“€1 “Ú‡0&c0&c0&Ý—1I—t`Ü•s­¾E0Úqo¨€> è“€> > è“€> è“NAÐ'F>Ð'}Ò+ËÃÓÛïBGÜqkR,kR!ÈÀšÅk°&k°&k°&k°&Ý•5éå2¢AH÷™|óYœ<å>Œcй‘6”@§´þê?Ð)¥Â
tJ@§tJ@§´Ú:% S:% S:¥›è”Z¿p«±«í˜‹n%àVº·ÒkÜJY°·Rz·œ¸•Ç
¸•€[ ¸•€[©£o™[©éK²:øHR%[hRf)’€f hfÐ,ÍÒQünIÐ,ÍÐ,ÍÒ>*@³4K7Ñ,E¿Ÿ“ý¢¬®FIMҮ渗¨î-Æký“Wá4&;«C¤ˆŽb®öñûG© j[ÿÈ«ë[ýbÖj9¶­Y‚؇í£rW«ÛÆ¥Ÿ?Ë÷ÿÜ Þîàµ;½\ž9J}€Œ´öäU¹õ¤‹á/ÉeØ3ì¶t_‚»uHÎD¿ÇÁþæPLõCY-¦\`µÙpÏ3%þœìµ”î~¿áÜ>…Œ<9EâÔJAå}Z[û‡"¨{0&e€e‘Æ8“ŒÙ…У…‹aó“Â4´ ИúèöÀÌ]e4î){žd˜´OÆop±atL"Eþjýó¹|²HAÝHai¢ŸqЧSÑÎß7¤j†‚2;úâXP:õ-£Aw{Ž~$Üi8½W=ÒA"AYv¯ÚóÛˆµ‡ÌÕ‘÷‹‘¡Adú˜Â‡0¿‰ôëŠ l<e,o4‚d9|œïo$üǨ!-ÜÐ𨫢÷\´Œzò8»h)× ®¶oÎ…ÂjùúºÊ„ãaï¥#ã{é/ï¥#òuuä¤ä«Ök{[¾š×E[ï£yµ›´é’ÞlšÄkY'9&¯¸r5 ò¶³:kÔYâÜqŒš¯"êšÛˆs¿ÌG=ëœZØDÒî­?ÙÆœ¸ê‡reë¸9Ô¾·ÈŸÝkáäÌ®ª`¥£¢²ÅÛ\VVퟭ7¯ObþŒ¨}Úþ™ŒBŒóÁÿ†×¾åŸàô1»ï¼©¿ÅË­ƒµžeFºÚFz¸Gü’=‘`
7 p{åñ˯ú©ç_¢’é?1Ÿµ"„OÚAZàI+„xÒ€' xÒ€' xÒ€' xÒGxÒ€'í`úO>ëç—Rú?ʨlHÿŒ,’€Œ ÈÈÜ‚dd@FddíCÈÈ€Œ ÈÈ€Œ ÈÈnšþO®ȧÿŒK16¤ÿÀøŒ_Àø…ƒÀøŒ_ÀøŒ_§ ¿#¿€ñë¥Þv×½”zS¡ûÁê©7ÐjÅÐj ´ZÐj­Ðj­Ðj­Ðj­Ö-Óþg·ëžMû nÚpêªa¨«Raê* ®ê* ®ZíuPWuPWuÕ±¯Êb÷,|] „!Bjc0j¨TX
¨¡
¨¡V;@ ÔP@ ¨¡²ÑÿÍSCEù;)ß•!±ü;p0áH&à`¦°¸&à`ºj(p0p0Ó­Kû}×Âw^ÅÀÍ'©HªˆÉŽ0Yû TGþêHÕPÕPÕÑ
¶µ :Ê-wÑ ÌŒ¼¬ó€êÈf{òéÂumÀ0Ó¹ùw3ï¢:õ“ŽóÈç?¢Ét£s‚‘ªïÿQ,ÿð¹/åÿðÿQûPþ#à?þ#à?þ£Ûò=]˜®æo]š/h'mpP#ÅÄ*0IX ɱåZ€)–€ ˜‘\òÌHÀŒÌHíC˜‘€ ˜‘š¢ÌHÀŒt˜ééÂuŽ/‰Ät) ¨ŸËò%]ðA)‰˜h( €1)’€1 “ÜBŒIÀ˜ŒIíC“€1 “€1 “n˘¤Ë:0ÁGîÊ‚¹VHß"í¸ôI@Ÿ„ƒ@ŸôI@ŸôI§ è“#è“€>éåáéíw¡£Ínȸ5)–€5©d`M
Èb€5 X“€5 X“€5 X“€5 X“nÊšôtÑ ¤ûL¾ù,ÎNžrÆ1ÅÜHÊ SZõè”Ra:% S:% SZíÐ)Ð)ÒUtJ­_¸ÕØÕvÌE·p+]€[i¿5 n¥,X ½[NÜJ‡cÜJÀ­ÜJÀ­ÔÑ÷Ì­Ôô%Y|$©’-4©@³I@³4K³
h–€fé(~·$h–€f h–€fi Yš¥«h–¢ßÏÉ~QV×£$ˆ&iWsÜKT÷㵿~É›ðÕ!RDG1Wûøý£Ôµ­äÍõ­~1ëµÛÖÆ,AìÓöQ¹«ÕíãÒÏØåûî†GowðÚ‚ž.¥>@FZ{ò¦ÜzÒÅð§‹äƒ2ìv[ºŒ¯ÁÝ:$g ¢ßÀãà
s(¦ú©¬S.°Úl¸çóLÉŸ“½–Ò}Àï7‚ë§‘'§HœZ)È¢¼-C akÿ°CuOæÀ¤ °,Òg1»€ zt£p1l~R˜†SŸÝÓ˜¹«Œ†Â=eÏ“ “öÉø.6ŒŽI¤È_­>—O),Mô3út*š Àùdž‚TÍPPfG_Ü J§¾e4ènÏÑ; §÷ªG:H$(ËîU{~±ö¹:òq±124ˆLæ7‘î9 `]q§ŒåF,‡óý„ÿ5¤±…¾uUô‘‹–QOg-å:Á•Âö͹PX-ÿ0¾­2áxGøGéˆø(¥#ê£t£·Õ“X‘’­™‹{[¿F[ð£y‘µ»´éšÞìš_ÄkY(9&o¸t5ò¶³:mÔiâÜ‘Œšï"ê¢Ûˆs¿ÎG=ê¤ZØLÒn®?éÆœ¹ê§ruë¸9Ô¾·ÈÏîµprf[U°ÒQQÙâm.?VMcÿUŸ–Ç
endstream
endobj
77 0 obj
@@ -746,7 +756,7 @@ stream
xœmËAÀ DÑ•€ƒÆ uB¤ ‘‚„J€B§‡¾ÓŸÉt÷z1A¨jäÀö´Mº:x«V§cZÍÌio¤VÚýýým}[ìjnA.!c'z@
endstream
endobj
26 0 obj
31 0 obj
<<
/Type /XObject
/Subtype /Image
@@ -780,7 +790,7 @@ x
Qì¹A‚·&0.D¢÷¡,î³!”;q.Ä"º!zÐÑ×ÿÌé”×ï`~âB, Ü»Eû-¯½×Ò´O#1|Hûð½FÖî¿ü¾˜/ >”£}Y´ÿ°÷ž Ú¯{ì=<§} á0tDñ£!Ìw¤(ŸêÀ<<,ã¼üåàßÁýŽ÷9ÁøÉ8ÁÁ“Ä|›¼³wíù.Õ~O3š·ãùQ®™Š5¯Ì¸T<toZûÍn%0`yd9´ÌÍܘoQõÐkÑӽʳÍ~–sëojD¹~_Ó>L©Ü=X6ûeÞErÚì§Y¦L3hLñü„©”'x>ð^ö™+<yÛ4}×x¾ó­ì §¦¥gò×yÞûZöŸ¯ò<Ü•îÐú}õÍWû…üóo3ËÃÈwé Þ°–-Ϥ[xñ ïýpSîa/éÆÕ/=åÖï“Â5n}ZØ×qn}¸õ­Á=æ?Cƒë¿ÏtõCä›×Òõ÷úÒw]Ë`¦¾ö1×n#7VÖ^%ïO,N—‹(þõ
endstream
endobj
18 0 obj
23 0 obj
<<
/Type /XObject
/Subtype /Image
@@ -833,7 +843,7 @@ x
|Ùæ>{w‡BqLŶ][2ôlg£O±ÇW úáUÂ>C·³—Ž+ÝÉÀáì7˧½›MÏA9>@ưg舩ÿ’?!÷ÈZ„ P.Á£±lÌoüê‚ò+Á®1y&uI÷&ŽÛî
endstream
endobj
33 0 obj
38 0 obj
<<
/Type /XObject
/Subtype /Image
@@ -894,7 +904,7 @@ x
"šQï›±i:€‰‰5è<¡vܵ(&& ×C š«1ã=>ÝŸè1áÐq#§Ïœ áo»ƒy™qj‡øQ(dÝkl¾x»9J”·å°Pªàµn<ø%2ÿ¼>ÚfÏψÇíÈN`b`1O´åüÝ'/_>½{aÛ” +Qfbt#Œ`d`á‘TÑ56ÖU•âa¥bX$šÁ,œšqvÀaf€µâ¶µ*\W
endstream
endobj
34 0 obj
39 0 obj
<<
/Type /XObject
/Subtype /Image
@@ -954,7 +964,7 @@ LF
=É•Xg½Ï¾™¦w ÿ#íAa6ôd7„|Òz!*í6CËkÖ¸RÙ9£ª¦¤÷RÝih‡YÇ÷¨?š¢¨.mEcúhK4âdA¤>Ãv›žÛÊÇ^ø¬à+XiL«žîò¥ö”¡Íð|'¾š—ð¶ï(“~#1R÷MRo ­¤ØíøqÓJˆ©éÅý’žî.£HK­(øŽ†î9öÕO^*ùŸÆ"CÙ^0Íôf´MÎËÏVíãXoH¥ÿÐ
endstream
endobj
35 0 obj
40 0 obj
<<
/Type /XObject
/Subtype /Image
@@ -1020,7 +1030,7 @@ stream
×oHað›N3iÙŸÍ™Ò?íÏ‚¨^Øÿ7‘A ‘Æ #ˆ ÷"É^E(d-dd I“È ˆdh ÃŒJ¡È@'ý1QÂmÞݺۯ¹»ÇínÏmÏó|_ï³»{î÷{žßqœA²¬åµWî>êìlo>½wE¶ÑÏð1¾ýî'/Ã\dñÏ@»se¹^ÛØm„Ï×¶Þ„½aX†ÔD_£ãÿð±6/·\œ0Ðs º Ósk›HÝkÒqÛC)-åu™1/èÀ-œ./KŒxÎU£•KN´Ãbà«§ 8ބ奃D`lŽ›or€'¸'Øó›Ø‡©<÷>1èYšâwü¢ðác)þ:ð.Ðqû{*?¾Yç÷ÍPy©N³vû÷¢T^T×lš÷ÛÆ$‚Â×D¥ç‹RÇ3î@þ ‡¿Èß`òá#È·2y‘ÉÃäÅt}7“ç"ßÄäC•È»˜üÔNä«fYü×UȯÿF¯£Ð5¹<$[oR¼çê5-èPñàA]ÿæ=£òE:Ïi|“žsEý|T¿ýÄrb[0ÃŒõ 1ÿâHå±*";þbãÂq.×M¸v`=Wâ#âC[ñœãÊ?ðUFœ³4ò¹ìY†Ç¦² o'¶ñéÞ†Õ˜bqýpÆÙI4X—¯çÅÒnÚ̶ٵÜÖEw~É^Í ™s“úüjMe+§(9ÀÌñÏ|‰÷¸{’Á‡ut™ÜAM¼ð“÷[U_:Âä'·«¾"Èä#'T†öå«iV=ÛøðجŸ—Ñ÷*c´¥‡ÑÇý’>Fÿ]ùZîgô£”Þ%ýîÐ'°QñX½rŒØü^xêˆ#±ëÿ n
endstream
endobj
36 0 obj
41 0 obj
<<
/Type /XObject
/Subtype /Image
@@ -1100,7 +1110,7 @@ S
¹y˜Ö˜k"Å42Ú¨¥Y¢ÀA“Œ§%Ö t޾À›D±WÝ¢ÿ.•ü%+Oq‘
endstream
endobj
37 0 obj
42 0 obj
<<
/Type /XObject
/Subtype /Image
@@ -1170,7 +1180,7 @@ T
¬ÜþžEŽ~Û×°¢ïÿrʾZ¸öÿßüI×κ¡ÿéúÙW#éo ]?ã$„ö¿é¤ëgˆú ×ÿÒœ ýGàú‘•‚Ü`ØS:ähg`tÚ ¬ºÿ½]¦Gv r¯hÍ·æ&Wû( QR]
endstream
endobj
38 0 obj
43 0 obj
<<
/Type /XObject
/Subtype /Image
@@ -1206,7 +1216,7 @@ Fp
'1Ÿsñ'± ²1<ØšøáÑ8pi”rsBá+†ŠÖ¡>ްqÜçÒ-zŽ<§Íój!„R!ÞVëë;BÇ •À½ÔõÐÅ’ù„ Ï âšsÇqÇqÜŸî ´Agx
endstream
endobj
39 0 obj
13 0 obj
<<
/Type /XObject
/Subtype /Image
@@ -1258,7 +1268,7 @@ P߆
šÿÙAÄ™¯ðÌtÛ2ÇC#EV8ããµ Ùõ>“ù”»œÿù¹‰‘eÿMÃÃHƒû·±ÍãA|`„WL'Kíü"¦mæ“f $1rü!μš;¾öà±·ƒkwŒbSÇ;É~æÜ×Ä©žñ Ôæ†£÷ ³ç]vžždÖ^ãà1®ÓÇ#ádmçy`„5rè.äÓ6ž‰âù.´Þ8‘ÃüÖ½r‚H`Þó0ù}Þ`þGŠ,IÒC«92žb÷Ø5N?<?nìÃð©)îÊSroýâåWùõê÷Þ4c’Äülj뜙ü‹z2˜Ÿ½UC»‹¡[íj@¹q¤œ-îÍüwª×ÿä¹ùÀ«kç¼Mg3‡Þƒ¼‘$#àa°9¥Ç·šŒ_å׫ëƼ½ g6 ù0G«÷ædGóvpÍÉß»2sŠÈ¿…}kµkÐßñÿÇ»_‡]ã„Üm¢ƒí4ž˜­TtG°qŒ´F¾FxåÁSêz5בlÅSê—§öû;9×ùCô]‰éç™…ð{ŠC¿*±vßÞbVÓØ¨þ¨jÁñ2ÿ(zékô)pCS 6vÛ(ÿšïüÓ8ƒvÃQ§»¡u2p-¹’:«Ðn°›ŠG[®æ1â[MæM Õ+²¸-dº¹0ßÊ{Í6‰…ÓÍøZC‘aØUÄ.!¦˜vܧ¯\óeÔíõ4Ξ÷ŠW“­]/g¾#)ë·þæ3ƒ ž–\»ÞÄüÉú­êÆå¯«”OK®]obÞºEÑO(Q+Ü_¨Ûçªf}…^Î|?v7>_8,"“¯«”R[5¯&[³^Îü8iÞ¾#SJuÖ÷vó¼šlõz9󡇯}7Rß!^M¶z½žyÿŸO!ÏÓ6¬×3ï…þú±žVó´ÍÚõæ7å¬av?’öNñj²ÕËýnà‹´;\»§Kšºúèw<¶mkÕ`±¾VÿêŠãõ
endstream
endobj
43 0 obj
12 0 obj
<<
/Type /XObject
/Subtype /Image
@@ -1305,99 +1315,99 @@ endobj
xref
0 87
0000000000 65535 f
0000008523 00000 n
0000008594 00000 n
0000008383 00000 n
0000008335 00000 n
0000008641 00000 n
0000024800 00000 n
0000008559 00000 n
0000008630 00000 n
0000008419 00000 n
0000008371 00000 n
0000008677 00000 n
0000025882 00000 n
0000000241 00000 n
0000000104 00000 n
0000000015 00000 n
0000003718 00000 n
0000004833 00000 n
0000003730 00000 n
0000004845 00000 n
0000092261 00000 n
0000083109 00000 n
0000000059 00000 n
0000005563 00000 n
0000006178 00000 n
0000026266 00000 n
0000001770 00000 n
0000001585 00000 n
0000033112 00000 n
0000002627 00000 n
0000007053 00000 n
0000007208 00000 n
0000000424 00000 n
0000000526 00000 n
0000000650 00000 n
0000000752 00000 n
0000032021 00000 n
0000000883 00000 n
0000000985 00000 n
0000001116 00000 n
0000001218 00000 n
0000001350 00000 n
0000001452 00000 n
0000037963 00000 n
0000045282 00000 n
0000054167 00000 n
0000062512 00000 n
0000071755 00000 n
0000080234 00000 n
0000082144 00000 n
0000024508 00000 n
0000002219 00000 n
0000002079 00000 n
0000091296 00000 n
0000007311 00000 n
0000007428 00000 n
0000007558 00000 n
0000007688 00000 n
0000007822 00000 n
0000007951 00000 n
0000008080 00000 n
0000008209 00000 n
0000002537 00000 n
0000002383 00000 n
0000002411 00000 n
0000002439 00000 n
0000002475 00000 n
0000008684 00000 n
0000002725 00000 n
0000002987 00000 n
0000012480 00000 n
0000012978 00000 n
0000003870 00000 n
0000004134 00000 n
0000016770 00000 n
0000017262 00000 n
0000004982 00000 n
0000005254 00000 n
0000018328 00000 n
0000018663 00000 n
0000005714 00000 n
0000005932 00000 n
0000021631 00000 n
0000021949 00000 n
0000006330 00000 n
0000006609 00000 n
0000024118 00000 n
0000031750 00000 n
0000032318 00000 n
0000036934 00000 n
0000044366 00000 n
0000052448 00000 n
0000061654 00000 n
0000070833 00000 n
0000079514 00000 n
0000081440 00000 n
0000083230 00000 n
0000005575 00000 n
0000025242 00000 n
0000000589 00000 n
0000000449 00000 n
0000006214 00000 n
0000027277 00000 n
0000002096 00000 n
0000001911 00000 n
0000034077 00000 n
0000002639 00000 n
0000007089 00000 n
0000007244 00000 n
0000000750 00000 n
0000000852 00000 n
0000000976 00000 n
0000001078 00000 n
0000032986 00000 n
0000001209 00000 n
0000001311 00000 n
0000001442 00000 n
0000001544 00000 n
0000001676 00000 n
0000001778 00000 n
0000038928 00000 n
0000046247 00000 n
0000055132 00000 n
0000063477 00000 n
0000072720 00000 n
0000081199 00000 n
0000007347 00000 n
0000007464 00000 n
0000007594 00000 n
0000007724 00000 n
0000007858 00000 n
0000007987 00000 n
0000008116 00000 n
0000008245 00000 n
0000002549 00000 n
0000002395 00000 n
0000002423 00000 n
0000002451 00000 n
0000002487 00000 n
0000008720 00000 n
0000002737 00000 n
0000002999 00000 n
0000012516 00000 n
0000013014 00000 n
0000003882 00000 n
0000004146 00000 n
0000016806 00000 n
0000017298 00000 n
0000004994 00000 n
0000005266 00000 n
0000018364 00000 n
0000018699 00000 n
0000005726 00000 n
0000005944 00000 n
0000022337 00000 n
0000022683 00000 n
0000006366 00000 n
0000006645 00000 n
0000024852 00000 n
0000032715 00000 n
0000033283 00000 n
0000037899 00000 n
0000045331 00000 n
0000053413 00000 n
0000062619 00000 n
0000071798 00000 n
0000080479 00000 n
0000082405 00000 n
0000084195 00000 n
trailer
<<
/Size 87
/Root 3 0 R
/Info 52 0 R
/ID [<f859d5aa137a1b00be187261c0c2b77d> <f859d5aa137a1b00be187261c0c2b77d>]
/ID [<ce07861accf99bc03b5833d3a6101110> <ce07861accf99bc03b5833d3a6101110>]
>>
startxref
101711
102676
%%EOF
@@ -3,6 +3,7 @@ import path from 'path';
import { expect, test } from '@playwright/test';
import { CONFIG, createDoc, overrideConfig } from './utils-common';
import { openSuggestionMenu, writeInEditor } from './utils-editor';
test.describe('Config', () => {
if (process.env.IS_INSTANCE !== 'true') {
@@ -35,9 +36,16 @@ test.describe('Config', () => {
const fileChooserPromise = page.waitForEvent('filechooser');
await page.locator('.bn-block-outer').last().fill('Anything');
await page.locator('.bn-block-outer').last().fill('/');
await page.getByText('Resizable image with caption').click();
await writeInEditor({
page,
text: 'Anything',
});
await openSuggestionMenu({
page,
suggestion: 'Resizable image with caption',
});
await page.getByText('Upload image').click();
const fileChooser = await fileChooserPromise;
@@ -119,7 +119,9 @@ if (process.env.IS_INSTANCE !== 'true') {
await expect(editor.getByText('Bonjour le monde')).toBeVisible();
// Check Suggestion menu
await page.locator('.bn-block-outer').last().fill('/');
await openSuggestionMenu({
page,
});
await expect(page.getByText('Write with AI')).toBeVisible();
// Reload the page to check that the AI change is still there
@@ -364,7 +366,9 @@ if (process.env.IS_INSTANCE !== 'true') {
await editor.getByText('Hello').selectText();
await expect(page.getByRole('button', { name: 'Ask AI' })).toBeHidden();
await page.locator('.bn-block-outer').last().fill('/');
await openSuggestionMenu({
page,
});
await expect(page.getByText('Write with AI')).toBeHidden();
});
});
@@ -3,7 +3,7 @@ import path from 'path';
import { expect, test } from '@playwright/test';
import { createDoc, overrideConfig, verifyDocName } from './utils-common';
import { writeInEditor } from './utils-editor';
import { openSuggestionMenu, writeInEditor } from './utils-editor';
import { connectOtherUserToDoc, updateShareLink } from './utils-share';
import { createRootSubPage } from './utils-sub-pages';
@@ -101,8 +101,10 @@ test.describe('Doc Collaboration', () => {
// Owner add a image
const fileChooserPromise = page.waitForEvent('filechooser');
await page.locator('.bn-block-outer').last().fill('/');
await page.getByText('Resizable image with caption').click();
await openSuggestionMenu({
page,
suggestion: 'Resizable image with caption',
});
await page.getByText('Upload image').click();
const fileChooser = await fileChooserPromise;
@@ -6,6 +6,7 @@ import {
randomName,
verifyDocName,
} from './utils-common';
import { openSuggestionMenu } from './utils-editor';
import { connectOtherUserToDoc } from './utils-share';
import { SignIn } from './utils-signin';
@@ -38,12 +39,10 @@ test.describe('Doc Create', () => {
await verifyDocName(page, title);
await page.locator('.bn-block-outer').last().fill('/');
await page
.getByText('New sub-doc', {
exact: true,
})
.click();
await openSuggestionMenu({
page,
suggestion: 'New sub-doc',
});
const input = page.getByRole('textbox', { name: 'Document title' });
await expect(input).toHaveText('', { timeout: 10000 });
@@ -74,8 +74,10 @@ test.describe('Doc Editor', () => {
await page.keyboard.press('Enter');
const fileChooserPromise = page.waitForEvent('filechooser');
await page.locator('.bn-block-outer').last().fill('/');
await page.getByText('Resizable image with caption').click();
await openSuggestionMenu({
page,
suggestion: 'Resizable image with caption',
});
await page.getByText('Upload image').click();
const fileChooser = await fileChooserPromise;
@@ -87,8 +89,6 @@ test.describe('Doc Editor', () => {
.locator('.--docs--editor-container img.bn-visual-media')
.first();
await expect(image).toHaveAttribute('role', 'presentation');
await image.click();
await expect(
@@ -219,9 +219,10 @@ test.describe('Doc Editor', () => {
await writeInEditor({ page, text: 'Hello World' });
await page.keyboard.press('Enter');
await page.locator('.bn-block-outer').last().fill('/');
await page.getByText('Resizable image with caption').click();
await openSuggestionMenu({
page,
suggestion: 'Resizable image with caption',
});
await page.getByText('Upload image').click();
const fileChooser = await fileChooserPromise;
@@ -244,11 +245,6 @@ test.describe('Doc Editor', () => {
expect(await image.getAttribute('src')).toMatch(
/media\/.*\/attachments\/.*.png/,
);
await expect(image).toHaveAttribute('role', 'presentation');
await expect(image).toHaveAttribute('alt', '');
await expect(image).toHaveAttribute('tabindex', '-1');
await expect(image).toHaveAttribute('aria-hidden', 'true');
});
if (process.env.IS_INSTANCE !== 'true') {
@@ -266,12 +262,11 @@ test.describe('Doc Editor', () => {
await verifyDocName(page, randomDoc);
await page.locator('.ProseMirror.bn-editor').click();
await page.locator('.ProseMirror.bn-editor').fill('Hello World');
await page.keyboard.press('Enter');
await page.locator('.bn-block-outer').last().fill('/');
await page.getByText('Embedded file').click();
await writeInEditor({ page, text: 'Hello World' });
await openSuggestionMenu({
page,
suggestion: 'Embedded file',
});
await page.getByText('Upload file').click();
const fileChooser = await fileChooserPromise;
@@ -506,7 +501,7 @@ test.describe('Doc Editor', () => {
}) => {
const [randomDoc] = await createDoc(page, 'doc-scroll', browserName, 1);
for (let i = 0; i < 15; i++) {
for (let i = 0; i < 30; i++) {
await page.keyboard.press('Enter');
await writeInEditor({ page, text: 'Hello Parent ' + i });
}
@@ -515,7 +510,7 @@ test.describe('Doc Editor', () => {
await expect(
editor.getByText('Hello Parent 1', { exact: true }),
).not.toBeInViewport();
await expect(editor.getByText('Hello Parent 14')).toBeInViewport();
await expect(editor.getByText('Hello Parent 29')).toBeInViewport();
const { name: docChild } = await createRootSubPage(
page,
@@ -523,7 +518,7 @@ test.describe('Doc Editor', () => {
'doc-scroll-child',
);
for (let i = 0; i < 15; i++) {
for (let i = 0; i < 30; i++) {
await page.keyboard.press('Enter');
await writeInEditor({ page, text: 'Hello Child ' + i });
}
@@ -531,21 +526,21 @@ test.describe('Doc Editor', () => {
await expect(
editor.getByText('Hello Child 1', { exact: true }),
).not.toBeInViewport();
await expect(editor.getByText('Hello Child 14')).toBeInViewport();
await expect(editor.getByText('Hello Child 29')).toBeInViewport();
await navigateToPageFromTree({ page, title: randomDoc });
await expect(
editor.getByText('Hello Parent 1', { exact: true }),
).toBeInViewport();
await expect(editor.getByText('Hello Parent 14')).not.toBeInViewport();
await expect(editor.getByText('Hello Parent 29')).not.toBeInViewport();
await navigateToPageFromTree({ page, title: docChild });
await expect(
editor.getByText('Hello Child 1', { exact: true }),
).toBeInViewport();
await expect(editor.getByText('Hello Child 14')).not.toBeInViewport();
await expect(editor.getByText('Hello Child 29')).not.toBeInViewport();
});
test('it embeds PDF', async ({ page, browserName }) => {
@@ -556,8 +551,7 @@ test.describe('Doc Editor', () => {
await page.getByRole('button', { name: 'Close the share modal' }).click();
await openSuggestionMenu({ page });
await page.getByText('Embed a PDF file').click();
await openSuggestionMenu({ page, suggestion: 'Embed a PDF file' });
const pdfBlock = page.locator('div[data-content-type="pdf"]').last();
@@ -579,8 +573,7 @@ test.describe('Doc Editor', () => {
await expect(page.getByText('Invalid or missing PDF file')).toBeVisible();
await openSuggestionMenu({ page });
await page.getByText('Embed a PDF file').click();
await openSuggestionMenu({ page, suggestion: 'Embed a PDF file' });
// Now with a valid PDF
await page.getByText(/Add (PDF|file)/).click();
@@ -116,12 +116,11 @@ test.describe('Doc Export', () => {
await verifyDocName(page, randomDoc);
// Add some content and at least one image so that the ZIP contains media files.
await page.locator('.ProseMirror.bn-editor').click();
await page.locator('.ProseMirror.bn-editor').fill('Hello HTML ZIP');
await page.keyboard.press('Enter');
await page.locator('.bn-block-outer').last().fill('/');
await page.getByText('Resizable image with caption').click();
await writeInEditor({ page, text: 'Hello HTML ZIP' });
await openSuggestionMenu({
page,
suggestion: 'Resizable image with caption',
});
const fileChooserPromise = page.waitForEvent('filechooser');
await page.getByText('Upload image').click();
@@ -222,8 +221,10 @@ test.describe('Doc Export', () => {
await expect(image).toBeVisible();
await page.locator('.bn-block-outer').last().fill('/');
await page.getByText('Resizable image with caption').click();
await openSuggestionMenu({
page,
suggestion: 'Resizable image with caption',
});
await page.getByRole('tab', { name: 'Embed' }).click();
await page
.getByRole('textbox', { name: 'Enter URL' })
@@ -8,11 +8,34 @@ export const getEditor = async ({ page }: { page: Page }) => {
return editor;
};
export const openSuggestionMenu = async ({ page }: { page: Page }) => {
const editor = await writeInEditor({ page, text: '/' });
export const openSuggestionMenu = async ({
page,
suggestion,
}: {
page: Page;
suggestion?: string;
}) => {
const editor = await getEditor({ page });
if (
(await editor.locator('.bn-trailing-block.ProseMirror-widget').count()) > 0
) {
await editor.locator('.bn-trailing-block.ProseMirror-widget').click();
} else {
await editor.click();
}
await page.keyboard.press('Enter');
await page.keyboard.type('/');
const suggestionMenu = page.locator('.bn-suggestion-menu');
if (suggestion) {
await suggestionMenu
.getByText(suggestion, {
exact: true,
})
.click();
}
return { editor, suggestionMenu };
};
@@ -24,6 +47,13 @@ export const writeInEditor = async ({
text: string;
}) => {
const editor = await getEditor({ page });
if (
(await editor.locator('.bn-trailing-block.ProseMirror-widget').count()) > 0
) {
await editor.locator('.bn-trailing-block.ProseMirror-widget').click();
} else {
await editor.click();
}
await editor
.locator('.bn-block-outer:last-child')
.last()
@@ -55,9 +55,10 @@ export const overrideDocContent = async ({
await page.waitForTimeout(1000);
// Add Image SVG
await page.keyboard.press('Enter');
const { suggestionMenu } = await openSuggestionMenu({ page });
await suggestionMenu.getByText('Resizable image with caption').click();
await openSuggestionMenu({
page,
suggestion: 'Resizable image with caption',
});
const fileChooserPromise = page.waitForEvent('filechooser');
await page.getByText('Upload image').click();
const fileChooser = await fileChooserPromise;
@@ -73,8 +74,10 @@ export const overrideDocContent = async ({
await page.waitForTimeout(1000);
// Add Image PNG
await openSuggestionMenu({ page });
await suggestionMenu.getByText('Resizable image with caption').click();
await openSuggestionMenu({
page,
suggestion: 'Resizable image with caption',
});
const fileChooserPNGPromise = page.waitForEvent('filechooser');
await page.getByText('Upload image').click();
const fileChooserPNG = await fileChooserPNGPromise;
+9 -9
View File
@@ -24,15 +24,15 @@
"dependencies": {
"@ag-media/react-pdf-table": "2.0.3",
"@ai-sdk/openai": "3.0.63",
"@blocknote/code-block": "0.50.0",
"@blocknote/core": "0.50.0",
"@blocknote/mantine": "0.50.0",
"@blocknote/react": "0.50.0",
"@blocknote/xl-ai": "0.50.0",
"@blocknote/xl-docx-exporter": "0.50.0",
"@blocknote/xl-multi-column": "0.50.0",
"@blocknote/xl-odt-exporter": "0.50.0",
"@blocknote/xl-pdf-exporter": "0.50.0",
"@blocknote/code-block": "0.51.1",
"@blocknote/core": "0.51.1",
"@blocknote/mantine": "0.51.1",
"@blocknote/react": "0.51.1",
"@blocknote/xl-ai": "0.51.1",
"@blocknote/xl-docx-exporter": "0.51.1",
"@blocknote/xl-multi-column": "0.51.1",
"@blocknote/xl-odt-exporter": "0.51.1",
"@blocknote/xl-pdf-exporter": "0.51.1",
"@dnd-kit/core": "6.3.1",
"@dnd-kit/modifiers": "9.0.0",
"@emoji-mart/data": "1.2.1",
@@ -42,12 +42,7 @@ import BlockNoteAI from './AI';
import { BlockNoteSuggestionMenu } from './BlockNoteSuggestionMenu';
import { BlockNoteToolbar } from './BlockNoteToolBar/BlockNoteToolbar';
import { DocsCommentsStyle, useComments } from './comments/';
import {
AccessibleImageBlock,
CalloutBlock,
PdfBlock,
UploadLoaderBlock,
} from './custom-blocks';
import { CalloutBlock, PdfBlock, UploadLoaderBlock } from './custom-blocks';
const AIMenu = BlockNoteAI?.AIMenu;
const AIMenuController = BlockNoteAI?.AIMenuController;
const useAI = BlockNoteAI?.useAI;
@@ -64,7 +59,6 @@ const baseBlockNoteSchema = withPageBreak(
...defaultBlockSpecs,
callout: CalloutBlock(),
codeBlock: createCodeBlockSpec(codeBlockOptions),
image: AccessibleImageBlock(),
pdf: PdfBlock(),
uploadLoader: UploadLoaderBlock(),
},
@@ -1,121 +0,0 @@
/**
* AccessibleImageBlock.tsx
*
* This file defines a custom BlockNote block specification for an accessible image block.
* It extends the default image block to ensure compliance with accessibility standards,
* specifically RGAA 1.9.1, by using <figure> and <figcaption> elements when a caption is provided.
*
* The accessible image block ensures that:
* - Images with captions are wrapped in <figure> and <figcaption> elements.
* - The <img> element has an appropriate alt attribute based on the caption.
* - Accessibility attributes such as role and aria-label are added for better screen reader support.
* - Images without captions have alt="" and are marked as decorative with aria-hidden="true".
*
* This implementation leverages BlockNote's existing image block functionality while enhancing it for accessibility.
* https://github.com/TypeCellOS/BlockNote/blob/main/packages/core/src/blocks/Image/block.ts
*/
import {
BlockFromConfig,
BlockNoteEditor,
ImageOptions,
InlineContentSchema,
InlineContentSchemaFromSpecs,
StyleSchema,
createBlockSpec,
createImageBlockConfig,
defaultInlineContentSpecs,
imageParse,
imageRender,
imageToExternalHTML,
} from '@blocknote/core';
import { t } from 'i18next';
type CreateImageBlockConfig = ReturnType<typeof createImageBlockConfig>;
export const accessibleImageRender =
(config: ImageOptions) =>
(
block: BlockFromConfig<
CreateImageBlockConfig,
InlineContentSchema,
StyleSchema
>,
editor: BlockNoteEditor<
Record<'image', CreateImageBlockConfig>,
InlineContentSchemaFromSpecs<typeof defaultInlineContentSpecs>,
StyleSchema
>,
) => {
const imageRenderComputed = imageRender(config);
const dom = imageRenderComputed(block, editor).dom;
const imgSelector = dom.querySelector('img');
// Fix RGAA 1.9.1: Convert to figure/figcaption structure if caption exists
const accessibleImageWithCaption = () => {
imgSelector?.setAttribute('alt', block.props.caption);
imgSelector?.removeAttribute('aria-hidden');
imgSelector?.setAttribute('tabindex', '0');
const originalCaption = dom.querySelector('.bn-file-caption');
if (imgSelector?.parentNode && originalCaption) {
const figureElement = document.createElement('figure');
figureElement.style.setProperty('margin', '0');
// Wrap only the img inside figure, preserving the rest of the dom tree
imgSelector.parentNode.insertBefore(figureElement, imgSelector);
figureElement.appendChild(imgSelector);
// Replace the <p> caption with <figcaption> inside the figure
const figcaptionElement = document.createElement('figcaption');
figcaptionElement.className = originalCaption.className;
figcaptionElement.textContent = originalCaption.textContent;
figureElement.appendChild(figcaptionElement);
originalCaption.parentNode?.removeChild(originalCaption);
// Add explicit role and aria-label for better screen reader support
figureElement.setAttribute('role', 'img');
figureElement.setAttribute(
'aria-label',
t(`Image: {{title}}`, { title: figcaptionElement.textContent }),
);
}
return {
...imageRenderComputed,
dom,
};
};
const accessibleImage = () => {
imgSelector?.setAttribute('alt', '');
imgSelector?.setAttribute('role', 'presentation');
imgSelector?.setAttribute('aria-hidden', 'true');
imgSelector?.setAttribute('tabindex', '-1');
return {
...imageRenderComputed,
dom,
};
};
const withCaption =
block.props.caption && dom.querySelector('.bn-file-caption');
// Set accessibility attributes for the image
return withCaption ? accessibleImageWithCaption() : accessibleImage();
};
export const AccessibleImageBlock = createBlockSpec(
createImageBlockConfig,
(config) => ({
meta: {
fileBlockAccept: ['image/*'],
},
render: accessibleImageRender(config),
parse: imageParse(config),
toExternalHTML: imageToExternalHTML(config),
runsBefore: ['file'],
}),
);
@@ -133,7 +133,24 @@ const CalloutComponent = ({
/>
)}
</Box>
<Box as="p" className="inline-content" ref={contentRef} />
<Box
as="p"
className="inline-content"
ref={(node: HTMLElement | null) => {
contentRef(node);
/**
* BlockNote's CSS uses `.bn-block:has(> .bn-block-content[...])` (direct child).
* For custom blocks, `.react-renderer` sits between `.bn-block` and `.bn-block-content`,
* so background/text-color selectors never match. Adding `bn-block` to the intermediate
* wrapper makes it the direct parent of `.bn-block-content`, fixing all those selectors.
* TODO: Remove this patch once BlockNote issue is resolved: https://github.com/TypeCellOS/BlockNote/issues/2732
*/
node
?.closest('.bn-react-node-view-renderer')
?.classList.add('bn-block');
}}
/>
</Box>
);
};
@@ -1,4 +1,3 @@
export * from './AccessibleImageBlock';
export * from './CalloutBlock';
export * from './PdfBlock';
export * from './UploadLoaderBlock';
@@ -16,6 +16,8 @@ import * as XLMultiColumn from '@blocknote/xl-multi-column';
* from ColumnBlock.
* This prevents dragging a block onto another block from
* automatically creating a multi-column layout.
*
* TODO: This is a temporary workaround until BlockNote provides a built-in way to disable the drop handler for specific blocks.
* @param schema
* @returns
*/
@@ -1,9 +1,10 @@
import { createGlobalStyle } from 'styled-components';
export const DocsEditorStyle = createGlobalStyle`
.bn-root {
.bn-container {
height: 100%;
}
.bn-root {
.bn-editor {
height: 100%;
}
@@ -193,6 +194,7 @@ export const DocsEditorStyle = createGlobalStyle`
*/
[data-content-type='heading'] {
--level: 1.875rem;
padding-top: 3px;
&[data-level='2'] {
--level: 1.5rem;
}
@@ -236,7 +238,7 @@ export const DocsEditorStyle = createGlobalStyle`
& .bn-default-styles h6 {
font-size: 0.875rem;
}
& .bn-block-outer:not(:first-child) {
& .bn-block-outer:not(:first-child):not(:has([data-content-type="toggleListItem"])) {
&:has(h1) {
margin-top: 32px;
}
+2 -2
View File
@@ -16,7 +16,7 @@
"node": ">=22"
},
"dependencies": {
"@blocknote/server-util": "0.50.0",
"@blocknote/server-util": "0.51.1",
"@hocuspocus/server": "3.4.4",
"@sentry/node": "10.52.0",
"@sentry/profiling-node": "10.52.0",
@@ -30,7 +30,7 @@
"yjs": "*"
},
"devDependencies": {
"@blocknote/core": "0.50.0",
"@blocknote/core": "0.51.1",
"@hocuspocus/provider": "3.4.4",
"@types/cors": "2.8.19",
"@types/express": "5.0.6",
+62 -772
View File
File diff suppressed because it is too large Load Diff