From 5f0178bc732268f7164becd9c3b938b00fafdb53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=A5=E6=9C=88=E5=8D=83=E9=B8=AE?= <40380042+camera-2018@users.noreply.github.com> Date: Mon, 13 Apr 2026 08:43:36 +0800 Subject: [PATCH] chore: switch dashboard code blocks highlight to shiki (#7497) * fix: switch dashboard code blocks to shiki and sync theme rendering * fix: harden and optimize dashboard shiki highlighting --- dashboard/package.json | 3 +- dashboard/pnpm-lock.yaml | 22 -- .../mdi-subset/materialdesignicons-subset.css | 6 +- .../materialdesignicons-webfont-subset.woff | Bin 17104 -> 17056 bytes .../materialdesignicons-webfont-subset.woff2 | Bin 13692 -> 13672 bytes dashboard/src/components/chat/Chat.vue | 5 +- dashboard/src/components/chat/MessageList.vue | 5 +- .../components/chat/MessageListDEPRECATED.vue | 1 - .../src/components/chat/StandaloneChat.vue | 5 +- .../message_list_comps/IPythonToolBlock.vue | 33 +- .../src/components/shared/ChangelogDialog.vue | 1 - .../src/components/shared/ReadmeDialog.vue | 281 +++++++++++------- .../shared/ThemeAwareMarkdownCodeBlock.vue | 40 +++ .../full/vertical-header/VerticalHeader.vue | 1 - .../src/scss/components/_CodeBlockDark.scss | 19 ++ dashboard/src/scss/components/_HljsDark.scss | 107 ------- dashboard/src/scss/style.scss | 2 +- dashboard/src/utils/shiki.js | 91 ++++++ dashboard/src/views/WelcomePage.vue | 1 - 19 files changed, 361 insertions(+), 262 deletions(-) create mode 100644 dashboard/src/components/shared/ThemeAwareMarkdownCodeBlock.vue create mode 100644 dashboard/src/scss/components/_CodeBlockDark.scss delete mode 100644 dashboard/src/scss/components/_HljsDark.scss create mode 100644 dashboard/src/utils/shiki.js diff --git a/dashboard/package.json b/dashboard/package.json index 00224a0f5..cb5807cd7 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -14,7 +14,6 @@ "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore" }, "dependencies": { - "qrcode": "^1.5.4", "@guolao/vue-monaco-editor": "^1.5.4", "@tiptap/starter-kit": "2.1.7", "@tiptap/vue-3": "2.1.7", @@ -25,7 +24,6 @@ "date-fns": "2.30.0", "dompurify": "^3.3.2", "event-source-polyfill": "^1.0.31", - "highlight.js": "^11.11.1", "js-md5": "^0.8.3", "katex": "^0.16.27", "lodash": "4.17.23", @@ -35,6 +33,7 @@ "monaco-editor": "^0.52.2", "pinia": "2.1.6", "pinyin-pro": "^3.26.0", + "qrcode": "^1.5.4", "shiki": "^3.20.0", "stream-markdown": "^0.0.13", "vee-validate": "4.11.3", diff --git a/dashboard/pnpm-lock.yaml b/dashboard/pnpm-lock.yaml index 775b52a2f..ae65710eb 100644 --- a/dashboard/pnpm-lock.yaml +++ b/dashboard/pnpm-lock.yaml @@ -42,9 +42,6 @@ importers: event-source-polyfill: specifier: ^1.0.31 version: 1.0.31 - highlight.js: - specifier: ^11.11.1 - version: 11.11.1 js-md5: specifier: ^0.8.3 version: 0.8.3 @@ -540,79 +537,66 @@ packages: resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.59.0': resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.59.0': resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.59.0': resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.59.0': resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.59.0': resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] - libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.59.0': resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.59.0': resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] - libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.59.0': resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.59.0': resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.59.0': resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.59.0': resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.59.0': resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openbsd-x64@4.59.0': resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} @@ -1919,10 +1903,6 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - highlight.js@11.11.1: - resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} - engines: {node: '>=12.0.0'} - hookified@1.15.1: resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} @@ -4933,8 +4913,6 @@ snapshots: he@1.2.0: {} - highlight.js@11.11.1: {} - hookified@1.15.1: {} html-void-elements@3.0.0: {} diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css b/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css index 22b4a41ef..54785df23 100644 --- a/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css +++ b/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css @@ -1,4 +1,4 @@ -/* Auto-generated MDI subset – 248 icons */ +/* Auto-generated MDI subset – 247 icons */ /* Do not edit manually. Run: pnpm run subset-icons */ @font-face { @@ -236,10 +236,6 @@ content: "\F0167"; } -.mdi-code-braces::before { - content: "\F0169"; -} - .mdi-code-json::before { content: "\F0626"; } diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff b/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff index 5ae667944eb5f899f5743c36d96f117b574184cf..b5c8cefd742e995fb7fe64ae885990485ef498fa 100644 GIT binary patch delta 16566 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 pdJa7A*yKgPB#fm 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 delta 16636 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 Ivb0kx0G2BgjsO4v diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff2 b/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff2 index 55241b83bc4cc282a83c91b3e0afce2a0c8d944b..74e05e5454a73db2344343ba6af925ac2be8c515 100644 GIT binary patch literal 13672 zcmV-uHJ8eFPew8T0RR9105xa;3jhEB0D0U105uf=0RR9100000000000000000000 z0000SC0LI)rlmShF&*duNS5JeR}c@(9X zRZ*16Rhj*NOrT?kQ1?_p-JXDC&*h5Q?N+lkRPs^>qs&zn9c#bpSQ`lvB*?NAfmm0w zAMmgA_y_4r4kJ7OPo3zOd{U8aEM4P&g=R{Q(a=a@5tO%@Tum z{DbW1VVdn{p@>G8L{Z5~yxuMVhDf&>B$Uu3n?ealNGQon0D%OlWtbodE5<8TIOK}$nwe^|>aP2B*ZmrZ>^dYQtY{{C zBH9hJlk?P7KHugGUr0tJGAfaALBP!oJ(yJk0Gs{4v{iP`7`vtH8D?gUw0nk>?_28q zn`H0wRhy(zDy0YXKx{kY)a4EU5cqHXY`g`-!YpzuC;BxaQs$*7(^R?i_bsQMlMeBH zbY{UNh*z4s%5*WW7PFEJbY2CQd|ZN5COhPoav6_yi^~DAiX&Bl=cEnw*s}hw$$C-~ z@VafP5ip-QKil2or+|)gD06)M`L`~wXx$XU?C@u2hS`NhNGyE*0ZI!9k>r013IcFNDeVo7or?Pb?+({b*xPFvd7tuD@y*X#G4m_Y0d$J8(EC` z+VkzIh+7B}M7+99wG*PIN(j5-Lcm^snEyvM{VKjW>rrYHs|+$oA<2sv{QEWvDCuA` z4jDFPiaOu?x)o|b2L3;U1ca?KVMthj;rg(DYxN_MO~K1cPuS3T2K*GE|J#Q>H^Mfa z%#p5VQWEDvuy{A-yp;4lff7W;l88E#RMctG)`gN44J|p**pe4bDFxB=QWUK$CDG$j z7CkK$(aTa5y(=}MPbG@JJgKFi{G|M;EnSBC3e49KPN%V2wVI<)T4>gyrCz;SuaDA3 z;ib}6;g!-(;f>N>;dJSsFjhJ$oGqOcK0I{xxi4Q`-buh$5~Mo;q28j%iIyow47CIa zvLs0|kDOe#6sdBksN~6#C0~UK1?n}JkJ1P?Xi%XySm^AxUy*CBDR#>(C2qT|)ZhMA z=3oE4%Kv@+IaK1}sv;y*Ez3MLa^$Ep-+cA7v>KEtL;P|ewQ5J{(4kqkZY>N9S}nF% zn?C*8cacAkhawZU@BZM4D) zoAx{hGYgB&h7H?d#E2KX>s>GU(1%`f!MK;XxxKnCIlSf@-@aad`-3lk9~PlP*+h%B zRiY%@C@JlbCe51`T4<*pJ$C8S=Pec%!|d#KJMOqWyGjMvD{=z3hkfRmXTNUU_?BDl zfE89a=w0tRwD)-mFd}jSBR-L^%aFmbr#T$9-F8PDa>!AmMje}*3UFNHa6=9!q)T^_ zmDMS4dednmMo?wjKBjC}@mkrT;@4%Tia#HAnRd_aJ)!JXsjBQ#si*8$Y0Z-ZD(8Ok zad179Bb5is(aO)1W0h}~<5dMr;xFZP@t<<1T3Ls?x^%hc zj<0`ozlZX$+PBK1>NJ+e)or-o$=;(ptzPiq86KYJdxP?#dXLJ>>PM7U)%Vux8i)>W zsHnV!!@X0X!h371@xdV@KJFytb2XAa`BIHfem}+6YK9Kqkw}XRt*w)vA$*iPr}d@N z|7CE)&du{d*00ZiSgkrr?Cp)%F7${#8QGo%bcJ(Yz8GLxgrRCYmRJ>@NBmfi5w2`> zrFyZx!-eupzqG7an4&T(8W~yQ|2ZYI#4fz{4J}b!L@^c~WH4%KVU0PNXXyewXfQ&> zxI#6?$P764x2%+X@p|zWf-zkFN!Y7zoRI4 zLk2iuinWtyL@zv9&!q4pEUa@Ty3Ou*v(= z(+bC~`#Tc(B%voypRNrDLsWv;ej)FKNsk-OK9FV)Xp;(KxO>X_aGV>#Afr!=Pb1ABIl9QhRtM!rpj%b$mFY>I5ZAamZ3G!I|3%8DS1_G0gxXhKZc+* zw$s($FzWJdUJH5ptPJzF-1s~_-3ao1Er>B@PmxDI+JOu7jnD6kzFhH3>)O0w#cu#G zm|CHcgS4q-$;?&~r2yBwj?&80uE?k zS}Lc{EhCewdJXdv29Z-1&WCuOFc<01EI$MZGf)X(b!CQq9lkorFH+~*bcsM}&; zppa^Ig_o_WzVsSnu(p~ESu~+LMqKb+n@;|$Y=12SfY4MH85-deFmjzY?3UT2`FP%3 zII)lB`0Qav_9&)hLx&891p~>DgO)s8Bqv5D7bg9itzVv%!7lkeu@=Y;dk`bR_m@F{ z@+&9He`Vrs^84sKR@n`%+Vtpq2Us@?+ydUhJ}~Yp+avRqkz8PrQiueK23msrq(p3{ zqzcaCUP$j;rLv403)J~Oim4fx2@*7x5sN_v6dj6!OteS2J&2dBQZ5rxW~SvhBH*5= z1P3P!Ap&P`U2|qpw?a3lg&m;u zU{M&UuN6hup`l^!3Z2sEa`Qqg@DCknXt-E&OdHKd0m2X+Hbg$$uueA_ItCnUH}(^N z78bgm%63%=WjO`{Ql3(`WsJ=Lgd~S|sDmYbCIi!kEtMcXN=p&MT~ahmynRW~n*wW! zkSFKP%_{xHA(>7I z6nrQ^29hjgfSV7Zr-JBUq6qN@fR2Ri$g!St`EVA*Ed?-M-GOQT*hnqRNJkMqcNEbk z>Io%aen?TMoh;<~d@OOt63gKc4d~5-y~fa>iY~_5Dzj;+IOoQSEfjk&>%05SiZ<4{ zXmidRw#IxSEls1^u=>>KWFER;C;<^L!aDT9^FFzA>-!*Lm%I;{V|{-+du(A8Xb~YhB(&cVxjgngA3r2*nN_3K8EfUNvkxGb*27*o; z`gxQ^QB&Q87eOP0oIt`5r~+0Za*0n&y|ykv6{i|&r~nh^n#SS{onHl2fLI^6Y4}j0 zZ=$ebiZy8wo16w#A2`h)BPb2V1v7%;`z&Xqvwsmh`B;fpU@9WY4v4-4@|R#v^Nl?U z3}5l2Yf-7PR#bgZsHPzUv(o-xFU#INw2PGJj)zv4fI%ALjt|EaRfB#2V@Sdf$Y7v+ z1#1E;AVuJWa%G7Nbgqya_(Hf{=23MoWkkes!-X5is3~P^MjoO~kF-1EvX;U+2AW~P zHl~iM(<~y7wHYW5i~s5Wzx|KH0?bc(TimwQkXc@vRAQ$P2si{UoC8Mj2X2Wn5XgiG zxlP3A1_eI=ylOpaJ5#)6fD6%4VrHcNZ_Jl5%p-~>mPOY(GuFHt2S)TU4cpd=DsrbZ zR!q@TC6US^*_$Q?3F;F(5X<|eLojy*hjYQ^jzEMf9Y~acx{FCIb@*y>pJ19)QCuXV zzUi|wj;6wVQ`zt@U%AkFJx-uq6XZUiLCv$N`4j{7KnM&Z$3G$r(@AXIha246uvw36R<_SdDcNPF{Hdm4+XeBsJ!eOE3TJ<;^DUOnUy6 zALcjAn7+m%`0ibOwXV~;8Mg+#b4TB_oiJR*k5k2Rjat?A)VR%6 z_o5kNuYK=>kM4#+nzM=6RR2yxdsjN!f`Be$`H|WbUA+D30WQj8B@27+8#;Ot^_4`^ z6O=vqog0}nCl6S=JzC?ux|5E}Y(tm@THv{&-Z={hPb9#DhcyHHL9`MWDBz}X@c4xe z7#Y6Swxtiz9=QZ8{qiH>Bqrywq@-$+dP*9u9?Pge;Bn-ND3x)f4S);eT_X`X5+2CB zfGh}UF+nIrcN#64CA8atC+D*qN0N#LFe%L>!If!oW5h{WyQ#C9il^1s%9qqzG&|h2 zOJ=cSw}bsFZLF^DuTPJ}FK#3|_$WCyw000L#er^D6P2#==(q@1jmv9OgOjU?bUijE z#)PCb(oCden8I8gs4Z0@oRCakADKDXTZ^9Wjf|=u@xt-pZ1lX+f?GuA=y-RJqy#3L zvEc)2KTJV|TpIo`UY(m$Xf|HI$0+d@%qmu!3}o5{NV zCeZu79lo3oEH77%QVrkBmR~)}^d%=+Eez7tbp&3=zXvZW+nr0d?T!P*>jC}nQ*B?Dd-aajxwp&= z&e|(-dqbYqL+d%|R&{d3UMa5SlDk?;R%@H-rmayWVV#otelNCH2pjT?tP%vZoV{K+ zDvXCmo7)$;aM!kBE>7BKj{!U;PwDtbTUSHJgpQUmD@M}urrA*P4 zKM1hu#NR3!AVa&T!DHXQHRyc-e}>_M;ULie`=Nc=hTl;>`;_1jB5ZR0)4`oP1bzJy zpA>wZY^&q72$!SA99UpBd>2y)4eYd^K;gx zV;ACUyr^B=P^vIh!euR*Y~Aitg}&tCF1D(+{4blTV1*M3I$|nwQs-Slg5N#$OpFQVD@wKzzbGlT ztJ$E9Vlj|MK@n_a+$jdpsD?j}4iz=z-|E)mhAYZSi=ER6ob`OG4Fo zaq5g>z!N5WbRpJdsi38%*`uSzjpe! zv{z8Di%LPe$t<7W!JDTI($t%())=Z?pdjC3h*KMudDbkW^k+oR`{EB(08!oesTzw^ zTBfVF{j)%owy=)d=duGJy0+vIfjfG@N|Eia&W`GCXkmo^Q0c&q<4cziHC;Avo ziT@nkwtntOI;LF2C0(pBMb}SiIRona;D?66C-*)?2%<59`BC8WA9^a8UBu5(&ic@5 zgxy*cESO$w)_NM4iq}%2QX-__C3Se{2Ej;etwxN>i`5*9T-^VxAD}_wLv&WyB}gro z79LL(5~m+e;p4wQ{(}fc%mQCh@8QaBeQ@sRpatudv7ZY9iwGiP(GSfjM3R!;kF(ro zOgrk-w2^#jE7p^Yz*P))mqH&{AwL^ zPxr@zaQ5ob+7yU{2>#z97Yt!btQG{may(s?c?R`7M0-NdGL%;%o2v`VA0QR#Ea!`I zP$_r>8}(zAkzy)QbedHtR8(9ohgC5UkL)h1fqyWc>{u67xHO{m&H4v#n%gk7lFR=v z)N(rp2m^;otBiz|S)xNe z<-?Rna}rZ>46NS*y|A(j_Q2yXa6H3ykZYUXjIUOUq|V=~13QN~r#J73=IW%>i=tJ& zMHamL=p{Z77SQ4~7(PMy8~8WTQQkDUYRQWn202@nim-lp5Pg}e1|=6Y-vcw(Ua96R zcIaGTVTlu;p72GPLc_znM3*80EkijxG|M#BzMO%#^ZZ_I5@#F7$UF(N|ZoZkMvOa1#Q?(^ns6HF($c zpqwS|!~Yt>K|Fi?>yw}f%ZQbv^T^w`k4HoTHPwa-i?%Iut!w7lHLjPi=i^s>^X32j`-b65FZql{O=E0(XBbRxA{fTif~tp z0JlrlCDibj7d-kT^^->h%lS3BgrrolUR{(`q}CsU)p4V7)kIwN=*Wom*}>fG&dzKg z37Vh_BIq@`CoSQ*7BbM?N+8IOCn3O81wyZy-GagwoD`%KG=c~O13^`#XM|+W5CYb( z_f=K_XaV&2-KES~&Zuh4%xqNQUdLQqk*w1t*GJIP`gM^aZH;H1HdS7P0Mmg^%$)G` z;|6xE^b8ILs;_U{n9{)PJMT>@Yv@(J^_H?%RhA6EQHWwFNYQluU0Ujy{%+29(;g{( zHy@_NaD@mVAy=G&@QvmcvLOkA z00eLnYOIL8?S_~cgMlGLf=QDv1Wvn<3&wmPPYKA$1Nli2g2-{hZ=|0v`Ii`Jnj}d; zFbOB`()XH$5Np^1as2x%fCI00U7v@dzWo-Y?pd|U6aN&RG=KALQ`7XoDzA65XVa!> z!1NTE{2Owc0=?R{zGNwM?yDe#722|B2qEy=VDwZ}?Ade2l$Hc*T6t)i@N{;@c19Nq zsxO3gr*KiX4ZZfACOXD*ztqB1P+$o_kojseu&vx=&JB7i9; z?V|{_FVZ&}DyfO*XKv+M-aIjj?&&fkHV_(~ASW~mu5iT~0<>2-5EfHT7>RP~cjt_ahk+OQj4#cdcw0E~ zIgLjgs}a#cL_8lzWil1F&|-?i7;wzMZUPPhP1zSi^P;1G&HQ3`^tcT$5+bN@k_;K7 z#R3A95x5Jwa2nQ61bH~ZfdCykEdtC<^;ut2quJOHSFS50caj?uR6{q3ivfW0);b6L zxvtQ+HBbChI4DXPk^!BdwB$xvY^34E-?o`v&e5SJ{X|JIJ2?10aWO4e;fZ`^@#R&% z>`4Z@&fWIx+uxbwP3qjg&vU6mim6F;yt%pgBcHC~UAsI$a({nckfm)!paaB*u+uv^JM%+?CP^mFPqtse(BE9i& z)RJ}9t@j5Q_{}C0B=q*x>ClW25t1-jAsL|tO{g?f&8WK=B@s%4V2~#k!qU>4IJffq_w40*Bcw$(Trx3@e7`7|^#) z5Y@xF8QKWqs;j5NdDCyz(9#|s@I>@Z7#;PTx!~!}etfj)i;2>*UbKpH{BtPG8(!?0*fERB|i z(2-Vo`r-~%0vK%+7-6Tu7@n)KLS|cB82}|a?m8y1?D%nm#kEUu;esB&gc9u`2zoD6 z7iRSP`{6E@5P-7-T@Nt(>H53#;v2Jrc`N(__dO7A%-;B_?6tX|JTExAF+Tg3h5K)d zbNzajKd4<=45iNolBe_q4o7-VvgF67Bry?uengDqsUIcDJ?SUl)CLT=A-h<KBfdZ%O zqaph;6bL2e((^Ttfq;l-PB6=)OE>wUHccVjt0-3Nl`3Yt4@*gk#3`^BC4cPv82>zO z@lI@xe4uuK4wXjF-^FKA;uqqeW>8aPFn8bW=9LFWHnpt+c(I?v#xP3fcI&{X(YmEe2Y&iV7xgx6hL z1koWxDgBYBF0){xCU{n#{^+vZuRi_z(Ks@d6eGXUTZ;z%fZ79zIB4L#S zIS2woLU>867cWQXGWQ7ET*1j?mWE%hw>%)s5B`!SJrVG=Jv^OOFm^HVr!WeqMN*^0M5W4EX z1smAZT+Ba7m%d7uC|=eZ3ij`>;XS{h^6j`GFi$;5;Fa(af<#{BjOZKgC^pU=myC;^ zDDNRk>=GFb_LoR%9!MSl0FwQzBIE;USi~}Ni3AFkT5vlJ=7STRNQ~qub5Bi8{mI(e zsi`3hlp_t`fjtfpjZ~RUjTtILD?JHU%JV)j-}|_{IH`por-l+?Mx=Z3@V?oX6Yfbs|;)(%O?lH~MS zh*ls7A<_|ve4Ij%bQGB$?urD#Fbo;E1xGt>zHMv!ZVH1&^&UWN&sAT_Zho3g&1)(7 zS$R{NrjYH4E{@(Ki@w3r>uolGdNp>!?IZ`()F>T0S>{T z9*OhcC!YMPP|0a5oOp zvYlN4C*VyQTA>BTNeDIfRNZ-OX2n}m#214^eNrCOuCaM+f|ud9(-S9Wa+$$ODO z2PTj`3Bc8#$jJ79;sQa-`csK)T|qP8nwq(S*5dp!sF9WzoG)nYiV6q-yow*~ZyzINt|U-YT31QyI`*6W+&-o8d9>U4=@>{X12Xt>u9L1JJw z$rI$Il$=`9FCEeR{gc$xl_XEWlF5o0>D>U;HG|SCP_ct?g!t zaSUljq$k03UH$?K#c%THjvmtU(r+-uinmK{vfvQU-A8)JM8AS>^)s0c*T# z-0M7h@CweI`yssMVq;imYpb`tH7ShpdTPR}PnPN7QJ^XwfJUE$5d_L8Y;Le>zVP|Y zU7)PEN`q_=LK~V{cJ4|R>U(Cf(PK1dwdSp;!;9!{8f`Viw@KT8(~2_u`rJrwN}BDj z-H%2TioXAvz4@a{e>QqE&!wI>7&ph5VvOeaYy3JM{Tc++fERVQ5iVXq3tfZA&@mY| z!?jC44yeuM^l&5Okl?fb6`2>ZO%kOL>v>g@+JJW)E(2W}U(#Gs z7tSgD0c8fh_(G3|AXyfyaTvYTq!)omRJS^#t{I`xF20NhOvA^G zm>G-2I42YA7kH#OB7{Q2k>rQ!vqmg;p3%!4#l|==TDi-)h>f4(j$0V}&Hzbi&b);I zHGHvNO^5}{lTIcr7l;Y9UMyIU^zod@)=!0ODSLeEgNr$F87J{nGlq!}A*+ z-+z5Y)5&Ac4u5;{co#hB^J8RIw;yj2SQR$_vNp@hvrc7gtN((NG<;}7%HFpYhqc=i zI2j}B(MsINe{T57U;ho?`uO_XnkRrs6MTdwk*t9b5-enI(hL^uJeMrHV~5?|88aMJ zf4>)0C=3nv*$)Xz{a}OZk?6qR9@`_H-Lc~E;i_tnY4L>%fW0=WhMcm9MRL77S*H+k z$GNx!g(6R#DvHU9l1VR@i^P^wAwI9_u4qPij|XPhU3=i(z2>-BDX74<@hd>yChaTv z0OmpOCXGW}XOg-wO<8v0Z(S zuY^NxOW#jPVIr8d<+^t_=-r$J4B@>|OH&h>chD}<1;SnjIcZ3)sOjr-PWCO47uHu0 zHsa@Qjp&|oM(I^P0jbrzgFbEf2oE$#+of8;t6qG@?<6NAuop*q4!(D0q$jk?)0{o- z86BOzI6mEha36poNfZ0(eKDet`2MSG)89Qff8P_D3)|w3h>}P7A=$l+rNIJL?*IR| zZGcdSP>+Jih>Vj^h{$jslW*(K=%qm!tc-hYkYV0u)+zx@F0UwzU=-rk0kL#n4&i$?4)i@v-Xxyd#+x78Bu747D^$vhZ-9&fL9i{vttWSKbQ+=SS zs~(x4d^3IX{r#zr-m8{qeQqS^ehCZxMVEMemR3^p+37|<|9s!fS&bjQUsI<(uhu;d z%^V4n#>iqaV={<{8Vr;0(^vnJ|fqH zpI5^L1}#=Zmr=s?$vJ9nzpXko(rBz?Gfj2hbvB>BLJ(ky91)nI+S z4Ov?YQ+t}yRSgZQR$tsN@J{8Auf#KcI9z)AT5NCcZAzzm?s-*d$B^fvD$R=9kq_Yn zkb_sL`g)8c=NlOUl+VnR8Nm62ftB;0(3c-@v;n*$AAZ>RXLu~l31@zIFEGNgZS~o!TV~E}E#jQM z5hm)q`gos@pg?TIULC_mxna9j+%E*<_hCMMaSH;+vGG9WZeWn#*gfC%fwyLT*AWO3 z@&I^u;R12tLp(_P5*%7mt1bMrfTEj^ZrnWkasag{H7R%nUHfqDpgA+bPqg0}$e-7_ z+%G_0cPqU%`wiK{{e{Eh-<7w%A9$EqFh>@|9mhto;tW6T1;D`zKZwwCFp0Gj?677y zK}GF^1HS_Lty6fB8%>bV4JQa>Ljc|1?OBD@WSRnC5sU0U1!FFE*|`QfE&P1AQ|Gko zeQL0#gF3YC08YErL`RLKzrPRoy)ikbw081K`$zKT@*@4K4~5#iH?rTz(=Jk{atwJA z|J!J&#AMps$J7h)c>IOb)WaB#9Zm%fg(f5tI-xp=kV(jD+(I|JJK*OQJKzB!2XX@k zh(r)A&g`TizdVJKP-$o+l8lmx6y_4h+7N()6pw%taAF3Gxt%H5RqYSZuOT-%r|!+N z{y%+=d#7IyJNRpSTEcwOgZrHdC!7uf(*si=JkLOe4T1#dyG)ZTOJeKI>;Vhcn0tYD z4&;CgVt_IvA}6fSin3CIbTAIPVqyX)(lN6OV>yPULt4^;d5!)MGA6vh&c0{i_Z_$avepi$7hrvbyHKTD+A~4A-|L4 zHiS{HkvFCqEL!#%QYVlFeakE;Gmy$rUhaABd6YfFHFF4v63^~Ua=`Y0`zhN(3K?l- zb}%QNt6oREe$xfJ{77OtEiO=p#nfrD#D~zXwz$pe#5SFD9efTo5DiHp_ z;Do?`ow+sN*(3Ed7fO4a^OsCOQM}YVRhCLjaL)+N@a6XfP5{ZH!2CS2r?!?jURO8y zYjy2b$_Z{a%E<@hF+XXwoz^J)Y|uR#Ox?#mQ|}s*cilg?6i;(B62G+i-7%skZuA( z1_JwqpH&eQ`|5lcbFazb?z&ICVSw@5muzOkIr90GST{+s1ZikMfp1`n7Z^Mo;!_?u z2_ygx;OGpXCzVYN=B-cTtYU3MK>xb|`M11Rev4~ncmH5lRp8fvjK1@ql%GrVXY?7| z3|1B-z1+_*@6$smeS`NvLxim3=#9-3jNArztTkjT}d5ej>>3gu`AcS^yac||7OUI($UgI zaiKFXY1W~8I*VfV{xbrrF*A?VSQRd~Bio-BbT2r+>VHm6qCplr7%bYk?cH~`?G(js zbxGw;YLWs9CpzO7ZUWwf&}B3#NH=n8j5cHgG6NAc)(WfOUX}&6=%zEq?(1xLqAMSw& zH2r;jmN=HC!2oOe8UbCf*LyzyPSD!9ByJsT090G!2_e?2@cBZ@e+GHqZda# zj{myPRyIx&gohx=iwTEEZv#A%|7_vx^1|8AX3h-=<1hRF5a+npof^C%!YApGE%+Dz zxy|Ll_KZSdvW{mwa$XwxOOWkx`=s+ClRn92yi9%Zj6E+>Rn`>n;=TcR9ziPdV$xY2`O_`I$c^@;G50zs!V2d0*fPG=|J zq0f3*paCtO7GCl2^;vmd-=7o)v1T71ydvrIJX=_rih|ls`uGB!$JrK?=Ogt&vob5z z4s7AX>#)q_!sR?aT|8$?PzA>y70h{^pKb}5rQ@mmiob@)qB5g0qNJd*5=aJ|kDIlDFwtR~JC(1{t-AqX(o9oy?-(>lk8;md;sM*W14e4mM9IFPBEPMYb2| z+xoA8l%}7gJdqU+c$MDFuBSRiFaGcEgv=+(Cq=T%nUrZMm*h%yI;lF|(|vht;|3X* z$|V<=ln5~5F)WI|aP`2Qii$k87%Rc_a++dxXsZm^RBSH!{ITkt3F)#POV>S{;K)Ku$6CETLwmXozTxG&vcutIz(l~@`Gkm+v#o+R? zMU~prC>rBxZK$!aH6S7`G8?kE^PGd>Hf4_3^WXUDO&1Paj^1!IRx?}aeN&xcV2rqK zym0{zwwfhZZgRM+W0EEQ8{FlA;w}xsWir z@I~%Q;co9$TP{J8`SICi>#9Q`&v?g>L+cp>m&8q8Gdx(#t=P0x*S&Huj_;x|LvuAS zt${sN*;|zvvsuF&4vOCZwKlSfQ;_mwGSZw!TXX*4^-YKb5ug3R&l6qF}TkVfJMpH`|3KT zb#QFrq?24dAi-~?l9@$RLr&#F!q?m>1*;ls9d*bep}687re#qNHZzsH@HVS&d`tWx zZq7XM{k}OJCdNqg>$h_-TQ2*yFGoG9o+}B7cz{3e;paZ``OYhz9OwbKNt}YH-}DMp z$BkE47V}ld%oJr?^uTbrh3wx#r)JjYK@6S+UWEUb**|0LI)rlE@c&LoXUoc1K@|ommftb zWMveki#0U+|6>9jLxk#6n7Vm^DVoeQ&IHT51Cy1}7 zdH&U3Pw=mN<9|puIgIcC%(|NsP8e}l#p>*!xyiMY<8%k>iAt|v>mxMwNiOv8Yi<7S z-GM(u+(ROSM2I4mAj&42{d)vKyrB(EaI(R8Ocg?56xLuovKnF94*)Jg1K{ULxBd?j zN@$V_5|EHkl6yl>kZJ}JT6Jc?wuql%65A?>xMjw*p<5ckvbt!8iKT55zKL!Zv?p$H z+){;AcK6w~83T(qYM)F|uDY$$(V)Bt;vGYrRR&m4Z-7ByeLGI5GQ&+)^&%(Qa`$AYL(~D)5}Np&nb-&zh_!H36^NraGTF zKil2or+^NpGRN1Sf9vuWl|xeuGlOPlhTVllpk4ULfYJg&1j+vv6fCilA0Rn#A%w~y zSBRg`{wV2!KWjz#wPs&En&_m4Hhe}g zAdc5PoY(hF-TQXOhHX}dGf0gh995`h9xf~~S6TX1m)l2dbnPo31Ig3`_RBE9Q;Pj^ zTkE5Wgn-wxb1C=&Z~*=XFb&M-1hZxXt>HocTAZ>t3oc)@Z!2zvy5lry9F67cz*NZ= zMK*}d)4RP9_Soy(XVA^$1w%Xv7D*}CByDN887MeObHPQr3vOhn;7+Cs9%Q%RNzNNy zL$Crfg(8@Qt5YW$jTU3JIbyd1g?NgkkU;4y zBvM{3k|?hh$&@#X6w2u$l`>MKQO*|Wl#d27eBrAr^U(sHEl3V2nF7;9DH1JOiFol! zB}!CAL!(@>6czOJs$|Jhtx}~L4Q8oDYgDgCk4A6m(`3K>T3mHitDA0WbIUF5`!@zU z{OiA~^H=^D=q4o8Lq?`omKplw$T481nFbXqG^AX)VI3T4k6bL`vVMF;ybiX-Z;7RS`z95_M9fC1^wI3vS|5t*Evvi1_H zRJIx=xKgEZ)F{EVfm~m^b>;p1f-sOzL7_mcT7?=kC^FxC#oDwfvD8wfmRqjO3M-WF z^BAbmr%$B;1F8%fRP8lF z?R0cHrApOhp@q7&YuBSwr_=iMfkHH7h~&8A^O9vfPCISCPf!l3 zvK-aUa#DY7oYjBIMavqvYSrrY!AFz9OZ%fd^_z{C(OBM=S>72048yJ@IX$0mneXWS)%6Fe&W0=LkN>O z$&aQ+?@E-Q(8UV_%~}zwDo|R?Z7(TeyE8`^gM+qP0uZ{%tp9EkJ%tIci%8cXn&3$(+L#I0jeD)RHvD zd;De4`>8*QF3rD-DEy%Y9B}0>L7P3VKmfaxk?CCE6~%BFETOq{T9oMJCf<>w?Jlvk zBRbZo>`c7Mk`o;Cp7gZGiQB^mWco?;Cr_U)O^1%C1abUAJ`g6oTG$gf=*Aoeil+cp z@~KtsrXbh=*y9z)$}fRK(UlD*q(NGVR_y9GLa(n53O&BS6aXuJ1zZ zWRSjfpS+o{-ww*W3}Qjyj9^jWUkx6=H)KAnX0uoa|A+Ow}@2yya#!4}!K z6Mk%+nrEyU-!bZsxNzM&!1tFUN zLl?4Oeso|TXs4rFW@;<6L^qimoiYseJc~G%lAReEuS;7!bP_P{L8hFNzi2H~8TEk)u7<+s)eB{>j&gwAm zM`19jg=XRClk9n!;1+@JPC!0JOw$R)BQIJG0CIp>&VJ-NKB1`wYE5m)fe5&f_fb@u zxHe$NQ${>yccW?GI{n0Z;KV9nixUhzLm}) zpo)of%E6T)+$1MPrVtkWrK4YN)xjqHKCu?a4QG&3!S}myjOslntG;03583Zy?6Jyj zbJeCtA34Crvmk897L7@ypQ%Ugp%8}~n~G9m7&$0GZ!3`+nbE;YHn*Us(t zQ{6xyCB&)GG^QyHGoFNn&s-*Y&`6tQ(%wp$S(I-OLwZvQ0XmMDz!98R9ogho8YZ=H zOz3&>1(*$2CqX#!gJI2&*m5k+BG+yR31{a6v6REYbmU}+>d5&s8sW5IY9 z-MAJC{lj}2ISgz}Nki2vKoH~8)>ibfwZF{h!-0Q0sUHP-Y}7rKZDz$(R0Iq*8ME-o zr8GlGajxhxmmoBhfN84;q(JZBc zDgl=>`vhdF^r|XGzk&UOQ3b6_2wDSG?_>!1&Jm;hx>Z)=2<|sui0=VB>xF@y+Gy;R z#_KVv`^$VqQpy)gJ>J@Bg%aJ}M{3^xsp>S$20fDz&z1rT-Uuh5$T9}k#UO_&$PT4E zNFT%RVA4wxT2-ZPkAu9T0HF`oV42)CN*8y%doez-6R^&+r;H(Z$dIq?O=bFgY;ngD z%NH*-V4rMlw4Xmy(Zx(lWp*qT=iJz_g<=c7#`zJR|XXa`3 zG{3)0@;`d%mG>yW_%Z`W2bd&CA9&PlEck&8T#8nPQGk_`!K6>RQb7&G=jj&A`y=eg zHoKEvHyrq5`cE4V_*P23Z*2f0Eda?mv%I{24={ayxC$kY)Mv__!KMqx)gdnh(UB_Y zojdu46Do;qdr(@Vq&KooB7`Z?PX@J2Ft&f0QJ_TNh{?m!5ZGESFXRn> ztIp%m{j??GHaAfFco!9=gw5bpbQp?ud)yWZSf|7*qV$fLqw6$^#A9^^X`mK;`u}hL zi?nnV;IYfgVAl#wayH+7>1!4y-wY+rDB@gX^kCI^pr1B>5;u@u3w-&!3(jx zUpfSHS8zBNZ0-m|xYB_{>8ra~)H0Vp$nO)aCgX{VMD;ggb;Z$4Ti--+^6CpN^wEqH zc*la|=&_{dISk~!fO{}Oz-nA1zQ}u;Xfdh=H3~t)9*mOIH8Bfkk{fuFm!lM&0(nNr z!S@h`0WHRI2o}*83ex4Esqxe$vxO{QnOqQ&C_#%UUM4BhLq{&f#*~=me)eJ`N*=w` z>$Zu!5w;Vy*n>Y%gCJ2zgX%Wq>H1b#?8O9}4_8oWoCIt{ar=J8mwzS+T`DLMxekGd zCU!!Ah3KXpY`*j=ImU~WTH?Ft<@paN^SNYYG^c$q_8%k+ba^A(x?#8M@hP&gYxBmQ z%^P~UuzEc}IC&MuT%LUFOX{^tE>uE=ibK2!;cKbYhgYoM(lD2Mh&ej43MxM#!dWn6sX09H7l}epj zZe-d9wF{Cnu#lA ze)91R_|=E5+I=-vd0ZZqXn{27zyG*U%vY&ZJx`6#xawXsGwgK~e(=%VBrYPGNDb}l z)b-Y-bFC?CqsouehV0_wA8g^KJXW$~^gn1uk7MwDuHk!BL;0PLOKC+N@Lp%O%JJ-4 zI-;vX!ra%AC>{5KYM_#7!u^K>fy7C)8UprYS2$$&yZ|AAKdU?92k4C*15tj(nQ#)5 zb46NGO-VhFfotRdRVcbc?~76!$Hu@lD9v}>RZW}eG~}5++HAw)t5uFuN!TuWgO|NgWjr}Wa?9Oj4j=s!ZT*|lcSLEFDg{`cg z1$JD$tq%mR-iUD5cyD3k+3 z42Pj!nFY)-Ao2v_TqgGuO-x!vpr4q6L^fDTl3=0j!DpmNwPXcv##Z_6$8mVvvL|U> zDEZtawfO_?k3RezlOBq3Ws>n`Y$ECUn?S#c?BwobY=xD!Q)owFIk@+z)RXLK%_J^1 z77?P&e~<4LZbb!G=}fDPneUmLO;zb&UN?gZ6$1m02~8$tgPX8%*<`9g2zU`u5-<&A zxc81|nANcNxo$aD=hJ#^N)qmXS(j9k-rq$Ep{28oBd;nifUMm!fGIGf4{Ry{9+VGD z?g>(RKS=fJU_IO~y;;my=U?YlQ(}sT9l7lNT!OhH?vLf(x`Wm(JW}_! zI+xDdZ3l|`efs4ew0#}!)eBzx-m=s`>#j(n8`7liU(ZRWu2Ud(OK~li!f7d4%`K*z zv_|>DIwkeoE^$@}8_Ek!34)r=o-SM!Mx(=xt+PUS>ewI`$L%vl09}(NbaJSrV@W53 zwx$s)j9qcCDKh05^!rT>m7u^nzQ&aDqqOZ9+;-X%V42%3szo%<*5IhCmJxEc zYEEw^?G4LqPDOwtZ){JCV;~pDXD*IrE@W4EQM{Y4oArSHzc>?F$4g`AZ6D?r&5Rx$xfh+GDBW6+o4Iw6&8dM$mGiU}uA?+drz z5mT9yIv)@c{94h_+t6siuZWzGl=D z#PNmi=x^-JPUDgDCBscJdlu8@3AGS47#YQZ3F9M$lv}b=&`QT~W&DdtD}=|HCYFP) z)en_O?7cR1GrYURDk;Q!D|}f77u-koLB0n=2u);B4f)ndP+knK=x<_(PRIvM~QakHtDI*Y(?;S)fbXILECk)d9$^EqO%XfgNyCq&=PF zsWxDnks#h3`7clPm7bXdh`dPMRrJj^N~jeQvdOqzhpGgbPs3ON5p?w^lfV<$GP0^< z%4DYG>&PtiR4g&<%qJK5G&G#p_2)$R(|2tDkV!hM9c3k5oiRl>PpXjtHL>qRqr}O* zA1Q)pj9`8U^45n;CHJ%BA*yAs@21$TMPbJEeAD)ez;&`$kd;V~!tbiROV>+I2hM8D z=%QRL@FdOs&jtY*JUl@E47UX9Sa|KmLOlGv2_5wYfUN^4L@9{Xw-V#f?Hpu~9$P85wRQir!=u3KcU>meOJ@&`1*A(*yrt zo;tBEs&H$k>&vYV-gH)B>E>7d5xnG93Nd*u%S;7RRgOdYFn}c-6&h8mHtC;Z#VXjz zE#A|(VuS`Vth3an{#Iootjr1>=9Ie|BC9A&L=3FmgMYTl4EB(DnmC?eJIJ+7Z-%SY zQYra+Rp8_xa{8-Gv}`1$(G;!mt;*n+k6z*(WdYA#iP86{euIBgeeFR5RZCxdpjU8Y z*@J^$cH%E9U7zNn);nP4+9}nTg$`UPt!;7Q)4N=hB{Y0I_T5l`jdCtHqRg>q*JLvA zUSubEu!EZdN+-6$R@d1ovFvAH&80aB>2Hw(Ek-pqdb7s}PGUKZt}vx6pFLcWg$w!a zL;CJ~sXG-cEqww(dH>#rSrcA#EvS~s`{chN;UFK}|Mf}Sf%izXyz|JAgQF$+U#)1V zo7hpijMAe=!l(Em!HqReMmf56rPUl1+O@%DbI!EDcpGXDzIr|3f|J7S zTmgMZd#VpysR}hgTIYBL|t9WQwnqEH8NUY09UM3YJT1P4S5-3bUa&tJq*Z zhH7GmV{6FRn&CfAF3%0+X1BCtgJxtyE`*WS>KX3~&vJ-Go@P>Mb~4gIxCw-n8h1;J zUUbrk)-o7jh%AEC6n>B;e$v5(%RMQn08Idg@2PdhN+Eq?W@e+FU>yqyZIa29)R4f) z8kS?UscZNdg^AK40+bDOihJYNKW@-f!uRw98m?{Jm^_Q!cix*=KC46b_S?D+eR&dq zr!mdah-R4lJB*6I`~CFq@A4|piPTH2tkMzD_>c; zXU}b0QX0x9@(hpiEiExE!9_w^gx)>4MdAI+!TQ6C3tryeoi_jHo`7;&va?%q(R3NT zWqEV<-^)xa@H~DM&;Az!;f$=aL8zU9vC&e+4fua^yRYrpqf?mncK&0d5a|W!W>XqU zCwg7A`I$zFHk$ksG~Jq2+rxR%R`TKCNZc!?Dm#p1K@wqPHD25TE5dBjIGA^MVavi2 z>U}Y0JP{ng9<>`ql@b=w{>q&Q+wduhB=bv(X%SsqTma1x9!KNHP#}Rq!fMo0(Co!@ zP)6L8+o(mA%h!_dzAHhotst#r1$cN%&V{2&2&V$6o?f1}9Q=YIBKFmYU?DPG4BFUi zC3AQ&C4K_Du-HkWUO-^D2u2k2f!OIqh?rpuuo_{cby6&wR9_!Ns2~X!auE!AJrRls zOn_1YJ{$ug3Uk(aViXq>;>vY}8JU%?;3J=zeR*}S@JY~h=N7+je@mh_v1R{0 z{$jIAY@iHry|ZV3?9*DZYZnh%y1F`p`rfSw1`u_^s+Z`CbubK|lwXBJ2D6xAkOPq% zrg4UqT_v##dr1s|0_?~Ae|wMz$EI4ck(>Jwr_{lX&DQRqDdWs>1z^W>eIOtZn{75o zS=ra8Lo-6;SjlFEWQ1Cbp{h^=YZwx=Ql@0@(LWTiC00hrtVX#^4$sdTBDM~t7R3$q zM$Yvlet4aZ;x=b>y0k+{ieV!v(Ll5+Gu-jY0qwwa1IFg@^4G90h8EJ;nwq=eqPuU` z^3uEy@M=-N;bH#F1%5d9(cz{q2ZP4M6xTiNIiEE z8q*M3_JUv%-J9hAFa%A}gvBE3b8t!CW`i4IEr*7V!pUKT@yUb0A{LyX-84QUr$HEf zeq^wmLmlVYbH#g+J%qr-M=3C3gjwV`-sv!LlvtsPQiU*qR&_dZn?3~=tr92dv{?P~ zjdsNQXIBK^c-I}*I8i-6Zm6VgDIr_X?iXKLcnHCw6NaLUE`LA5#gS6Dy~6cCJaoF@ z&WyOm>|oIf|G<3@6dSWQzNUUX4U)zLXE(-W|GIGhEk&+h`|<~MOG}XQTF1Z%bAiK= z-kzlV=_zG&ghUb%t$gYyWm0?k0XTGk<gN4Q+2W^{Zf?56zZ8I`t!l5fM7vj|{W^VAM$r^O!)a3fx$_g^?-5IOil=M3>$;gxRn&CUXPh9= zv;@*uHbn-b`%aIjGB~nn-U}eC)wh<=Cd3if(}lxARs!kQ7d$~1OUwIYtZXCEq#0MD z(uS1!kxV*sM6Zl-g+PN>v@2*W9TRdq_jpK52IbgBKMrwD>Q`-6%6j3uvy^y5Oq)C& z6KvdMTDr9R=b!c7px*5&17%QcM&b-LCG@X3Ob$~~Vh{xE@axW3kin11a0~*sh{0B? z!mPk79%knKP%klhpjW&nw0=kl_iGa~{V9>f;!UQAT9BEzN>$e0pHr@IT?UuU(hyO| zN83KD4*VbrzwHD}Po=I!=1qH=m(W9dzh1)C@4c8PSywe#iq8%Jt4#u#UC0Hb2 zN&-h#6@w60hGV)p%aSA(8JF*OxHf-#6dkp$ygmq&GY;$^NeGk@R+trRRB={u6q}!% zk2w>j4jKwkpOoQ`hCH$0?)>&x{Jz&wFbsh*^b>Koj)aI2)PBLY$F{Rp9%$9=v z`)ftdZ>V}FtqYEt2l1j(QGAfxtDBU6D;yS&3P+Wr@+Z1`gkw8IM#0&5W$gpy0|206 zkkf`@(3Zm-D;G3M@=4vK zeD~V*%1ECypGalBCp;}2rgwg#djclJ2y;V-LL5cqSHX-HBZRPlDeRLpMwDaNcJVf( zNS0;Az$+x!cH`~)vhSg_7*y{CRxeofmHO-_*_6CFrN8KI6sBs`d!kCB_Nb$-i_GT! zejwbP!W}quN`hmrcKA#WGftZs=0k3ZO}l&L zIjQlx^#3RrZyw+d}eQieLa46psTW?Nc>1KcJ*QI%oZ< zSiUZ&6(qejO**$EzYbc^{NVZ0xgE)XQc4Uagz9kCuwKnknkfTIS4_RnOMW7~8UrDhAP7lP1YjpJe7bcAD#tqFEer z``h1cuk*w$A<&#`QBy`nqakkI*_DVzr2SQ;#ciB-gd?U8gMRRqtad4_XRY;L-(v2y#0Wxh!a69W2K<+>RSJ9IOMI02l+9vJ$+( zk?39-c%)#rXkoXCQG1ltG({r>WHea-vUGf2O{;q)Ubo$3NUWX%#!f-Uqc1+=SaUIU zE=yUhG%S#Ha<-UQwMy1A+vKxs*~@nAh3v8m+T(Y=^tCJxEh;^BrgurSeMWt~V#(L8 zckIhf!{xw&>9ft|*|G0jr4vl11S;l=n2eZpZ&m~)hC{50*Obv3dP$dR(D?VyDqCx! zCb4y=OuzO0(T36GZoSl(;T1QGXTrbyS!r&fWzE{W8wutyY#dY_gx9t54K|wJ_)Rl- zihuccnBpa$OK$2T5Rto&;;96`N?`Rfg@M+`m=~S5jzEOhdG7EL&Yk-)ymqWHtYz+8 z@BF!mVYHX84X-&kO1p@L)V_ca|D~*8P{w{^i&OK3ADh<-iE-6N+>a3I$CJy>UCzRt z&n&j`R!d=F?^fLG#Y`K6w_4)nspf%4O&P8~H>w-T*+Z}2kHR#Ly8rsn?2j-0uhE-% zF6F$%x;fewZS9S_Dyfe{-#|nL@S^S%!bNKtscSM@n#a>dghQ%N0_w5_?E+%XvyrOz z0-CGLVnyCT=;yQj6`2vTO*u`gFpH{{bph`ZHj!2%7d4l}g>&wHpE3hqda<1+DUO43 z!s%_sy%++OHt~qLCY1jyd{xyX1ic^G7CexJ*yV`8k*pfaLrLomLZ-NU^nO5O5JrZ{ zJWHq~8L35T#U&dIEN1^bYjsG<5lBh*si3PeNiXXZlVu{{?eA=kU>J<)) zM`CEWYEv*K9z7)-wJ`LZ0nMq-yoCX^5{217Dx}L3PbMyxDoBG_AzhI8^dm!J-9HWf z&C;l10~IA-tFKQueu}(;5r~8yOknOELl^rWy*KdFPnk!WO+Q`hstdbv^reRz&dz!G zQnY^_^Y9hodu1Cm)Gwdm^th5{l*ndCyzZl@ZHJdt>~oBPmx(|exgNC+NT>v zY}Qm{oyywQ@TDMe;LwKTy>BlLn?DpU$QWFYR}xmqa|4(E`tS73Pp+laJ^^7v@FAK= zaTZcWa)>)iv-BC~h3vQ;JBEe^b5fx1>hgjf`}#oV&@Sb;2db${YC>>+%!o0&ZRO#^ z)iu0r@r4T@tj)3^r}`9fjaidq(#nLRLPEkaIa8;~Lz1>;F>5q(Mc=6qUsQcZKB>DG zBa_^wHTbWuJI1P{mEvuZN=VzJb(Lh)QGiv~ejYL}jD)qUY+6fXOL=L_=YCByy>;3; zr(AbuPL`F;TA-P~Dp)*VZ=1O~`R!vXh*f>r4zYV`!&52tW1jS=>^JqRJ1BDGTi?I5)|49GO+ezX^AYT5#W zg~LLEwu(L>XL)<6Gq!&mQN8hwqM!-W@==2Vhv)#JzT3foZI`{~FiycL&hl z_k{7nw%8-`q+v-&c1L4bu$0sI|9|W@V3J|nAz`s%>o}5OD%``QTjn!nRZs?}7GCXP z*$>zkbRZh#6|I%rG~a9JH5Ujb^GyDH6`EGPk;P=jk3_^dc5h^u+U#k3D>3+ zDr-MK-RS3^@0&TL@uLrF>ka1(rpKXo2g6j+>gdeq3^JltELKX=SO1#hD@gPcVhAMq!XKP7?X*kFy1Si2~p3U*ESxR4W84IjqcX#dcmJ_1AAJ-fjvp!JL|%I}HZ1 zvEhD_KH5A&k8B3bKFD2`rJ7aU)6me5?Q@G#+MCk#vu5e%`VxMDx2t}7HIDTo(9+Xa zV>&u+(I(S#&+E&Y*YY1%8&}+le2Cnjd%rRb4PuI#wlODZrnhZxpRUzRTTZ9Vx3?F^ zBx{n>JZ0CMU}+aQA#*)yyZ%r3Zpf14KtY`l#i9 z;W3OLoc;0rz=*zWtIuB9GI?%mvEcOeFnP;Vs$!sxkVc7ys1iwr44RiTM03r58x{^E)uEA~z|g{;l$^|M`r2@4gXs@VB_snE57$_d7LCIPL}80aGG7 z&mxxd!X$KkW+{%N#LJEBffMDu9T0j4b|4nBU@V0xw;kDWQBG10)-j}YyTRB(c_>K< ziYg`$C}E@0s$@dr6e@*SaWxnw8o_sZT;t~ngRZY!g9Ui8kVS^irDzu^&DC`FkjCKgu&AG$+9Cly^4LItv+bxTM1k!9AZDsm@`5@mvO?%>RJb5z$a(sdtC2B2lfF^5ER~JcVMSE5UgVb6SS# z#ThN)bPUsS&YjYdjjBkiuTh{sqYhFPkD1NBv(~OnPL@(Ah;*FW2DL{?6EJ6!5sV-sUk)AuwiwC9=IMo;) zjDZLcDKo??!bC|6gDGm^1hzRI_ww(t zv$@?r4(Tdz9Z@qE{*&@csrigKLzuy-gH)HgSoQ;EZF1M(T`-biYf3r|mJp@%rN+;< z>gga5g|xMv+N0zR!_$#GC8qxSw=r0jvAk(kTPAJT5TKR?YybUkw|HN~F-+UU&XpsA zKPfHdIUZ{%yO4lMPbY&LorL1^Lv%#@DRayo73~e%fP*#01&P3UeGb)}*eWS2le8u_ zQ#pF8p~G|EP)7R826K-TPQFX=9h-uur84#mA9&S=-V(2i_>QP92M z{ObR68WSw)n4Vzy&Ta3#w{539W~)o3anj>77;@LfR&I0yA(z#vr9Ac%GFtm_KX8aJ zvZL%RQ^R}YfmqyoYu;~{#r5z^m_{^ywYUdY?H>Fsc8aJBSix)~xI4Y$JA3xhrKH)+ z-y`p)uK9u`ut#gx-@Qvs$|(^YPKRF}I%kPGaA{3+bEI4cbWbARVvM9AA2F7{rEo&6 z3?j1iA%~n4HYDD@c#FSv>o$M!_Sh<;GI=PZiZaeBReO+HvOwu%f$Ydm{vFaX#P;Nn zQWJGrsaNIe}emxb?LZ=)3k-g2gbsr#Mr8V8G=>*;TsAH zjmIhseuaWILC!Jzv15Rir7;h8U!=ya&d$DAj$xpOHG7prF4XBgpYIbicPLO!?%DgJR?aKW%nJ@K8pPEXgFY9yu-#{WYlnan z=S!bA%<@h-k&u|cg}=G_$)s>pef^NY>%#;<{jVV)#EQ5SW4b>7U@r<#Yy{_pSj%qO}h z#p=w-%B~+PADnlIKc4=he2DOkb5e0@~0mXRBqVV%pci*n8EaFPUrDC(3p@dtz zRfYDdl$vhM!M=-v7PzBOd)8$Zo42(zaaz74b*tvnXB_SVZ(?Rzxxs-?QN00vJk_^e zy83|GVkdi!$iWuaIFEkf_CY4}zeHk)&EsIzy)USnSGh%DMhb5HDw^ce;FHdom{pi$$o9u$<0cWC@ujRV^oQswF z19!OR{N!tIc?jTfWJ1O%Yx^a@p0+?7=PW$ey?GFa{;Ii?7~yJP2RX^VBkn@vq}T#% zv#UO2yVfm1%>t>2WLxixkJYu(VMi=97il@M4X~BvG}QjC6eIV@=QeX!905UnR};CA zTRoc-u=0fT3u9`fKQxO+D(w09h`X(&s%0%g{Qh}WHf5t(6fRo64s3DEm9)VURpTJj zU@S<9V2MQ+mO{STRsC8*5~^vua6e?Wu7OJ$x<5UR*=wh4cBJGNu;p;Wq+tC~uTQAg+i?=VtzAu-`-{s98er>tjyWw4 zeznQJd)24(Wb6qCd#%A#|6J+UUegl#+FvXN{Z{s>zh>9gy-Ddy>_1=H(TDSDX7?39 zpMZRo%#=X&el>eATvr${Y%B(_qhOP>{a1DkYaLQI>T;5+1Q6t#ZRuo*HI(VD5YdZn z=R$(&wvM`%Bc*Zqf3TLtCD_Q8^TOM>zV1!&k+?a>`@ud+myNSNe&2T#yuT}d@KugW zR6Umy_TmBg+Y)}(*S@gx@~%P&z?e7zp?q5^D7Y@aA|w{0Ngeu$i^^lXiEyS!a!t+u zVsLXQ>?mg~@FWLR3DEyEXk7^ZcCX2$zqkKi#SW1Fsp*kzfG$s-+y77J(!*xD5R42R z&(E{?s;aePwGKSbDMSi&*`=Y|yd%pFtY>3OlM)ZhSM6xGXm(), { setCustomComponents("chat-message", { ref: RefNode, - code_block: MarkdownCodeBlockNode, + code_block: ThemeAwareMarkdownCodeBlock, }); const route = useRoute(); diff --git a/dashboard/src/components/chat/MessageList.vue b/dashboard/src/components/chat/MessageList.vue index b83fdeef9..d3070f73e 100644 --- a/dashboard/src/components/chat/MessageList.vue +++ b/dashboard/src/components/chat/MessageList.vue @@ -237,7 +237,7 @@ diff --git a/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue b/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue index 4ac9e1d6e..bfd501ccc 100644 --- a/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue +++ b/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue @@ -9,7 +9,6 @@ import { useCommonStore } from '@/stores/common'; import { MarkdownRender, enableKatex, enableMermaid } from 'markstream-vue'; import 'markstream-vue/index.css'; import 'katex/dist/katex.min.css'; -import 'highlight.js/styles/github.css'; import { useI18n } from '@/i18n/composables'; import { router } from '@/router'; import { useRoute } from 'vue-router'; diff --git a/dashboard/src/scss/components/_CodeBlockDark.scss b/dashboard/src/scss/components/_CodeBlockDark.scss new file mode 100644 index 000000000..afc4f7ab7 --- /dev/null +++ b/dashboard/src/scss/components/_CodeBlockDark.scss @@ -0,0 +1,19 @@ +.v-theme--PurpleThemeDark { + .shiki.shiki-themes, + .shiki.shiki-themes span { + color: var(--shiki-dark) !important; + } + + .shiki.shiki-themes { + background-color: var(--shiki-dark-bg) !important; + } + + .markstream-vue { + --border: 217.2 32.6% 17.5%; + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + --secondary: 217.2 32.6% 17.5%; + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + } +} diff --git a/dashboard/src/scss/components/_HljsDark.scss b/dashboard/src/scss/components/_HljsDark.scss deleted file mode 100644 index 1b084ad58..000000000 --- a/dashboard/src/scss/components/_HljsDark.scss +++ /dev/null @@ -1,107 +0,0 @@ -// highlight.js dark mode overrides -// Scoped to the dark Vuetify theme so the default github.css light styles work in light mode. -.v-theme--PurpleThemeDark { - .hljs { - background: transparent; - color: #adbac7; - } - - .hljs-doctag, - .hljs-keyword, - .hljs-meta .hljs-keyword, - .hljs-template-tag, - .hljs-template-variable, - .hljs-type, - .hljs-variable.language_ { - color: #f47067; - } - - .hljs-title, - .hljs-title.class_, - .hljs-title.class_.inherited__, - .hljs-title.function_ { - color: #dcbdfb; - } - - .hljs-attr, - .hljs-attribute, - .hljs-literal, - .hljs-meta, - .hljs-number, - .hljs-operator, - .hljs-selector-attr, - .hljs-selector-class, - .hljs-selector-id, - .hljs-variable { - color: #6cb6ff; - } - - .hljs-meta .hljs-string, - .hljs-regexp, - .hljs-string { - color: #96d0ff; - } - - .hljs-built_in, - .hljs-symbol { - color: #f69d50; - } - - .hljs-code, - .hljs-comment, - .hljs-formula { - color: #768390; - } - - .hljs-name, - .hljs-quote, - .hljs-selector-pseudo, - .hljs-selector-tag { - color: #8ddb8c; - } - - .hljs-subst { - color: #adbac7; - } - - .hljs-section { - color: #316dca; - font-weight: bold; - } - - .hljs-bullet { - color: #eac55f; - } - - .hljs-emphasis { - color: #adbac7; - font-style: italic; - } - - .hljs-strong { - color: #adbac7; - font-weight: bold; - } - - .hljs-addition { - color: #b4f1b4; - background-color: #1b4721; - } - - .hljs-deletion { - color: #ffd8d3; - background-color: #78191b; - } - - // markstream-vue dark mode variables override - // markstream-vue expects a `.dark` ancestor to activate its dark palette, - // but Vuetify uses `.v-theme--PurpleThemeDark` instead. - .markstream-vue { - --border: 217.2 32.6% 17.5%; - --background: 222.2 84% 4.9%; - --foreground: 210 40% 98%; - --secondary: 217.2 32.6% 17.5%; - --muted: 217.2 32.6% 17.5%; - --muted-foreground: 215 20.2% 65.1%; - } -} diff --git a/dashboard/src/scss/style.scss b/dashboard/src/scss/style.scss index 6a572c8a3..6e02010ba 100644 --- a/dashboard/src/scss/style.scss +++ b/dashboard/src/scss/style.scss @@ -13,7 +13,7 @@ @import './components/VTextField'; @import './components/VTabs'; @import './components/VScrollbar'; -@import './components/HljsDark'; +@import './components/CodeBlockDark'; @import './pages/dashboards'; diff --git a/dashboard/src/utils/shiki.js b/dashboard/src/utils/shiki.js new file mode 100644 index 000000000..cb9eac828 --- /dev/null +++ b/dashboard/src/utils/shiki.js @@ -0,0 +1,91 @@ +import { getSingletonHighlighter } from "shiki"; + +export const SHIKI_THEMES = { + light: "github-light", + dark: "github-dark", +}; + +let highlighterPromise; + +function normalizeLanguage(language) { + const normalized = (language || "text").trim().split(/\s+/, 1)[0].toLowerCase(); + return normalized || "text"; +} + +export function escapeHtml(value = "") { + return String(value) + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll('"', """) + .replaceAll("'", "'"); +} + +export async function getShikiHighlighter() { + if (!highlighterPromise) { + highlighterPromise = getSingletonHighlighter({ + themes: Object.values(SHIKI_THEMES), + langs: ["text"], + }); + } + + return highlighterPromise; +} + +export async function ensureShikiLanguages(languages = []) { + const highlighter = await getShikiHighlighter(); + const languagesToLoad = [...new Set(languages.map(normalizeLanguage))].filter( + (language) => language !== "text", + ); + + await Promise.all( + languagesToLoad.map((language) => + highlighter.loadLanguage(language).catch((err) => { + console.warn(`Failed to load Shiki language "${language}".`, err); + }), + ), + ); + + return highlighter; +} + +export function renderShikiCode(highlighter, code, language, colorMode = "auto") { + const normalizedLanguage = normalizeLanguage(language); + const options = + colorMode === "dark" + ? { lang: normalizedLanguage, theme: SHIKI_THEMES.dark } + : colorMode === "light" + ? { lang: normalizedLanguage, theme: SHIKI_THEMES.light } + : { lang: normalizedLanguage, themes: SHIKI_THEMES }; + + try { + return highlighter.codeToHtml(code, options); + } catch (err) { + console.warn( + `Failed to render code with Shiki language "${normalizedLanguage}". Falling back to plain text.`, + err, + ); + + const fallbackOptions = + colorMode === "dark" + ? { lang: "text", theme: SHIKI_THEMES.dark } + : colorMode === "light" + ? { lang: "text", theme: SHIKI_THEMES.light } + : { lang: "text", themes: SHIKI_THEMES }; + + return highlighter.codeToHtml(code, fallbackOptions); + } +} + +export function collectMarkdownFenceLanguages(markdownIt, markdown) { + if (!markdown) return []; + + return markdownIt + .parse(markdown, {}) + .filter((token) => token.type === "fence") + .map((token) => normalizeLanguage(token.info)); +} + +export function normalizeShikiLanguage(language) { + return normalizeLanguage(language); +} diff --git a/dashboard/src/views/WelcomePage.vue b/dashboard/src/views/WelcomePage.vue index c6c497819..ce724f92b 100644 --- a/dashboard/src/views/WelcomePage.vue +++ b/dashboard/src/views/WelcomePage.vue @@ -200,7 +200,6 @@ import { useI18n, useModuleI18n } from '@/i18n/composables'; import { useToast } from '@/utils/toast'; import { MarkdownRender } from 'markstream-vue'; import 'markstream-vue/index.css'; -import 'highlight.js/styles/github.css'; type StepState = 'pending' | 'completed' | 'skipped'; type ComputerAccessRuntime = 'local' | 'none';