From 6092d1d7b40e7f23c7515b1a9d54a953f20f2b28 Mon Sep 17 00:00:00 2001 From: zxq5 Date: Sat, 11 Oct 2025 01:52:21 +0100 Subject: [PATCH] megacommit --- backend/Cargo.toml | 1 + .../20251010231008_invite-codes.sql | 18 + .../20251011002049_invite-codes-v2.sql | 10 + backend/src/auth.rs | 282 - backend/src/auth/account.rs | 182 + backend/src/auth/mod.rs | 8 + backend/src/auth/session.rs | 76 + backend/src/auth/two_factor.rs | 156 + backend/src/handlers.rs | 62 + backend/src/main.rs | 13 + backend/src/messages.rs | 5 + backend/static/favicon.ico | Bin 15290 -> 59951 bytes backend/static/highlight(1).zip | Bin 0 -> 2979207 bytes backend/static/highlight(1)/DIGESTS.md | 169 + backend/static/highlight(1)/LICENSE | 29 + backend/static/highlight(1)/README.md | 45 + backend/static/highlight(1)/es/core.js | 2600 +++ backend/static/highlight(1)/es/core.min.js | 306 + backend/static/highlight(1)/es/highlight.js | 2600 +++ .../static/highlight(1)/es/highlight.min.js | 306 + .../static/highlight(1)/es/languages/bash.js | 417 + .../highlight(1)/es/languages/bash.min.js | 21 + backend/static/highlight(1)/es/languages/c.js | 341 + .../static/highlight(1)/es/languages/c.min.js | 41 + .../static/highlight(1)/es/languages/cpp.js | 613 + .../highlight(1)/es/languages/cpp.min.js | 46 + .../highlight(1)/es/languages/csharp.js | 420 + .../highlight(1)/es/languages/csharp.min.js | 49 + .../static/highlight(1)/es/languages/css.js | 957 + .../highlight(1)/es/languages/css.min.js | 31 + .../static/highlight(1)/es/languages/diff.js | 70 + .../highlight(1)/es/languages/diff.min.js | 9 + .../static/highlight(1)/es/languages/go.js | 164 + .../highlight(1)/es/languages/go.min.js | 19 + .../highlight(1)/es/languages/graphql.js | 86 + .../highlight(1)/es/languages/graphql.min.js | 12 + .../static/highlight(1)/es/languages/ini.js | 129 + .../highlight(1)/es/languages/ini.min.js | 16 + .../static/highlight(1)/es/languages/java.js | 299 + .../highlight(1)/es/languages/java.min.js | 38 + .../highlight(1)/es/languages/javascript.js | 777 + .../es/languages/javascript.min.js | 81 + .../static/highlight(1)/es/languages/json.js | 62 + .../highlight(1)/es/languages/json.min.js | 8 + .../highlight(1)/es/languages/kotlin.js | 294 + .../highlight(1)/es/languages/kotlin.min.js | 46 + .../static/highlight(1)/es/languages/less.js | 1058 + .../highlight(1)/es/languages/less.min.js | 45 + .../static/highlight(1)/es/languages/lua.js | 89 + .../highlight(1)/es/languages/lua.min.js | 14 + .../highlight(1)/es/languages/makefile.js | 97 + .../highlight(1)/es/languages/makefile.min.js | 14 + .../highlight(1)/es/languages/markdown.js | 256 + .../highlight(1)/es/languages/markdown.min.js | 32 + .../highlight(1)/es/languages/objectivec.js | 261 + .../es/languages/objectivec.min.js | 23 + .../static/highlight(1)/es/languages/perl.js | 512 + .../highlight(1)/es/languages/perl.min.js | 40 + .../highlight(1)/es/languages/php-template.js | 62 + .../es/languages/php-template.min.js | 8 + .../static/highlight(1)/es/languages/php.js | 633 + .../highlight(1)/es/languages/php.min.js | 59 + .../highlight(1)/es/languages/plaintext.js | 27 + .../es/languages/plaintext.min.js | 3 + .../highlight(1)/es/languages/python-repl.js | 40 + .../es/languages/python-repl.min.js | 5 + .../highlight(1)/es/languages/python.js | 444 + .../highlight(1)/es/languages/python.min.js | 42 + backend/static/highlight(1)/es/languages/r.js | 265 + .../static/highlight(1)/es/languages/r.min.js | 26 + .../static/highlight(1)/es/languages/ruby.js | 456 + .../highlight(1)/es/languages/ruby.min.js | 54 + .../static/highlight(1)/es/languages/rust.js | 334 + .../highlight(1)/es/languages/rust.min.js | 27 + .../static/highlight(1)/es/languages/scss.js | 947 + .../highlight(1)/es/languages/scss.min.js | 33 + .../static/highlight(1)/es/languages/shell.js | 41 + .../highlight(1)/es/languages/shell.min.js | 5 + .../static/highlight(1)/es/languages/sql.js | 701 + .../highlight(1)/es/languages/sql.min.js | 21 + .../static/highlight(1)/es/languages/swift.js | 980 + .../highlight(1)/es/languages/swift.min.js | 68 + .../highlight(1)/es/languages/typescript.js | 921 + .../es/languages/typescript.min.js | 99 + .../static/highlight(1)/es/languages/vbnet.js | 165 + .../highlight(1)/es/languages/vbnet.min.js | 25 + .../static/highlight(1)/es/languages/wasm.js | 147 + .../highlight(1)/es/languages/wasm.min.js | 15 + .../static/highlight(1)/es/languages/xml.js | 249 + .../highlight(1)/es/languages/xml.min.js | 29 + .../static/highlight(1)/es/languages/yaml.js | 221 + .../highlight(1)/es/languages/yaml.min.js | 28 + backend/static/highlight(1)/es/package.json | 1 + backend/static/highlight(1)/highlight.js | 16178 ++++++++++++++++ backend/static/highlight(1)/languages/bash.js | 419 + .../static/highlight(1)/languages/bash.min.js | 21 + backend/static/highlight(1)/languages/c.js | 343 + .../static/highlight(1)/languages/c.min.js | 41 + backend/static/highlight(1)/languages/cpp.js | 615 + .../static/highlight(1)/languages/cpp.min.js | 47 + .../static/highlight(1)/languages/csharp.js | 422 + .../highlight(1)/languages/csharp.min.js | 49 + backend/static/highlight(1)/languages/css.js | 959 + .../static/highlight(1)/languages/css.min.js | 31 + backend/static/highlight(1)/languages/diff.js | 72 + .../static/highlight(1)/languages/diff.min.js | 9 + backend/static/highlight(1)/languages/go.js | 166 + .../static/highlight(1)/languages/go.min.js | 20 + .../static/highlight(1)/languages/graphql.js | 88 + .../highlight(1)/languages/graphql.min.js | 12 + backend/static/highlight(1)/languages/ini.js | 131 + .../static/highlight(1)/languages/ini.min.js | 15 + backend/static/highlight(1)/languages/java.js | 301 + .../static/highlight(1)/languages/java.min.js | 38 + .../highlight(1)/languages/javascript.js | 779 + .../highlight(1)/languages/javascript.min.js | 81 + backend/static/highlight(1)/languages/json.js | 64 + .../static/highlight(1)/languages/json.min.js | 8 + .../static/highlight(1)/languages/kotlin.js | 296 + .../highlight(1)/languages/kotlin.min.js | 46 + backend/static/highlight(1)/languages/less.js | 1060 + .../static/highlight(1)/languages/less.min.js | 45 + backend/static/highlight(1)/languages/lua.js | 91 + .../static/highlight(1)/languages/lua.min.js | 15 + .../static/highlight(1)/languages/makefile.js | 99 + .../highlight(1)/languages/makefile.min.js | 14 + .../static/highlight(1)/languages/markdown.js | 258 + .../highlight(1)/languages/markdown.min.js | 32 + .../highlight(1)/languages/objectivec.js | 263 + .../highlight(1)/languages/objectivec.min.js | 23 + backend/static/highlight(1)/languages/perl.js | 514 + .../static/highlight(1)/languages/perl.min.js | 41 + .../highlight(1)/languages/php-template.js | 64 + .../languages/php-template.min.js | 8 + backend/static/highlight(1)/languages/php.js | 635 + .../static/highlight(1)/languages/php.min.js | 59 + .../highlight(1)/languages/plaintext.js | 29 + .../highlight(1)/languages/plaintext.min.js | 4 + .../highlight(1)/languages/python-repl.js | 42 + .../highlight(1)/languages/python-repl.min.js | 5 + .../static/highlight(1)/languages/python.js | 446 + .../highlight(1)/languages/python.min.js | 42 + backend/static/highlight(1)/languages/r.js | 267 + .../static/highlight(1)/languages/r.min.js | 26 + backend/static/highlight(1)/languages/ruby.js | 458 + .../static/highlight(1)/languages/ruby.min.js | 54 + backend/static/highlight(1)/languages/rust.js | 336 + .../static/highlight(1)/languages/rust.min.js | 27 + backend/static/highlight(1)/languages/scss.js | 949 + .../static/highlight(1)/languages/scss.min.js | 33 + .../static/highlight(1)/languages/shell.js | 43 + .../highlight(1)/languages/shell.min.js | 5 + backend/static/highlight(1)/languages/sql.js | 703 + .../static/highlight(1)/languages/sql.min.js | 21 + .../static/highlight(1)/languages/swift.js | 982 + .../highlight(1)/languages/swift.min.js | 68 + .../highlight(1)/languages/typescript.js | 923 + .../highlight(1)/languages/typescript.min.js | 99 + .../static/highlight(1)/languages/vbnet.js | 167 + .../highlight(1)/languages/vbnet.min.js | 25 + backend/static/highlight(1)/languages/wasm.js | 149 + .../static/highlight(1)/languages/wasm.min.js | 14 + backend/static/highlight(1)/languages/xml.js | 251 + .../static/highlight(1)/languages/xml.min.js | 29 + backend/static/highlight(1)/languages/yaml.js | 223 + .../static/highlight(1)/languages/yaml.min.js | 28 + backend/static/highlight(1)/package.json | 93 + .../static/highlight(1)/styles/1c-light.css | 107 + .../highlight(1)/styles/1c-light.min.css | 9 + .../static/highlight(1)/styles/a11y-dark.css | 94 + .../highlight(1)/styles/a11y-dark.min.css | 7 + .../static/highlight(1)/styles/a11y-light.css | 94 + .../highlight(1)/styles/a11y-light.min.css | 7 + backend/static/highlight(1)/styles/agate.css | 127 + .../static/highlight(1)/styles/agate.min.css | 20 + .../highlight(1)/styles/an-old-hope.css | 75 + .../highlight(1)/styles/an-old-hope.min.css | 9 + .../highlight(1)/styles/androidstudio.css | 60 + .../highlight(1)/styles/androidstudio.min.css | 1 + .../highlight(1)/styles/arduino-light.css | 78 + .../highlight(1)/styles/arduino-light.min.css | 1 + backend/static/highlight(1)/styles/arta.css | 66 + .../static/highlight(1)/styles/arta.min.css | 1 + .../static/highlight(1)/styles/ascetic.css | 45 + .../highlight(1)/styles/ascetic.min.css | 1 + .../styles/atom-one-dark-reasonable.css | 105 + .../styles/atom-one-dark-reasonable.min.css | 1 + .../highlight(1)/styles/atom-one-dark.css | 90 + .../highlight(1)/styles/atom-one-dark.min.css | 1 + .../highlight(1)/styles/atom-one-light.css | 90 + .../styles/atom-one-light.min.css | 1 + .../highlight(1)/styles/base16/3024.css | 163 + .../highlight(1)/styles/base16/3024.min.css | 7 + .../highlight(1)/styles/base16/apathy.css | 163 + .../highlight(1)/styles/base16/apathy.min.css | 7 + .../highlight(1)/styles/base16/apprentice.css | 163 + .../styles/base16/apprentice.min.css | 7 + .../highlight(1)/styles/base16/ashes.css | 163 + .../highlight(1)/styles/base16/ashes.min.css | 7 + .../styles/base16/atelier-cave-light.css | 163 + .../styles/base16/atelier-cave-light.min.css | 7 + .../styles/base16/atelier-cave.css | 163 + .../styles/base16/atelier-cave.min.css | 7 + .../styles/base16/atelier-dune-light.css | 163 + .../styles/base16/atelier-dune-light.min.css | 7 + .../styles/base16/atelier-dune.css | 163 + .../styles/base16/atelier-dune.min.css | 7 + .../styles/base16/atelier-estuary-light.css | 163 + .../base16/atelier-estuary-light.min.css | 7 + .../styles/base16/atelier-estuary.css | 163 + .../styles/base16/atelier-estuary.min.css | 7 + .../styles/base16/atelier-forest-light.css | 163 + .../base16/atelier-forest-light.min.css | 7 + .../styles/base16/atelier-forest.css | 163 + .../styles/base16/atelier-forest.min.css | 7 + .../styles/base16/atelier-heath-light.css | 163 + .../styles/base16/atelier-heath-light.min.css | 7 + .../styles/base16/atelier-heath.css | 163 + .../styles/base16/atelier-heath.min.css | 7 + .../styles/base16/atelier-lakeside-light.css | 163 + .../base16/atelier-lakeside-light.min.css | 7 + .../styles/base16/atelier-lakeside.css | 163 + .../styles/base16/atelier-lakeside.min.css | 7 + .../styles/base16/atelier-plateau-light.css | 163 + .../base16/atelier-plateau-light.min.css | 7 + .../styles/base16/atelier-plateau.css | 163 + .../styles/base16/atelier-plateau.min.css | 7 + .../styles/base16/atelier-savanna-light.css | 163 + .../base16/atelier-savanna-light.min.css | 7 + .../styles/base16/atelier-savanna.css | 163 + .../styles/base16/atelier-savanna.min.css | 7 + .../styles/base16/atelier-seaside-light.css | 163 + .../base16/atelier-seaside-light.min.css | 7 + .../styles/base16/atelier-seaside.css | 163 + .../styles/base16/atelier-seaside.min.css | 7 + .../base16/atelier-sulphurpool-light.css | 163 + .../base16/atelier-sulphurpool-light.min.css | 7 + .../styles/base16/atelier-sulphurpool.css | 163 + .../styles/base16/atelier-sulphurpool.min.css | 7 + .../highlight(1)/styles/base16/atlas.css | 163 + .../highlight(1)/styles/base16/atlas.min.css | 7 + .../highlight(1)/styles/base16/bespin.css | 163 + .../highlight(1)/styles/base16/bespin.min.css | 7 + .../styles/base16/black-metal-bathory.css | 163 + .../styles/base16/black-metal-bathory.min.css | 7 + .../styles/base16/black-metal-burzum.css | 163 + .../styles/base16/black-metal-burzum.min.css | 7 + .../base16/black-metal-dark-funeral.css | 163 + .../base16/black-metal-dark-funeral.min.css | 7 + .../styles/base16/black-metal-gorgoroth.css | 163 + .../base16/black-metal-gorgoroth.min.css | 7 + .../styles/base16/black-metal-immortal.css | 163 + .../base16/black-metal-immortal.min.css | 7 + .../styles/base16/black-metal-khold.css | 163 + .../styles/base16/black-metal-khold.min.css | 7 + .../styles/base16/black-metal-marduk.css | 163 + .../styles/base16/black-metal-marduk.min.css | 7 + .../styles/base16/black-metal-mayhem.css | 163 + .../styles/base16/black-metal-mayhem.min.css | 7 + .../styles/base16/black-metal-nile.css | 163 + .../styles/base16/black-metal-nile.min.css | 7 + .../styles/base16/black-metal-venom.css | 163 + .../styles/base16/black-metal-venom.min.css | 7 + .../styles/base16/black-metal.css | 163 + .../styles/base16/black-metal.min.css | 7 + .../highlight(1)/styles/base16/brewer.css | 163 + .../highlight(1)/styles/base16/brewer.min.css | 7 + .../highlight(1)/styles/base16/bright.css | 163 + .../highlight(1)/styles/base16/bright.min.css | 7 + .../highlight(1)/styles/base16/brogrammer.css | 163 + .../styles/base16/brogrammer.min.css | 7 + .../styles/base16/brush-trees-dark.css | 163 + .../styles/base16/brush-trees-dark.min.css | 7 + .../styles/base16/brush-trees.css | 163 + .../styles/base16/brush-trees.min.css | 7 + .../highlight(1)/styles/base16/chalk.css | 163 + .../highlight(1)/styles/base16/chalk.min.css | 7 + .../highlight(1)/styles/base16/circus.css | 163 + .../highlight(1)/styles/base16/circus.min.css | 7 + .../styles/base16/classic-dark.css | 163 + .../styles/base16/classic-dark.min.css | 7 + .../styles/base16/classic-light.css | 163 + .../styles/base16/classic-light.min.css | 7 + .../highlight(1)/styles/base16/codeschool.css | 163 + .../styles/base16/codeschool.min.css | 7 + .../highlight(1)/styles/base16/colors.css | 163 + .../highlight(1)/styles/base16/colors.min.css | 7 + .../highlight(1)/styles/base16/cupcake.css | 163 + .../styles/base16/cupcake.min.css | 7 + .../highlight(1)/styles/base16/cupertino.css | 163 + .../styles/base16/cupertino.min.css | 7 + .../highlight(1)/styles/base16/danqing.css | 163 + .../styles/base16/danqing.min.css | 7 + .../highlight(1)/styles/base16/darcula.css | 163 + .../styles/base16/darcula.min.css | 7 + .../styles/base16/dark-violet.css | 163 + .../styles/base16/dark-violet.min.css | 7 + .../highlight(1)/styles/base16/darkmoss.css | 163 + .../styles/base16/darkmoss.min.css | 7 + .../highlight(1)/styles/base16/darktooth.css | 163 + .../styles/base16/darktooth.min.css | 7 + .../highlight(1)/styles/base16/decaf.css | 163 + .../highlight(1)/styles/base16/decaf.min.css | 7 + .../styles/base16/default-dark.css | 163 + .../styles/base16/default-dark.min.css | 7 + .../styles/base16/default-light.css | 163 + .../styles/base16/default-light.min.css | 7 + .../highlight(1)/styles/base16/dirtysea.css | 163 + .../styles/base16/dirtysea.min.css | 7 + .../highlight(1)/styles/base16/dracula.css | 163 + .../styles/base16/dracula.min.css | 7 + .../highlight(1)/styles/base16/edge-dark.css | 163 + .../styles/base16/edge-dark.min.css | 7 + .../highlight(1)/styles/base16/edge-light.css | 163 + .../styles/base16/edge-light.min.css | 7 + .../highlight(1)/styles/base16/eighties.css | 163 + .../styles/base16/eighties.min.css | 7 + .../highlight(1)/styles/base16/embers.css | 163 + .../highlight(1)/styles/base16/embers.min.css | 7 + .../styles/base16/equilibrium-dark.css | 163 + .../styles/base16/equilibrium-dark.min.css | 7 + .../styles/base16/equilibrium-gray-dark.css | 163 + .../base16/equilibrium-gray-dark.min.css | 7 + .../styles/base16/equilibrium-gray-light.css | 163 + .../base16/equilibrium-gray-light.min.css | 7 + .../styles/base16/equilibrium-light.css | 163 + .../styles/base16/equilibrium-light.min.css | 7 + .../highlight(1)/styles/base16/espresso.css | 163 + .../styles/base16/espresso.min.css | 7 + .../highlight(1)/styles/base16/eva-dim.css | 163 + .../styles/base16/eva-dim.min.css | 7 + .../static/highlight(1)/styles/base16/eva.css | 163 + .../highlight(1)/styles/base16/eva.min.css | 7 + .../highlight(1)/styles/base16/flat.css | 163 + .../highlight(1)/styles/base16/flat.min.css | 7 + .../highlight(1)/styles/base16/framer.css | 163 + .../highlight(1)/styles/base16/framer.min.css | 7 + .../highlight(1)/styles/base16/fruit-soda.css | 163 + .../styles/base16/fruit-soda.min.css | 7 + .../highlight(1)/styles/base16/gigavolt.css | 163 + .../styles/base16/gigavolt.min.css | 7 + .../highlight(1)/styles/base16/github.css | 163 + .../highlight(1)/styles/base16/github.min.css | 7 + .../styles/base16/google-dark.css | 163 + .../styles/base16/google-dark.min.css | 7 + .../styles/base16/google-light.css | 163 + .../styles/base16/google-light.min.css | 7 + .../styles/base16/grayscale-dark.css | 163 + .../styles/base16/grayscale-dark.min.css | 7 + .../styles/base16/grayscale-light.css | 163 + .../styles/base16/grayscale-light.min.css | 7 + .../styles/base16/green-screen.css | 163 + .../styles/base16/green-screen.min.css | 7 + .../styles/base16/gruvbox-dark-hard.css | 163 + .../styles/base16/gruvbox-dark-hard.min.css | 7 + .../styles/base16/gruvbox-dark-medium.css | 163 + .../styles/base16/gruvbox-dark-medium.min.css | 7 + .../styles/base16/gruvbox-dark-pale.css | 163 + .../styles/base16/gruvbox-dark-pale.min.css | 7 + .../styles/base16/gruvbox-dark-soft.css | 163 + .../styles/base16/gruvbox-dark-soft.min.css | 7 + .../styles/base16/gruvbox-light-hard.css | 163 + .../styles/base16/gruvbox-light-hard.min.css | 7 + .../styles/base16/gruvbox-light-medium.css | 163 + .../base16/gruvbox-light-medium.min.css | 7 + .../styles/base16/gruvbox-light-soft.css | 163 + .../styles/base16/gruvbox-light-soft.min.css | 7 + .../highlight(1)/styles/base16/hardcore.css | 163 + .../styles/base16/hardcore.min.css | 7 + .../styles/base16/harmonic16-dark.css | 163 + .../styles/base16/harmonic16-dark.min.css | 7 + .../styles/base16/harmonic16-light.css | 163 + .../styles/base16/harmonic16-light.min.css | 7 + .../styles/base16/heetch-dark.css | 163 + .../styles/base16/heetch-dark.min.css | 7 + .../styles/base16/heetch-light.css | 163 + .../styles/base16/heetch-light.min.css | 7 + .../highlight(1)/styles/base16/helios.css | 163 + .../highlight(1)/styles/base16/helios.min.css | 7 + .../highlight(1)/styles/base16/hopscotch.css | 163 + .../styles/base16/hopscotch.min.css | 7 + .../styles/base16/horizon-dark.css | 163 + .../styles/base16/horizon-dark.min.css | 7 + .../styles/base16/horizon-light.css | 163 + .../styles/base16/horizon-light.min.css | 7 + .../styles/base16/humanoid-dark.css | 163 + .../styles/base16/humanoid-dark.min.css | 7 + .../styles/base16/humanoid-light.css | 163 + .../styles/base16/humanoid-light.min.css | 7 + .../highlight(1)/styles/base16/ia-dark.css | 163 + .../styles/base16/ia-dark.min.css | 7 + .../highlight(1)/styles/base16/ia-light.css | 163 + .../styles/base16/ia-light.min.css | 7 + .../highlight(1)/styles/base16/icy-dark.css | 163 + .../styles/base16/icy-dark.min.css | 7 + .../highlight(1)/styles/base16/ir-black.css | 163 + .../styles/base16/ir-black.min.css | 7 + .../highlight(1)/styles/base16/isotope.css | 163 + .../styles/base16/isotope.min.css | 7 + .../highlight(1)/styles/base16/kimber.css | 163 + .../highlight(1)/styles/base16/kimber.min.css | 7 + .../styles/base16/london-tube.css | 163 + .../styles/base16/london-tube.min.css | 7 + .../highlight(1)/styles/base16/macintosh.css | 163 + .../styles/base16/macintosh.min.css | 7 + .../highlight(1)/styles/base16/marrakesh.css | 163 + .../styles/base16/marrakesh.min.css | 7 + .../highlight(1)/styles/base16/materia.css | 163 + .../styles/base16/materia.min.css | 7 + .../styles/base16/material-darker.css | 163 + .../styles/base16/material-darker.min.css | 7 + .../styles/base16/material-lighter.css | 163 + .../styles/base16/material-lighter.min.css | 7 + .../styles/base16/material-palenight.css | 163 + .../styles/base16/material-palenight.min.css | 7 + .../styles/base16/material-vivid.css | 163 + .../styles/base16/material-vivid.min.css | 7 + .../highlight(1)/styles/base16/material.css | 163 + .../styles/base16/material.min.css | 7 + .../styles/base16/mellow-purple.css | 163 + .../styles/base16/mellow-purple.min.css | 7 + .../styles/base16/mexico-light.css | 163 + .../styles/base16/mexico-light.min.css | 7 + .../highlight(1)/styles/base16/mocha.css | 163 + .../highlight(1)/styles/base16/mocha.min.css | 7 + .../highlight(1)/styles/base16/monokai.css | 163 + .../styles/base16/monokai.min.css | 7 + .../highlight(1)/styles/base16/nebula.css | 163 + .../highlight(1)/styles/base16/nebula.min.css | 7 + .../highlight(1)/styles/base16/nord.css | 163 + .../highlight(1)/styles/base16/nord.min.css | 7 + .../highlight(1)/styles/base16/nova.css | 163 + .../highlight(1)/styles/base16/nova.min.css | 7 + .../highlight(1)/styles/base16/ocean.css | 163 + .../highlight(1)/styles/base16/ocean.min.css | 7 + .../styles/base16/oceanicnext.css | 163 + .../styles/base16/oceanicnext.min.css | 7 + .../highlight(1)/styles/base16/one-light.css | 163 + .../styles/base16/one-light.min.css | 7 + .../highlight(1)/styles/base16/onedark.css | 163 + .../styles/base16/onedark.min.css | 7 + .../styles/base16/outrun-dark.css | 163 + .../styles/base16/outrun-dark.min.css | 7 + .../styles/base16/papercolor-dark.css | 163 + .../styles/base16/papercolor-dark.min.css | 7 + .../styles/base16/papercolor-light.css | 163 + .../styles/base16/papercolor-light.min.css | 7 + .../highlight(1)/styles/base16/paraiso.css | 163 + .../styles/base16/paraiso.min.css | 7 + .../highlight(1)/styles/base16/pasque.css | 163 + .../highlight(1)/styles/base16/pasque.min.css | 7 + .../static/highlight(1)/styles/base16/phd.css | 163 + .../highlight(1)/styles/base16/phd.min.css | 7 + .../highlight(1)/styles/base16/pico.css | 163 + .../highlight(1)/styles/base16/pico.min.css | 7 + .../static/highlight(1)/styles/base16/pop.css | 163 + .../highlight(1)/styles/base16/pop.min.css | 7 + .../highlight(1)/styles/base16/porple.css | 163 + .../highlight(1)/styles/base16/porple.min.css | 7 + .../highlight(1)/styles/base16/qualia.css | 163 + .../highlight(1)/styles/base16/qualia.min.css | 7 + .../highlight(1)/styles/base16/railscasts.css | 163 + .../styles/base16/railscasts.min.css | 7 + .../highlight(1)/styles/base16/rebecca.css | 163 + .../styles/base16/rebecca.min.css | 7 + .../styles/base16/ros-pine-dawn.css | 163 + .../styles/base16/ros-pine-dawn.min.css | 7 + .../styles/base16/ros-pine-moon.css | 163 + .../styles/base16/ros-pine-moon.min.css | 7 + .../highlight(1)/styles/base16/ros-pine.css | 163 + .../styles/base16/ros-pine.min.css | 7 + .../highlight(1)/styles/base16/sagelight.css | 163 + .../styles/base16/sagelight.min.css | 7 + .../highlight(1)/styles/base16/sandcastle.css | 163 + .../styles/base16/sandcastle.min.css | 7 + .../highlight(1)/styles/base16/seti-ui.css | 163 + .../styles/base16/seti-ui.min.css | 7 + .../styles/base16/shapeshifter.css | 163 + .../styles/base16/shapeshifter.min.css | 7 + .../highlight(1)/styles/base16/silk-dark.css | 163 + .../styles/base16/silk-dark.min.css | 7 + .../highlight(1)/styles/base16/silk-light.css | 163 + .../styles/base16/silk-light.min.css | 7 + .../highlight(1)/styles/base16/snazzy.css | 163 + .../highlight(1)/styles/base16/snazzy.min.css | 7 + .../styles/base16/solar-flare-light.css | 163 + .../styles/base16/solar-flare-light.min.css | 7 + .../styles/base16/solar-flare.css | 163 + .../styles/base16/solar-flare.min.css | 7 + .../styles/base16/solarized-dark.css | 163 + .../styles/base16/solarized-dark.min.css | 7 + .../styles/base16/solarized-light.css | 163 + .../styles/base16/solarized-light.min.css | 7 + .../highlight(1)/styles/base16/spacemacs.css | 163 + .../styles/base16/spacemacs.min.css | 7 + .../highlight(1)/styles/base16/summercamp.css | 163 + .../styles/base16/summercamp.min.css | 7 + .../styles/base16/summerfruit-dark.css | 163 + .../styles/base16/summerfruit-dark.min.css | 7 + .../styles/base16/summerfruit-light.css | 163 + .../styles/base16/summerfruit-light.min.css | 7 + .../base16/synth-midnight-terminal-dark.css | 163 + .../synth-midnight-terminal-dark.min.css | 7 + .../base16/synth-midnight-terminal-light.css | 163 + .../synth-midnight-terminal-light.min.css | 7 + .../highlight(1)/styles/base16/tango.css | 163 + .../highlight(1)/styles/base16/tango.min.css | 7 + .../highlight(1)/styles/base16/tender.css | 163 + .../highlight(1)/styles/base16/tender.min.css | 7 + .../styles/base16/tomorrow-night.css | 163 + .../styles/base16/tomorrow-night.min.css | 7 + .../highlight(1)/styles/base16/tomorrow.css | 163 + .../styles/base16/tomorrow.min.css | 7 + .../highlight(1)/styles/base16/twilight.css | 163 + .../styles/base16/twilight.min.css | 7 + .../styles/base16/unikitty-dark.css | 163 + .../styles/base16/unikitty-dark.min.css | 7 + .../styles/base16/unikitty-light.css | 163 + .../styles/base16/unikitty-light.min.css | 7 + .../highlight(1)/styles/base16/vulcan.css | 163 + .../highlight(1)/styles/base16/vulcan.min.css | 7 + .../styles/base16/windows-10-light.css | 163 + .../styles/base16/windows-10-light.min.css | 7 + .../highlight(1)/styles/base16/windows-10.css | 163 + .../styles/base16/windows-10.min.css | 7 + .../styles/base16/windows-95-light.css | 163 + .../styles/base16/windows-95-light.min.css | 7 + .../highlight(1)/styles/base16/windows-95.css | 163 + .../styles/base16/windows-95.min.css | 7 + .../base16/windows-high-contrast-light.css | 163 + .../windows-high-contrast-light.min.css | 7 + .../styles/base16/windows-high-contrast.css | 163 + .../base16/windows-high-contrast.min.css | 7 + .../styles/base16/windows-nt-light.css | 163 + .../styles/base16/windows-nt-light.min.css | 7 + .../highlight(1)/styles/base16/windows-nt.css | 163 + .../styles/base16/windows-nt.min.css | 7 + .../highlight(1)/styles/base16/woodland.css | 163 + .../styles/base16/woodland.min.css | 7 + .../highlight(1)/styles/base16/xcode-dusk.css | 163 + .../styles/base16/xcode-dusk.min.css | 7 + .../highlight(1)/styles/base16/zenburn.css | 163 + .../styles/base16/zenburn.min.css | 7 + .../highlight(1)/styles/brown-paper.css | 63 + .../highlight(1)/styles/brown-paper.min.css | 1 + .../highlight(1)/styles/brown-papersq.png | Bin 0 -> 18198 bytes .../highlight(1)/styles/codepen-embed.css | 57 + .../highlight(1)/styles/codepen-embed.min.css | 1 + .../highlight(1)/styles/color-brewer.css | 66 + .../highlight(1)/styles/color-brewer.min.css | 1 + .../highlight(1)/styles/cybertopia-cherry.css | 103 + .../styles/cybertopia-cherry.min.css | 1 + .../highlight(1)/styles/cybertopia-dimmer.css | 103 + .../styles/cybertopia-dimmer.min.css | 1 + .../highlight(1)/styles/cybertopia-icecap.css | 103 + .../styles/cybertopia-icecap.min.css | 1 + .../styles/cybertopia-saturated.css | 103 + .../styles/cybertopia-saturated.min.css | 1 + backend/static/highlight(1)/styles/dark.css | 62 + .../static/highlight(1)/styles/dark.min.css | 1 + .../static/highlight(1)/styles/default.css | 117 + .../highlight(1)/styles/default.min.css | 9 + .../static/highlight(1)/styles/devibeans.css | 90 + .../highlight(1)/styles/devibeans.min.css | 7 + backend/static/highlight(1)/styles/docco.css | 83 + .../static/highlight(1)/styles/docco.min.css | 1 + backend/static/highlight(1)/styles/far.css | 67 + .../static/highlight(1)/styles/far.min.css | 1 + .../static/highlight(1)/styles/felipec.css | 94 + .../highlight(1)/styles/felipec.min.css | 7 + .../static/highlight(1)/styles/foundation.css | 80 + .../highlight(1)/styles/foundation.min.css | 1 + .../styles/github-dark-dimmed.css | 117 + .../styles/github-dark-dimmed.min.css | 9 + .../highlight(1)/styles/github-dark.css | 118 + .../highlight(1)/styles/github-dark.min.css | 10 + backend/static/highlight(1)/styles/github.css | 118 + .../static/highlight(1)/styles/github.min.css | 10 + backend/static/highlight(1)/styles/gml.css | 72 + .../static/highlight(1)/styles/gml.min.css | 1 + .../static/highlight(1)/styles/googlecode.css | 79 + .../highlight(1)/styles/googlecode.min.css | 1 + .../highlight(1)/styles/gradient-dark.css | 90 + .../highlight(1)/styles/gradient-dark.min.css | 1 + .../highlight(1)/styles/gradient-light.css | 90 + .../styles/gradient-light.min.css | 1 + .../static/highlight(1)/styles/grayscale.css | 89 + .../highlight(1)/styles/grayscale.min.css | 1 + backend/static/highlight(1)/styles/hybrid.css | 88 + .../static/highlight(1)/styles/hybrid.min.css | 1 + backend/static/highlight(1)/styles/idea.css | 86 + .../static/highlight(1)/styles/idea.min.css | 1 + .../highlight(1)/styles/intellij-light.css | 107 + .../styles/intellij-light.min.css | 1 + .../static/highlight(1)/styles/ir-black.css | 66 + .../highlight(1)/styles/ir-black.min.css | 1 + .../highlight(1)/styles/isbl-editor-dark.css | 94 + .../styles/isbl-editor-dark.min.css | 1 + .../highlight(1)/styles/isbl-editor-light.css | 93 + .../styles/isbl-editor-light.min.css | 1 + .../highlight(1)/styles/kimbie-dark.css | 69 + .../highlight(1)/styles/kimbie-dark.min.css | 1 + .../highlight(1)/styles/kimbie-light.css | 69 + .../highlight(1)/styles/kimbie-light.min.css | 1 + .../static/highlight(1)/styles/lightfair.css | 81 + .../highlight(1)/styles/lightfair.min.css | 1 + backend/static/highlight(1)/styles/lioshi.css | 76 + .../static/highlight(1)/styles/lioshi.min.css | 1 + backend/static/highlight(1)/styles/magula.css | 66 + .../static/highlight(1)/styles/magula.min.css | 1 + .../static/highlight(1)/styles/mono-blue.css | 56 + .../highlight(1)/styles/mono-blue.min.css | 1 + .../highlight(1)/styles/monokai-sublime.css | 76 + .../styles/monokai-sublime.min.css | 1 + .../static/highlight(1)/styles/monokai.css | 70 + .../highlight(1)/styles/monokai.min.css | 1 + .../static/highlight(1)/styles/night-owl.css | 174 + .../highlight(1)/styles/night-owl.min.css | 1 + .../static/highlight(1)/styles/nnfx-dark.css | 104 + .../highlight(1)/styles/nnfx-dark.min.css | 10 + .../static/highlight(1)/styles/nnfx-light.css | 104 + .../highlight(1)/styles/nnfx-light.min.css | 10 + backend/static/highlight(1)/styles/nord.css | 275 + .../static/highlight(1)/styles/nord.min.css | 1 + .../static/highlight(1)/styles/obsidian.css | 79 + .../highlight(1)/styles/obsidian.min.css | 1 + .../highlight(1)/styles/panda-syntax-dark.css | 92 + .../styles/panda-syntax-dark.min.css | 1 + .../styles/panda-syntax-light.css | 89 + .../styles/panda-syntax-light.min.css | 1 + .../highlight(1)/styles/paraiso-dark.css | 67 + .../highlight(1)/styles/paraiso-dark.min.css | 1 + .../highlight(1)/styles/paraiso-light.css | 67 + .../highlight(1)/styles/paraiso-light.min.css | 1 + .../static/highlight(1)/styles/pojoaque.css | 76 + .../static/highlight(1)/styles/pojoaque.jpg | Bin 0 -> 1186 bytes .../highlight(1)/styles/pojoaque.min.css | 1 + .../static/highlight(1)/styles/purebasic.css | 103 + .../highlight(1)/styles/purebasic.min.css | 1 + .../highlight(1)/styles/qtcreator-dark.css | 76 + .../styles/qtcreator-dark.min.css | 1 + .../highlight(1)/styles/qtcreator-light.css | 74 + .../styles/qtcreator-light.min.css | 1 + .../static/highlight(1)/styles/rainbow.css | 77 + .../highlight(1)/styles/rainbow.min.css | 1 + .../highlight(1)/styles/rose-pine-dawn.css | 107 + .../styles/rose-pine-dawn.min.css | 4 + .../highlight(1)/styles/rose-pine-moon.css | 109 + .../styles/rose-pine-moon.min.css | 4 + .../static/highlight(1)/styles/rose-pine.css | 109 + .../highlight(1)/styles/rose-pine.min.css | 4 + .../static/highlight(1)/styles/routeros.css | 86 + .../highlight(1)/styles/routeros.min.css | 1 + .../highlight(1)/styles/school-book.css | 62 + .../highlight(1)/styles/school-book.min.css | 1 + .../highlight(1)/styles/shades-of-purple.css | 84 + .../styles/shades-of-purple.min.css | 1 + backend/static/highlight(1)/styles/srcery.css | 89 + .../static/highlight(1)/styles/srcery.min.css | 1 + .../styles/stackoverflow-dark.css | 117 + .../styles/stackoverflow-dark.min.css | 13 + .../styles/stackoverflow-light.css | 117 + .../styles/stackoverflow-light.min.css | 13 + .../static/highlight(1)/styles/sunburst.css | 89 + .../highlight(1)/styles/sunburst.min.css | 1 + .../highlight(1)/styles/tokyo-night-dark.css | 114 + .../styles/tokyo-night-dark.min.css | 8 + .../highlight(1)/styles/tokyo-night-light.css | 114 + .../styles/tokyo-night-light.min.css | 8 + .../styles/tomorrow-night-blue.css | 69 + .../styles/tomorrow-night-blue.min.css | 1 + .../styles/tomorrow-night-bright.css | 68 + .../styles/tomorrow-night-bright.min.css | 1 + backend/static/highlight(1)/styles/vs.css | 63 + backend/static/highlight(1)/styles/vs.min.css | 1 + backend/static/highlight(1)/styles/vs2015.css | 100 + .../static/highlight(1)/styles/vs2015.min.css | 1 + backend/static/highlight(1)/styles/xcode.css | 90 + .../static/highlight(1)/styles/xcode.min.css | 1 + backend/static/highlight(1)/styles/xt256.css | 79 + .../static/highlight(1)/styles/xt256.min.css | 1 + backend/static/js/chat.js | 156 + backend/static/js/highlight.min.js | 1407 ++ backend/static/js/van.js | 125 + backend/templates/2fa.html.tera | 74 +- backend/templates/chatpreview.html.tera | 16 + backend/templates/error.html.tera | 45 + backend/templates/invite.html.tera | 230 + backend/templates/login.html.tera | 14 +- backend/templates/signup.html.tera | 48 +- 690 files changed, 91734 insertions(+), 303 deletions(-) create mode 100644 backend/migrations/20251010231008_invite-codes.sql create mode 100644 backend/migrations/20251011002049_invite-codes-v2.sql delete mode 100644 backend/src/auth.rs create mode 100644 backend/src/auth/account.rs create mode 100644 backend/src/auth/mod.rs create mode 100644 backend/src/auth/session.rs create mode 100644 backend/src/auth/two_factor.rs create mode 100644 backend/src/handlers.rs create mode 100644 backend/static/highlight(1).zip create mode 100644 backend/static/highlight(1)/DIGESTS.md create mode 100644 backend/static/highlight(1)/LICENSE create mode 100644 backend/static/highlight(1)/README.md create mode 100644 backend/static/highlight(1)/es/core.js create mode 100644 backend/static/highlight(1)/es/core.min.js create mode 100644 backend/static/highlight(1)/es/highlight.js create mode 100644 backend/static/highlight(1)/es/highlight.min.js create mode 100644 backend/static/highlight(1)/es/languages/bash.js create mode 100644 backend/static/highlight(1)/es/languages/bash.min.js create mode 100644 backend/static/highlight(1)/es/languages/c.js create mode 100644 backend/static/highlight(1)/es/languages/c.min.js create mode 100644 backend/static/highlight(1)/es/languages/cpp.js create mode 100644 backend/static/highlight(1)/es/languages/cpp.min.js create mode 100644 backend/static/highlight(1)/es/languages/csharp.js create mode 100644 backend/static/highlight(1)/es/languages/csharp.min.js create mode 100644 backend/static/highlight(1)/es/languages/css.js create mode 100644 backend/static/highlight(1)/es/languages/css.min.js create mode 100644 backend/static/highlight(1)/es/languages/diff.js create mode 100644 backend/static/highlight(1)/es/languages/diff.min.js create mode 100644 backend/static/highlight(1)/es/languages/go.js create mode 100644 backend/static/highlight(1)/es/languages/go.min.js create mode 100644 backend/static/highlight(1)/es/languages/graphql.js create mode 100644 backend/static/highlight(1)/es/languages/graphql.min.js create mode 100644 backend/static/highlight(1)/es/languages/ini.js create mode 100644 backend/static/highlight(1)/es/languages/ini.min.js create mode 100644 backend/static/highlight(1)/es/languages/java.js create mode 100644 backend/static/highlight(1)/es/languages/java.min.js create mode 100644 backend/static/highlight(1)/es/languages/javascript.js create mode 100644 backend/static/highlight(1)/es/languages/javascript.min.js create mode 100644 backend/static/highlight(1)/es/languages/json.js create mode 100644 backend/static/highlight(1)/es/languages/json.min.js create mode 100644 backend/static/highlight(1)/es/languages/kotlin.js create mode 100644 backend/static/highlight(1)/es/languages/kotlin.min.js create mode 100644 backend/static/highlight(1)/es/languages/less.js create mode 100644 backend/static/highlight(1)/es/languages/less.min.js create mode 100644 backend/static/highlight(1)/es/languages/lua.js create mode 100644 backend/static/highlight(1)/es/languages/lua.min.js create mode 100644 backend/static/highlight(1)/es/languages/makefile.js create mode 100644 backend/static/highlight(1)/es/languages/makefile.min.js create mode 100644 backend/static/highlight(1)/es/languages/markdown.js create mode 100644 backend/static/highlight(1)/es/languages/markdown.min.js create mode 100644 backend/static/highlight(1)/es/languages/objectivec.js create mode 100644 backend/static/highlight(1)/es/languages/objectivec.min.js create mode 100644 backend/static/highlight(1)/es/languages/perl.js create mode 100644 backend/static/highlight(1)/es/languages/perl.min.js create mode 100644 backend/static/highlight(1)/es/languages/php-template.js create mode 100644 backend/static/highlight(1)/es/languages/php-template.min.js create mode 100644 backend/static/highlight(1)/es/languages/php.js create mode 100644 backend/static/highlight(1)/es/languages/php.min.js create mode 100644 backend/static/highlight(1)/es/languages/plaintext.js create mode 100644 backend/static/highlight(1)/es/languages/plaintext.min.js create mode 100644 backend/static/highlight(1)/es/languages/python-repl.js create mode 100644 backend/static/highlight(1)/es/languages/python-repl.min.js create mode 100644 backend/static/highlight(1)/es/languages/python.js create mode 100644 backend/static/highlight(1)/es/languages/python.min.js create mode 100644 backend/static/highlight(1)/es/languages/r.js create mode 100644 backend/static/highlight(1)/es/languages/r.min.js create mode 100644 backend/static/highlight(1)/es/languages/ruby.js create mode 100644 backend/static/highlight(1)/es/languages/ruby.min.js create mode 100644 backend/static/highlight(1)/es/languages/rust.js create mode 100644 backend/static/highlight(1)/es/languages/rust.min.js create mode 100644 backend/static/highlight(1)/es/languages/scss.js create mode 100644 backend/static/highlight(1)/es/languages/scss.min.js create mode 100644 backend/static/highlight(1)/es/languages/shell.js create mode 100644 backend/static/highlight(1)/es/languages/shell.min.js create mode 100644 backend/static/highlight(1)/es/languages/sql.js create mode 100644 backend/static/highlight(1)/es/languages/sql.min.js create mode 100644 backend/static/highlight(1)/es/languages/swift.js create mode 100644 backend/static/highlight(1)/es/languages/swift.min.js create mode 100644 backend/static/highlight(1)/es/languages/typescript.js create mode 100644 backend/static/highlight(1)/es/languages/typescript.min.js create mode 100644 backend/static/highlight(1)/es/languages/vbnet.js create mode 100644 backend/static/highlight(1)/es/languages/vbnet.min.js create mode 100644 backend/static/highlight(1)/es/languages/wasm.js create mode 100644 backend/static/highlight(1)/es/languages/wasm.min.js create mode 100644 backend/static/highlight(1)/es/languages/xml.js create mode 100644 backend/static/highlight(1)/es/languages/xml.min.js create mode 100644 backend/static/highlight(1)/es/languages/yaml.js create mode 100644 backend/static/highlight(1)/es/languages/yaml.min.js create mode 100644 backend/static/highlight(1)/es/package.json create mode 100644 backend/static/highlight(1)/highlight.js create mode 100644 backend/static/highlight(1)/languages/bash.js create mode 100644 backend/static/highlight(1)/languages/bash.min.js create mode 100644 backend/static/highlight(1)/languages/c.js create mode 100644 backend/static/highlight(1)/languages/c.min.js create mode 100644 backend/static/highlight(1)/languages/cpp.js create mode 100644 backend/static/highlight(1)/languages/cpp.min.js create mode 100644 backend/static/highlight(1)/languages/csharp.js create mode 100644 backend/static/highlight(1)/languages/csharp.min.js create mode 100644 backend/static/highlight(1)/languages/css.js create mode 100644 backend/static/highlight(1)/languages/css.min.js create mode 100644 backend/static/highlight(1)/languages/diff.js create mode 100644 backend/static/highlight(1)/languages/diff.min.js create mode 100644 backend/static/highlight(1)/languages/go.js create mode 100644 backend/static/highlight(1)/languages/go.min.js create mode 100644 backend/static/highlight(1)/languages/graphql.js create mode 100644 backend/static/highlight(1)/languages/graphql.min.js create mode 100644 backend/static/highlight(1)/languages/ini.js create mode 100644 backend/static/highlight(1)/languages/ini.min.js create mode 100644 backend/static/highlight(1)/languages/java.js create mode 100644 backend/static/highlight(1)/languages/java.min.js create mode 100644 backend/static/highlight(1)/languages/javascript.js create mode 100644 backend/static/highlight(1)/languages/javascript.min.js create mode 100644 backend/static/highlight(1)/languages/json.js create mode 100644 backend/static/highlight(1)/languages/json.min.js create mode 100644 backend/static/highlight(1)/languages/kotlin.js create mode 100644 backend/static/highlight(1)/languages/kotlin.min.js create mode 100644 backend/static/highlight(1)/languages/less.js create mode 100644 backend/static/highlight(1)/languages/less.min.js create mode 100644 backend/static/highlight(1)/languages/lua.js create mode 100644 backend/static/highlight(1)/languages/lua.min.js create mode 100644 backend/static/highlight(1)/languages/makefile.js create mode 100644 backend/static/highlight(1)/languages/makefile.min.js create mode 100644 backend/static/highlight(1)/languages/markdown.js create mode 100644 backend/static/highlight(1)/languages/markdown.min.js create mode 100644 backend/static/highlight(1)/languages/objectivec.js create mode 100644 backend/static/highlight(1)/languages/objectivec.min.js create mode 100644 backend/static/highlight(1)/languages/perl.js create mode 100644 backend/static/highlight(1)/languages/perl.min.js create mode 100644 backend/static/highlight(1)/languages/php-template.js create mode 100644 backend/static/highlight(1)/languages/php-template.min.js create mode 100644 backend/static/highlight(1)/languages/php.js create mode 100644 backend/static/highlight(1)/languages/php.min.js create mode 100644 backend/static/highlight(1)/languages/plaintext.js create mode 100644 backend/static/highlight(1)/languages/plaintext.min.js create mode 100644 backend/static/highlight(1)/languages/python-repl.js create mode 100644 backend/static/highlight(1)/languages/python-repl.min.js create mode 100644 backend/static/highlight(1)/languages/python.js create mode 100644 backend/static/highlight(1)/languages/python.min.js create mode 100644 backend/static/highlight(1)/languages/r.js create mode 100644 backend/static/highlight(1)/languages/r.min.js create mode 100644 backend/static/highlight(1)/languages/ruby.js create mode 100644 backend/static/highlight(1)/languages/ruby.min.js create mode 100644 backend/static/highlight(1)/languages/rust.js create mode 100644 backend/static/highlight(1)/languages/rust.min.js create mode 100644 backend/static/highlight(1)/languages/scss.js create mode 100644 backend/static/highlight(1)/languages/scss.min.js create mode 100644 backend/static/highlight(1)/languages/shell.js create mode 100644 backend/static/highlight(1)/languages/shell.min.js create mode 100644 backend/static/highlight(1)/languages/sql.js create mode 100644 backend/static/highlight(1)/languages/sql.min.js create mode 100644 backend/static/highlight(1)/languages/swift.js create mode 100644 backend/static/highlight(1)/languages/swift.min.js create mode 100644 backend/static/highlight(1)/languages/typescript.js create mode 100644 backend/static/highlight(1)/languages/typescript.min.js create mode 100644 backend/static/highlight(1)/languages/vbnet.js create mode 100644 backend/static/highlight(1)/languages/vbnet.min.js create mode 100644 backend/static/highlight(1)/languages/wasm.js create mode 100644 backend/static/highlight(1)/languages/wasm.min.js create mode 100644 backend/static/highlight(1)/languages/xml.js create mode 100644 backend/static/highlight(1)/languages/xml.min.js create mode 100644 backend/static/highlight(1)/languages/yaml.js create mode 100644 backend/static/highlight(1)/languages/yaml.min.js create mode 100644 backend/static/highlight(1)/package.json create mode 100644 backend/static/highlight(1)/styles/1c-light.css create mode 100644 backend/static/highlight(1)/styles/1c-light.min.css create mode 100644 backend/static/highlight(1)/styles/a11y-dark.css create mode 100644 backend/static/highlight(1)/styles/a11y-dark.min.css create mode 100644 backend/static/highlight(1)/styles/a11y-light.css create mode 100644 backend/static/highlight(1)/styles/a11y-light.min.css create mode 100644 backend/static/highlight(1)/styles/agate.css create mode 100644 backend/static/highlight(1)/styles/agate.min.css create mode 100644 backend/static/highlight(1)/styles/an-old-hope.css create mode 100644 backend/static/highlight(1)/styles/an-old-hope.min.css create mode 100644 backend/static/highlight(1)/styles/androidstudio.css create mode 100644 backend/static/highlight(1)/styles/androidstudio.min.css create mode 100644 backend/static/highlight(1)/styles/arduino-light.css create mode 100644 backend/static/highlight(1)/styles/arduino-light.min.css create mode 100644 backend/static/highlight(1)/styles/arta.css create mode 100644 backend/static/highlight(1)/styles/arta.min.css create mode 100644 backend/static/highlight(1)/styles/ascetic.css create mode 100644 backend/static/highlight(1)/styles/ascetic.min.css create mode 100644 backend/static/highlight(1)/styles/atom-one-dark-reasonable.css create mode 100644 backend/static/highlight(1)/styles/atom-one-dark-reasonable.min.css create mode 100644 backend/static/highlight(1)/styles/atom-one-dark.css create mode 100644 backend/static/highlight(1)/styles/atom-one-dark.min.css create mode 100644 backend/static/highlight(1)/styles/atom-one-light.css create mode 100644 backend/static/highlight(1)/styles/atom-one-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/3024.css create mode 100644 backend/static/highlight(1)/styles/base16/3024.min.css create mode 100644 backend/static/highlight(1)/styles/base16/apathy.css create mode 100644 backend/static/highlight(1)/styles/base16/apathy.min.css create mode 100644 backend/static/highlight(1)/styles/base16/apprentice.css create mode 100644 backend/static/highlight(1)/styles/base16/apprentice.min.css create mode 100644 backend/static/highlight(1)/styles/base16/ashes.css create mode 100644 backend/static/highlight(1)/styles/base16/ashes.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-cave-light.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-cave-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-cave.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-cave.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-dune-light.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-dune-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-dune.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-dune.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-estuary-light.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-estuary-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-estuary.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-estuary.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-forest-light.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-forest-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-forest.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-forest.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-heath-light.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-heath-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-heath.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-heath.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-lakeside-light.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-lakeside-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-lakeside.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-lakeside.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-plateau-light.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-plateau-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-plateau.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-plateau.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-savanna-light.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-savanna-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-savanna.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-savanna.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-seaside-light.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-seaside-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-seaside.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-seaside.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-sulphurpool-light.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-sulphurpool-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-sulphurpool.css create mode 100644 backend/static/highlight(1)/styles/base16/atelier-sulphurpool.min.css create mode 100644 backend/static/highlight(1)/styles/base16/atlas.css create mode 100644 backend/static/highlight(1)/styles/base16/atlas.min.css create mode 100644 backend/static/highlight(1)/styles/base16/bespin.css create mode 100644 backend/static/highlight(1)/styles/base16/bespin.min.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-bathory.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-bathory.min.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-burzum.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-burzum.min.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-dark-funeral.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-dark-funeral.min.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-gorgoroth.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-gorgoroth.min.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-immortal.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-immortal.min.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-khold.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-khold.min.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-marduk.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-marduk.min.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-mayhem.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-mayhem.min.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-nile.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-nile.min.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-venom.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal-venom.min.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal.css create mode 100644 backend/static/highlight(1)/styles/base16/black-metal.min.css create mode 100644 backend/static/highlight(1)/styles/base16/brewer.css create mode 100644 backend/static/highlight(1)/styles/base16/brewer.min.css create mode 100644 backend/static/highlight(1)/styles/base16/bright.css create mode 100644 backend/static/highlight(1)/styles/base16/bright.min.css create mode 100644 backend/static/highlight(1)/styles/base16/brogrammer.css create mode 100644 backend/static/highlight(1)/styles/base16/brogrammer.min.css create mode 100644 backend/static/highlight(1)/styles/base16/brush-trees-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/brush-trees-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/brush-trees.css create mode 100644 backend/static/highlight(1)/styles/base16/brush-trees.min.css create mode 100644 backend/static/highlight(1)/styles/base16/chalk.css create mode 100644 backend/static/highlight(1)/styles/base16/chalk.min.css create mode 100644 backend/static/highlight(1)/styles/base16/circus.css create mode 100644 backend/static/highlight(1)/styles/base16/circus.min.css create mode 100644 backend/static/highlight(1)/styles/base16/classic-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/classic-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/classic-light.css create mode 100644 backend/static/highlight(1)/styles/base16/classic-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/codeschool.css create mode 100644 backend/static/highlight(1)/styles/base16/codeschool.min.css create mode 100644 backend/static/highlight(1)/styles/base16/colors.css create mode 100644 backend/static/highlight(1)/styles/base16/colors.min.css create mode 100644 backend/static/highlight(1)/styles/base16/cupcake.css create mode 100644 backend/static/highlight(1)/styles/base16/cupcake.min.css create mode 100644 backend/static/highlight(1)/styles/base16/cupertino.css create mode 100644 backend/static/highlight(1)/styles/base16/cupertino.min.css create mode 100644 backend/static/highlight(1)/styles/base16/danqing.css create mode 100644 backend/static/highlight(1)/styles/base16/danqing.min.css create mode 100644 backend/static/highlight(1)/styles/base16/darcula.css create mode 100644 backend/static/highlight(1)/styles/base16/darcula.min.css create mode 100644 backend/static/highlight(1)/styles/base16/dark-violet.css create mode 100644 backend/static/highlight(1)/styles/base16/dark-violet.min.css create mode 100644 backend/static/highlight(1)/styles/base16/darkmoss.css create mode 100644 backend/static/highlight(1)/styles/base16/darkmoss.min.css create mode 100644 backend/static/highlight(1)/styles/base16/darktooth.css create mode 100644 backend/static/highlight(1)/styles/base16/darktooth.min.css create mode 100644 backend/static/highlight(1)/styles/base16/decaf.css create mode 100644 backend/static/highlight(1)/styles/base16/decaf.min.css create mode 100644 backend/static/highlight(1)/styles/base16/default-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/default-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/default-light.css create mode 100644 backend/static/highlight(1)/styles/base16/default-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/dirtysea.css create mode 100644 backend/static/highlight(1)/styles/base16/dirtysea.min.css create mode 100644 backend/static/highlight(1)/styles/base16/dracula.css create mode 100644 backend/static/highlight(1)/styles/base16/dracula.min.css create mode 100644 backend/static/highlight(1)/styles/base16/edge-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/edge-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/edge-light.css create mode 100644 backend/static/highlight(1)/styles/base16/edge-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/eighties.css create mode 100644 backend/static/highlight(1)/styles/base16/eighties.min.css create mode 100644 backend/static/highlight(1)/styles/base16/embers.css create mode 100644 backend/static/highlight(1)/styles/base16/embers.min.css create mode 100644 backend/static/highlight(1)/styles/base16/equilibrium-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/equilibrium-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/equilibrium-gray-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/equilibrium-gray-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/equilibrium-gray-light.css create mode 100644 backend/static/highlight(1)/styles/base16/equilibrium-gray-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/equilibrium-light.css create mode 100644 backend/static/highlight(1)/styles/base16/equilibrium-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/espresso.css create mode 100644 backend/static/highlight(1)/styles/base16/espresso.min.css create mode 100644 backend/static/highlight(1)/styles/base16/eva-dim.css create mode 100644 backend/static/highlight(1)/styles/base16/eva-dim.min.css create mode 100644 backend/static/highlight(1)/styles/base16/eva.css create mode 100644 backend/static/highlight(1)/styles/base16/eva.min.css create mode 100644 backend/static/highlight(1)/styles/base16/flat.css create mode 100644 backend/static/highlight(1)/styles/base16/flat.min.css create mode 100644 backend/static/highlight(1)/styles/base16/framer.css create mode 100644 backend/static/highlight(1)/styles/base16/framer.min.css create mode 100644 backend/static/highlight(1)/styles/base16/fruit-soda.css create mode 100644 backend/static/highlight(1)/styles/base16/fruit-soda.min.css create mode 100644 backend/static/highlight(1)/styles/base16/gigavolt.css create mode 100644 backend/static/highlight(1)/styles/base16/gigavolt.min.css create mode 100644 backend/static/highlight(1)/styles/base16/github.css create mode 100644 backend/static/highlight(1)/styles/base16/github.min.css create mode 100644 backend/static/highlight(1)/styles/base16/google-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/google-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/google-light.css create mode 100644 backend/static/highlight(1)/styles/base16/google-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/grayscale-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/grayscale-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/grayscale-light.css create mode 100644 backend/static/highlight(1)/styles/base16/grayscale-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/green-screen.css create mode 100644 backend/static/highlight(1)/styles/base16/green-screen.min.css create mode 100644 backend/static/highlight(1)/styles/base16/gruvbox-dark-hard.css create mode 100644 backend/static/highlight(1)/styles/base16/gruvbox-dark-hard.min.css create mode 100644 backend/static/highlight(1)/styles/base16/gruvbox-dark-medium.css create mode 100644 backend/static/highlight(1)/styles/base16/gruvbox-dark-medium.min.css create mode 100644 backend/static/highlight(1)/styles/base16/gruvbox-dark-pale.css create mode 100644 backend/static/highlight(1)/styles/base16/gruvbox-dark-pale.min.css create mode 100644 backend/static/highlight(1)/styles/base16/gruvbox-dark-soft.css create mode 100644 backend/static/highlight(1)/styles/base16/gruvbox-dark-soft.min.css create mode 100644 backend/static/highlight(1)/styles/base16/gruvbox-light-hard.css create mode 100644 backend/static/highlight(1)/styles/base16/gruvbox-light-hard.min.css create mode 100644 backend/static/highlight(1)/styles/base16/gruvbox-light-medium.css create mode 100644 backend/static/highlight(1)/styles/base16/gruvbox-light-medium.min.css create mode 100644 backend/static/highlight(1)/styles/base16/gruvbox-light-soft.css create mode 100644 backend/static/highlight(1)/styles/base16/gruvbox-light-soft.min.css create mode 100644 backend/static/highlight(1)/styles/base16/hardcore.css create mode 100644 backend/static/highlight(1)/styles/base16/hardcore.min.css create mode 100644 backend/static/highlight(1)/styles/base16/harmonic16-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/harmonic16-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/harmonic16-light.css create mode 100644 backend/static/highlight(1)/styles/base16/harmonic16-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/heetch-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/heetch-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/heetch-light.css create mode 100644 backend/static/highlight(1)/styles/base16/heetch-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/helios.css create mode 100644 backend/static/highlight(1)/styles/base16/helios.min.css create mode 100644 backend/static/highlight(1)/styles/base16/hopscotch.css create mode 100644 backend/static/highlight(1)/styles/base16/hopscotch.min.css create mode 100644 backend/static/highlight(1)/styles/base16/horizon-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/horizon-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/horizon-light.css create mode 100644 backend/static/highlight(1)/styles/base16/horizon-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/humanoid-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/humanoid-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/humanoid-light.css create mode 100644 backend/static/highlight(1)/styles/base16/humanoid-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/ia-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/ia-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/ia-light.css create mode 100644 backend/static/highlight(1)/styles/base16/ia-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/icy-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/icy-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/ir-black.css create mode 100644 backend/static/highlight(1)/styles/base16/ir-black.min.css create mode 100644 backend/static/highlight(1)/styles/base16/isotope.css create mode 100644 backend/static/highlight(1)/styles/base16/isotope.min.css create mode 100644 backend/static/highlight(1)/styles/base16/kimber.css create mode 100644 backend/static/highlight(1)/styles/base16/kimber.min.css create mode 100644 backend/static/highlight(1)/styles/base16/london-tube.css create mode 100644 backend/static/highlight(1)/styles/base16/london-tube.min.css create mode 100644 backend/static/highlight(1)/styles/base16/macintosh.css create mode 100644 backend/static/highlight(1)/styles/base16/macintosh.min.css create mode 100644 backend/static/highlight(1)/styles/base16/marrakesh.css create mode 100644 backend/static/highlight(1)/styles/base16/marrakesh.min.css create mode 100644 backend/static/highlight(1)/styles/base16/materia.css create mode 100644 backend/static/highlight(1)/styles/base16/materia.min.css create mode 100644 backend/static/highlight(1)/styles/base16/material-darker.css create mode 100644 backend/static/highlight(1)/styles/base16/material-darker.min.css create mode 100644 backend/static/highlight(1)/styles/base16/material-lighter.css create mode 100644 backend/static/highlight(1)/styles/base16/material-lighter.min.css create mode 100644 backend/static/highlight(1)/styles/base16/material-palenight.css create mode 100644 backend/static/highlight(1)/styles/base16/material-palenight.min.css create mode 100644 backend/static/highlight(1)/styles/base16/material-vivid.css create mode 100644 backend/static/highlight(1)/styles/base16/material-vivid.min.css create mode 100644 backend/static/highlight(1)/styles/base16/material.css create mode 100644 backend/static/highlight(1)/styles/base16/material.min.css create mode 100644 backend/static/highlight(1)/styles/base16/mellow-purple.css create mode 100644 backend/static/highlight(1)/styles/base16/mellow-purple.min.css create mode 100644 backend/static/highlight(1)/styles/base16/mexico-light.css create mode 100644 backend/static/highlight(1)/styles/base16/mexico-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/mocha.css create mode 100644 backend/static/highlight(1)/styles/base16/mocha.min.css create mode 100644 backend/static/highlight(1)/styles/base16/monokai.css create mode 100644 backend/static/highlight(1)/styles/base16/monokai.min.css create mode 100644 backend/static/highlight(1)/styles/base16/nebula.css create mode 100644 backend/static/highlight(1)/styles/base16/nebula.min.css create mode 100644 backend/static/highlight(1)/styles/base16/nord.css create mode 100644 backend/static/highlight(1)/styles/base16/nord.min.css create mode 100644 backend/static/highlight(1)/styles/base16/nova.css create mode 100644 backend/static/highlight(1)/styles/base16/nova.min.css create mode 100644 backend/static/highlight(1)/styles/base16/ocean.css create mode 100644 backend/static/highlight(1)/styles/base16/ocean.min.css create mode 100644 backend/static/highlight(1)/styles/base16/oceanicnext.css create mode 100644 backend/static/highlight(1)/styles/base16/oceanicnext.min.css create mode 100644 backend/static/highlight(1)/styles/base16/one-light.css create mode 100644 backend/static/highlight(1)/styles/base16/one-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/onedark.css create mode 100644 backend/static/highlight(1)/styles/base16/onedark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/outrun-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/outrun-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/papercolor-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/papercolor-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/papercolor-light.css create mode 100644 backend/static/highlight(1)/styles/base16/papercolor-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/paraiso.css create mode 100644 backend/static/highlight(1)/styles/base16/paraiso.min.css create mode 100644 backend/static/highlight(1)/styles/base16/pasque.css create mode 100644 backend/static/highlight(1)/styles/base16/pasque.min.css create mode 100644 backend/static/highlight(1)/styles/base16/phd.css create mode 100644 backend/static/highlight(1)/styles/base16/phd.min.css create mode 100644 backend/static/highlight(1)/styles/base16/pico.css create mode 100644 backend/static/highlight(1)/styles/base16/pico.min.css create mode 100644 backend/static/highlight(1)/styles/base16/pop.css create mode 100644 backend/static/highlight(1)/styles/base16/pop.min.css create mode 100644 backend/static/highlight(1)/styles/base16/porple.css create mode 100644 backend/static/highlight(1)/styles/base16/porple.min.css create mode 100644 backend/static/highlight(1)/styles/base16/qualia.css create mode 100644 backend/static/highlight(1)/styles/base16/qualia.min.css create mode 100644 backend/static/highlight(1)/styles/base16/railscasts.css create mode 100644 backend/static/highlight(1)/styles/base16/railscasts.min.css create mode 100644 backend/static/highlight(1)/styles/base16/rebecca.css create mode 100644 backend/static/highlight(1)/styles/base16/rebecca.min.css create mode 100644 backend/static/highlight(1)/styles/base16/ros-pine-dawn.css create mode 100644 backend/static/highlight(1)/styles/base16/ros-pine-dawn.min.css create mode 100644 backend/static/highlight(1)/styles/base16/ros-pine-moon.css create mode 100644 backend/static/highlight(1)/styles/base16/ros-pine-moon.min.css create mode 100644 backend/static/highlight(1)/styles/base16/ros-pine.css create mode 100644 backend/static/highlight(1)/styles/base16/ros-pine.min.css create mode 100644 backend/static/highlight(1)/styles/base16/sagelight.css create mode 100644 backend/static/highlight(1)/styles/base16/sagelight.min.css create mode 100644 backend/static/highlight(1)/styles/base16/sandcastle.css create mode 100644 backend/static/highlight(1)/styles/base16/sandcastle.min.css create mode 100644 backend/static/highlight(1)/styles/base16/seti-ui.css create mode 100644 backend/static/highlight(1)/styles/base16/seti-ui.min.css create mode 100644 backend/static/highlight(1)/styles/base16/shapeshifter.css create mode 100644 backend/static/highlight(1)/styles/base16/shapeshifter.min.css create mode 100644 backend/static/highlight(1)/styles/base16/silk-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/silk-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/silk-light.css create mode 100644 backend/static/highlight(1)/styles/base16/silk-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/snazzy.css create mode 100644 backend/static/highlight(1)/styles/base16/snazzy.min.css create mode 100644 backend/static/highlight(1)/styles/base16/solar-flare-light.css create mode 100644 backend/static/highlight(1)/styles/base16/solar-flare-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/solar-flare.css create mode 100644 backend/static/highlight(1)/styles/base16/solar-flare.min.css create mode 100644 backend/static/highlight(1)/styles/base16/solarized-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/solarized-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/solarized-light.css create mode 100644 backend/static/highlight(1)/styles/base16/solarized-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/spacemacs.css create mode 100644 backend/static/highlight(1)/styles/base16/spacemacs.min.css create mode 100644 backend/static/highlight(1)/styles/base16/summercamp.css create mode 100644 backend/static/highlight(1)/styles/base16/summercamp.min.css create mode 100644 backend/static/highlight(1)/styles/base16/summerfruit-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/summerfruit-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/summerfruit-light.css create mode 100644 backend/static/highlight(1)/styles/base16/summerfruit-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/synth-midnight-terminal-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/synth-midnight-terminal-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/synth-midnight-terminal-light.css create mode 100644 backend/static/highlight(1)/styles/base16/synth-midnight-terminal-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/tango.css create mode 100644 backend/static/highlight(1)/styles/base16/tango.min.css create mode 100644 backend/static/highlight(1)/styles/base16/tender.css create mode 100644 backend/static/highlight(1)/styles/base16/tender.min.css create mode 100644 backend/static/highlight(1)/styles/base16/tomorrow-night.css create mode 100644 backend/static/highlight(1)/styles/base16/tomorrow-night.min.css create mode 100644 backend/static/highlight(1)/styles/base16/tomorrow.css create mode 100644 backend/static/highlight(1)/styles/base16/tomorrow.min.css create mode 100644 backend/static/highlight(1)/styles/base16/twilight.css create mode 100644 backend/static/highlight(1)/styles/base16/twilight.min.css create mode 100644 backend/static/highlight(1)/styles/base16/unikitty-dark.css create mode 100644 backend/static/highlight(1)/styles/base16/unikitty-dark.min.css create mode 100644 backend/static/highlight(1)/styles/base16/unikitty-light.css create mode 100644 backend/static/highlight(1)/styles/base16/unikitty-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/vulcan.css create mode 100644 backend/static/highlight(1)/styles/base16/vulcan.min.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-10-light.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-10-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-10.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-10.min.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-95-light.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-95-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-95.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-95.min.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-high-contrast-light.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-high-contrast-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-high-contrast.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-high-contrast.min.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-nt-light.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-nt-light.min.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-nt.css create mode 100644 backend/static/highlight(1)/styles/base16/windows-nt.min.css create mode 100644 backend/static/highlight(1)/styles/base16/woodland.css create mode 100644 backend/static/highlight(1)/styles/base16/woodland.min.css create mode 100644 backend/static/highlight(1)/styles/base16/xcode-dusk.css create mode 100644 backend/static/highlight(1)/styles/base16/xcode-dusk.min.css create mode 100644 backend/static/highlight(1)/styles/base16/zenburn.css create mode 100644 backend/static/highlight(1)/styles/base16/zenburn.min.css create mode 100644 backend/static/highlight(1)/styles/brown-paper.css create mode 100644 backend/static/highlight(1)/styles/brown-paper.min.css create mode 100644 backend/static/highlight(1)/styles/brown-papersq.png create mode 100644 backend/static/highlight(1)/styles/codepen-embed.css create mode 100644 backend/static/highlight(1)/styles/codepen-embed.min.css create mode 100644 backend/static/highlight(1)/styles/color-brewer.css create mode 100644 backend/static/highlight(1)/styles/color-brewer.min.css create mode 100644 backend/static/highlight(1)/styles/cybertopia-cherry.css create mode 100644 backend/static/highlight(1)/styles/cybertopia-cherry.min.css create mode 100644 backend/static/highlight(1)/styles/cybertopia-dimmer.css create mode 100644 backend/static/highlight(1)/styles/cybertopia-dimmer.min.css create mode 100644 backend/static/highlight(1)/styles/cybertopia-icecap.css create mode 100644 backend/static/highlight(1)/styles/cybertopia-icecap.min.css create mode 100644 backend/static/highlight(1)/styles/cybertopia-saturated.css create mode 100644 backend/static/highlight(1)/styles/cybertopia-saturated.min.css create mode 100644 backend/static/highlight(1)/styles/dark.css create mode 100644 backend/static/highlight(1)/styles/dark.min.css create mode 100644 backend/static/highlight(1)/styles/default.css create mode 100644 backend/static/highlight(1)/styles/default.min.css create mode 100644 backend/static/highlight(1)/styles/devibeans.css create mode 100644 backend/static/highlight(1)/styles/devibeans.min.css create mode 100644 backend/static/highlight(1)/styles/docco.css create mode 100644 backend/static/highlight(1)/styles/docco.min.css create mode 100644 backend/static/highlight(1)/styles/far.css create mode 100644 backend/static/highlight(1)/styles/far.min.css create mode 100644 backend/static/highlight(1)/styles/felipec.css create mode 100644 backend/static/highlight(1)/styles/felipec.min.css create mode 100644 backend/static/highlight(1)/styles/foundation.css create mode 100644 backend/static/highlight(1)/styles/foundation.min.css create mode 100644 backend/static/highlight(1)/styles/github-dark-dimmed.css create mode 100644 backend/static/highlight(1)/styles/github-dark-dimmed.min.css create mode 100644 backend/static/highlight(1)/styles/github-dark.css create mode 100644 backend/static/highlight(1)/styles/github-dark.min.css create mode 100644 backend/static/highlight(1)/styles/github.css create mode 100644 backend/static/highlight(1)/styles/github.min.css create mode 100644 backend/static/highlight(1)/styles/gml.css create mode 100644 backend/static/highlight(1)/styles/gml.min.css create mode 100644 backend/static/highlight(1)/styles/googlecode.css create mode 100644 backend/static/highlight(1)/styles/googlecode.min.css create mode 100644 backend/static/highlight(1)/styles/gradient-dark.css create mode 100644 backend/static/highlight(1)/styles/gradient-dark.min.css create mode 100644 backend/static/highlight(1)/styles/gradient-light.css create mode 100644 backend/static/highlight(1)/styles/gradient-light.min.css create mode 100644 backend/static/highlight(1)/styles/grayscale.css create mode 100644 backend/static/highlight(1)/styles/grayscale.min.css create mode 100644 backend/static/highlight(1)/styles/hybrid.css create mode 100644 backend/static/highlight(1)/styles/hybrid.min.css create mode 100644 backend/static/highlight(1)/styles/idea.css create mode 100644 backend/static/highlight(1)/styles/idea.min.css create mode 100644 backend/static/highlight(1)/styles/intellij-light.css create mode 100644 backend/static/highlight(1)/styles/intellij-light.min.css create mode 100644 backend/static/highlight(1)/styles/ir-black.css create mode 100644 backend/static/highlight(1)/styles/ir-black.min.css create mode 100644 backend/static/highlight(1)/styles/isbl-editor-dark.css create mode 100644 backend/static/highlight(1)/styles/isbl-editor-dark.min.css create mode 100644 backend/static/highlight(1)/styles/isbl-editor-light.css create mode 100644 backend/static/highlight(1)/styles/isbl-editor-light.min.css create mode 100644 backend/static/highlight(1)/styles/kimbie-dark.css create mode 100644 backend/static/highlight(1)/styles/kimbie-dark.min.css create mode 100644 backend/static/highlight(1)/styles/kimbie-light.css create mode 100644 backend/static/highlight(1)/styles/kimbie-light.min.css create mode 100644 backend/static/highlight(1)/styles/lightfair.css create mode 100644 backend/static/highlight(1)/styles/lightfair.min.css create mode 100644 backend/static/highlight(1)/styles/lioshi.css create mode 100644 backend/static/highlight(1)/styles/lioshi.min.css create mode 100644 backend/static/highlight(1)/styles/magula.css create mode 100644 backend/static/highlight(1)/styles/magula.min.css create mode 100644 backend/static/highlight(1)/styles/mono-blue.css create mode 100644 backend/static/highlight(1)/styles/mono-blue.min.css create mode 100644 backend/static/highlight(1)/styles/monokai-sublime.css create mode 100644 backend/static/highlight(1)/styles/monokai-sublime.min.css create mode 100644 backend/static/highlight(1)/styles/monokai.css create mode 100644 backend/static/highlight(1)/styles/monokai.min.css create mode 100644 backend/static/highlight(1)/styles/night-owl.css create mode 100644 backend/static/highlight(1)/styles/night-owl.min.css create mode 100644 backend/static/highlight(1)/styles/nnfx-dark.css create mode 100644 backend/static/highlight(1)/styles/nnfx-dark.min.css create mode 100644 backend/static/highlight(1)/styles/nnfx-light.css create mode 100644 backend/static/highlight(1)/styles/nnfx-light.min.css create mode 100644 backend/static/highlight(1)/styles/nord.css create mode 100644 backend/static/highlight(1)/styles/nord.min.css create mode 100644 backend/static/highlight(1)/styles/obsidian.css create mode 100644 backend/static/highlight(1)/styles/obsidian.min.css create mode 100644 backend/static/highlight(1)/styles/panda-syntax-dark.css create mode 100644 backend/static/highlight(1)/styles/panda-syntax-dark.min.css create mode 100644 backend/static/highlight(1)/styles/panda-syntax-light.css create mode 100644 backend/static/highlight(1)/styles/panda-syntax-light.min.css create mode 100644 backend/static/highlight(1)/styles/paraiso-dark.css create mode 100644 backend/static/highlight(1)/styles/paraiso-dark.min.css create mode 100644 backend/static/highlight(1)/styles/paraiso-light.css create mode 100644 backend/static/highlight(1)/styles/paraiso-light.min.css create mode 100644 backend/static/highlight(1)/styles/pojoaque.css create mode 100644 backend/static/highlight(1)/styles/pojoaque.jpg create mode 100644 backend/static/highlight(1)/styles/pojoaque.min.css create mode 100644 backend/static/highlight(1)/styles/purebasic.css create mode 100644 backend/static/highlight(1)/styles/purebasic.min.css create mode 100644 backend/static/highlight(1)/styles/qtcreator-dark.css create mode 100644 backend/static/highlight(1)/styles/qtcreator-dark.min.css create mode 100644 backend/static/highlight(1)/styles/qtcreator-light.css create mode 100644 backend/static/highlight(1)/styles/qtcreator-light.min.css create mode 100644 backend/static/highlight(1)/styles/rainbow.css create mode 100644 backend/static/highlight(1)/styles/rainbow.min.css create mode 100644 backend/static/highlight(1)/styles/rose-pine-dawn.css create mode 100644 backend/static/highlight(1)/styles/rose-pine-dawn.min.css create mode 100644 backend/static/highlight(1)/styles/rose-pine-moon.css create mode 100644 backend/static/highlight(1)/styles/rose-pine-moon.min.css create mode 100644 backend/static/highlight(1)/styles/rose-pine.css create mode 100644 backend/static/highlight(1)/styles/rose-pine.min.css create mode 100644 backend/static/highlight(1)/styles/routeros.css create mode 100644 backend/static/highlight(1)/styles/routeros.min.css create mode 100644 backend/static/highlight(1)/styles/school-book.css create mode 100644 backend/static/highlight(1)/styles/school-book.min.css create mode 100644 backend/static/highlight(1)/styles/shades-of-purple.css create mode 100644 backend/static/highlight(1)/styles/shades-of-purple.min.css create mode 100644 backend/static/highlight(1)/styles/srcery.css create mode 100644 backend/static/highlight(1)/styles/srcery.min.css create mode 100644 backend/static/highlight(1)/styles/stackoverflow-dark.css create mode 100644 backend/static/highlight(1)/styles/stackoverflow-dark.min.css create mode 100644 backend/static/highlight(1)/styles/stackoverflow-light.css create mode 100644 backend/static/highlight(1)/styles/stackoverflow-light.min.css create mode 100644 backend/static/highlight(1)/styles/sunburst.css create mode 100644 backend/static/highlight(1)/styles/sunburst.min.css create mode 100644 backend/static/highlight(1)/styles/tokyo-night-dark.css create mode 100644 backend/static/highlight(1)/styles/tokyo-night-dark.min.css create mode 100644 backend/static/highlight(1)/styles/tokyo-night-light.css create mode 100644 backend/static/highlight(1)/styles/tokyo-night-light.min.css create mode 100644 backend/static/highlight(1)/styles/tomorrow-night-blue.css create mode 100644 backend/static/highlight(1)/styles/tomorrow-night-blue.min.css create mode 100644 backend/static/highlight(1)/styles/tomorrow-night-bright.css create mode 100644 backend/static/highlight(1)/styles/tomorrow-night-bright.min.css create mode 100644 backend/static/highlight(1)/styles/vs.css create mode 100644 backend/static/highlight(1)/styles/vs.min.css create mode 100644 backend/static/highlight(1)/styles/vs2015.css create mode 100644 backend/static/highlight(1)/styles/vs2015.min.css create mode 100644 backend/static/highlight(1)/styles/xcode.css create mode 100644 backend/static/highlight(1)/styles/xcode.min.css create mode 100644 backend/static/highlight(1)/styles/xt256.css create mode 100644 backend/static/highlight(1)/styles/xt256.min.css create mode 100644 backend/static/js/chat.js create mode 100644 backend/static/js/highlight.min.js create mode 100644 backend/static/js/van.js create mode 100644 backend/templates/chatpreview.html.tera create mode 100644 backend/templates/error.html.tera create mode 100644 backend/templates/invite.html.tera diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 149814a..c83e5f8 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -18,3 +18,4 @@ sha2 = "0.10.9" sqlx = { version = "0.7.4", features = ["macros", "time"] } tokio = { version = "1.47.1", features = ["full"] } totp-rs = { version = "5.7.0", features = ["gen_secret", "qr", "rand"] } +uuid = { version = "1.18.1", features = ["v4"] } diff --git a/backend/migrations/20251010231008_invite-codes.sql b/backend/migrations/20251010231008_invite-codes.sql new file mode 100644 index 0000000..9aabb63 --- /dev/null +++ b/backend/migrations/20251010231008_invite-codes.sql @@ -0,0 +1,18 @@ +-- Add migration script here +CREATE TABLE access_codes ( + -- identifiers + id SERIAL PRIMARY KEY, + creator_id INTEGER NOT NULL REFERENCES users(id), + + -- code data + code VARCHAR(255) NOT NULL, + name VARCHAR(255) NOT NULL, + + -- uses + uses INTEGER NOT NULL DEFAULT 0, + max_uses INTEGER NOT NULL DEFAULT 1, + + -- time data + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + expires_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP + INTERVAL '1 day' +); diff --git a/backend/migrations/20251011002049_invite-codes-v2.sql b/backend/migrations/20251011002049_invite-codes-v2.sql new file mode 100644 index 0000000..3ae502b --- /dev/null +++ b/backend/migrations/20251011002049_invite-codes-v2.sql @@ -0,0 +1,10 @@ +-- Add migration script here +ALTER TABLE access_codes +ALTER COLUMN created_at +TYPE TIMESTAMP WITH TIME ZONE +USING created_at AT TIME ZONE 'UTC'; + +ALTER TABLE access_codes +ALTER COLUMN expires_at +TYPE TIMESTAMP WITH TIME ZONE +USING expires_at AT TIME ZONE 'UTC'; diff --git a/backend/src/auth.rs b/backend/src/auth.rs deleted file mode 100644 index da94ee1..0000000 --- a/backend/src/auth.rs +++ /dev/null @@ -1,282 +0,0 @@ -use std::time::{SystemTime, UNIX_EPOCH}; - -use rand::Rng; -use rocket::{ - Request, - http::{CookieJar, Status}, - outcome::{Outcome, try_outcome}, - post, - request::{self, FromRequest}, - response::{Redirect, status}, - serde::json::Json, -}; -use rocket_db_pools::{ - Connection, - sqlx::{self}, -}; -use rocket_dyn_templates::{Template, context}; -use serde::{Deserialize, Serialize}; -use sha2::{Digest, Sha256}; -use sqlx::postgres::PgQueryResult; -use totp_rs::{Algorithm, Secret, TOTP}; - -use crate::db::DbConn; - -#[derive(Serialize, Deserialize)] -pub struct UserCredentials { - pub username: String, - pub password: String, -} - -#[get("/signup")] -pub async fn signup_page() -> Template { - Template::render("signup", context!()) -} - -#[post("/signup", data = "")] -pub async fn signup( - cred: Json, - jar: &CookieJar<'_>, - mut db: Connection, -) -> Result { - let result = sqlx::query!( - "INSERT INTO users (username, password) VALUES ($1, $2) RETURNING id", - cred.username, - cred.password - ) - .fetch_one(&mut **db) - .await - .map_err(|e| Status::InternalServerError)?; - - let session = Session::new(result.id as usize); - if let Err(e) = session.commit(&mut db).await { - eprintln!("Failed to create session: {}", e); - return Err(Status::InternalServerError); - } - - jar.add_private(("session", session.token)); - - println!("Signup successful"); - return Ok(Redirect::to("/chat")); -} - -#[get("/login")] -pub async fn login_page() -> Template { - Template::render("login", context!()) -} - -#[post("/login", data = "")] -pub async fn login( - mut db: Connection, - jar: &CookieJar<'_>, - cred: Json, -) -> Result { - if let Ok(row) = sqlx::query!( - "SELECT id FROM users WHERE username = $1 AND password = $2", - cred.username, - cred.password, - ) - .fetch_one(&mut **db) - .await - { - let session = Session::new(row.id as usize); - if let Err(e) = session.commit(&mut db).await { - eprintln!("Failed to create session: {}", e); - return Err(Status::InternalServerError); - } - - jar.add_private(("session", session.token)); - return Ok(Redirect::to("/chat")); - } - - // TODO: implement actual login logic, e.g. verify password and generate token - Err(Status::Unauthorized) -} - -#[derive(Debug, Clone)] -pub struct Session { - pub token: String, - pub user_id: usize, -} - -impl Session { - pub fn new(user_id: usize) -> Self { - let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap(); - let random: u32 = rand::rng().random(); - let token = format!("{}-{}", current_time.as_secs(), random); - let hashed = format!("{:x}", Sha256::digest(token.as_bytes())); - Self { - token: hashed, - user_id, - } - } - - pub async fn commit(&self, db: &mut Connection) -> Result { - sqlx::query!( - "INSERT INTO sessions (user_id, token) VALUES ($1, $2)", - self.user_id as i32, - self.token, - ) - .execute(&mut ***db) - .await - } -} - -#[rocket::async_trait] -impl<'r> FromRequest<'r> for Session { - type Error = (); - - async fn from_request(request: &'r Request<'_>) -> request::Outcome { - if let Some(c) = request.cookies().get_private("session") { - let mut pool = match request.guard::>().await { - Outcome::Success(pool) => pool, - _ => return Outcome::Error((Status::Unauthorized, ())), - }; - - let value = c.value(); - let result = sqlx::query!( - "SELECT user_id, token FROM sessions WHERE token = $1 AND expires_at > NOW()", - value - ) - .fetch_optional(&mut **pool) - .await - .expect("query failed!"); - - if let Some(session) = result { - Outcome::Success(Self { - user_id: session.user_id as usize, - token: session.token, - }) - } else { - Outcome::Error((Status::Unauthorized, ())) - } - } else { - Outcome::Error((Status::Unauthorized, ())) - } - } -} - -// --------------------- TOTP 2FA Auth ----------------------- - -#[get("/totp")] -pub async fn mfa_page(_session: Session) -> Template { - Template::render("2fa", context!()) -} - -#[derive(Debug, Deserialize)] -pub struct Totp { - code: String, -} - -#[post("/totp", data = "")] -pub async fn confirm_totp( - mfa: MultiFactorEnabled, - totp: Json, - mut db: Connection, -) -> Status { - if totp.code.len() == 6 - && let Ok(code) = totp.code.parse::() - { - let secret = match sqlx::query!( - "SELECT totp_secret FROM users WHERE id = $1", - mfa.user_id as i32 - ) - .fetch_one(&mut **db) - .await - { - Err(_) => return Status::InternalServerError, - Ok(user) => user.totp_secret, - }; - } - - return Status::BadRequest; -} - -#[derive(Serialize)] -pub struct QrResponse { - qr_code: String, -} - -#[get("/totp.jpg")] -pub async fn get_totp(mfa: MultiFactorEnabled) -> Option> { - let totp = TOTP::new( - Algorithm::SHA1, - 6, - 1, - 30, - mfa.secret.as_bytes().into(), - Some("chat.zxq5.dev".to_string()), - format!("{}", mfa.user_id), - ) - .unwrap(); - - let qr = totp.get_qr_base64().unwrap(); - let data_uri = format!("data:image/png;base64,{}", qr); - - Some(Json(QrResponse { qr_code: data_uri })) -} - -pub struct MultiFactorEnabled { - user_id: usize, - secret: String, -} - -#[rocket::async_trait] -impl<'r> FromRequest<'r> for MultiFactorEnabled { - type Error = (); - - async fn from_request(request: &'r Request<'_>) -> request::Outcome { - let user = try_outcome!(request.guard::().await); - let mut pool = match request.guard::>().await { - Outcome::Success(pool) => pool, - _ => return Outcome::Error((Status::Unauthorized, ())), - }; - - let (enabled, mut secret) = match sqlx::query!( - "SELECT twofa_enabled, totp_secret FROM users WHERE id = $1", - user.user_id as i32, - ) - .fetch_one(&mut **pool) - .await - { - Ok(row) => (row.twofa_enabled, row.totp_secret), - Err(_) => return Outcome::Error((Status::Unauthorized, ())), - }; - - if !enabled || secret.is_none() { - secret = Some(Secret::generate_secret().to_string()); - - match sqlx::query!( - "UPDATE users SET totp_secret = $1 WHERE id = $2", - secret.as_ref().unwrap(), - user.user_id as i32, - ) - .execute(&mut **pool) - .await - { - Ok(_) => (), - Err(_) => return Outcome::Error((Status::InternalServerError, ())), - } - } - - Outcome::Success(MultiFactorEnabled { - user_id: user.user_id, - secret: secret.unwrap(), - }) - } -} - -impl MultiFactorEnabled { - pub async fn enable(&self, db: &mut Connection) -> Result<(), ()> { - match sqlx::query!( - "UPDATE users SET twofa_enabled = true WHERE id = $1", - self.user_id as i32, - ) - .execute(&mut ***db) - .await - { - Ok(_) => Ok(()), - Err(_) => Err(()), - } - } -} diff --git a/backend/src/auth/account.rs b/backend/src/auth/account.rs new file mode 100644 index 0000000..3c6515a --- /dev/null +++ b/backend/src/auth/account.rs @@ -0,0 +1,182 @@ +use rocket::{ + http::{CookieJar, Status}, + response::{Redirect, status::BadRequest}, + serde::json::Json, + time::{OffsetDateTime, PrimitiveDateTime}, +}; +use rocket_db_pools::Connection; +use rocket_dyn_templates::{Template, context}; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use crate::{auth::session::Session, db::DbConn}; + +#[derive(Serialize, Deserialize)] +pub struct SignupCredentials { + pub email: String, + pub username: String, + pub password: String, + pub access_token: String, +} + +#[derive(Serialize, Deserialize)] +pub struct LoginCredentials { + pub username: String, + pub password: String, +} + +#[get("/signup")] +pub async fn signup_page() -> Template { + Template::render("signup", context!()) +} + +#[post("/signup", data = "")] +pub async fn signup( + cred: Json, + jar: &CookieJar<'_>, + mut db: Connection, +) -> Result> { + println!("phase 1 {}", cred.access_token); + let token_id = AccessToken::validate(&cred.access_token, &mut db).await?; + + println!("phase 2"); + let result = sqlx::query!( + "INSERT INTO users (email, username, password) VALUES ($1, $2, $3) RETURNING id", + cred.email, + cred.username, + cred.password + ) + .fetch_one(&mut **db) + .await + .map_err(|e| BadRequest(String::from("Failed to create user")))?; + + println!("phase 3"); + let session = Session::new(result.id as usize); + if let Err(e) = session.commit(&mut db).await { + eprintln!("Failed to create session: {}", e); + return Err(BadRequest(String::from("Failed to create session"))); + } + + println!("phase 4"); + jar.add_private(("session", session.token)); + + token_id.use_token(&mut db).await?; + + println!("phase 5"); + return Ok(Redirect::to("/chat")); +} + +#[get("/login")] +pub async fn login_page() -> Template { + Template::render("login", context!()) +} + +#[post("/login", data = "")] +pub async fn login( + mut db: Connection, + jar: &CookieJar<'_>, + cred: Json, +) -> Result { + if let Ok(row) = sqlx::query!( + "SELECT id FROM users WHERE username = $1 AND password = $2", + cred.username, + cred.password, + ) + .fetch_one(&mut **db) + .await + { + let session = Session::new(row.id as usize); + if let Err(e) = session.commit(&mut db).await { + eprintln!("Failed to create session: {}", e); + return Err(Status::InternalServerError); + } + + jar.add_private(("session", session.token)); + return Ok(Redirect::to("/chat")); + } + + // TODO: implement actual login logic, e.g. verify password and generate token + Err(Status::Unauthorized) +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AccessTokenForm { + pub name: String, + pub max_uses: usize, + pub expiry_date: usize, + pub start_date: usize, +} + +#[get("/invite")] +pub async fn invite_page(s: Session) -> Template { + Template::render("invite", context! {}) +} + +#[post("/invite", data = "
")] +pub async fn generate_invite( + session: Session, + mut db: Connection, + form: Json, +) -> Result { + if form.start_date > form.expiry_date { + return Err(Status::BadRequest); + } + + let code = Uuid::new_v4().to_string(); + let row = sqlx::query!( + "INSERT INTO access_codes (name, code, creator_id, max_uses, created_at, expires_at) + VALUES ($1, $2, $3, $4, $5, $6) RETURNING id", + form.name, + code, + session.user_id as i32, + form.max_uses as i32, + OffsetDateTime::from_unix_timestamp_nanos(form.start_date as i128 * 1_000_000).unwrap(), + OffsetDateTime::from_unix_timestamp_nanos(form.expiry_date as i128 * 1_000_000).unwrap() + ) + .fetch_one(&mut **db) + .await + .map_err(|_| Status::InternalServerError)?; + + Ok(code) +} + +pub struct AccessToken { + id: i32, + code: String, +} + +impl AccessToken { + pub async fn validate( + token: &str, + db: &mut Connection, + ) -> Result> { + match sqlx::query!( + "SELECT id FROM access_codes + WHERE code = $1 + AND created_at < NOW() + AND expires_at > NOW() + AND uses < max_uses", + token + ) + .fetch_one(&mut ***db) + .await + { + Ok(row) => Ok(AccessToken { + id: row.id, + code: token.to_string(), + }), + Err(_) => Err(BadRequest(String::from("Invalid or Expired token!"))), + } + } + + pub async fn use_token(&self, db: &mut Connection) -> Result<(), BadRequest> { + sqlx::query!( + "UPDATE access_codes SET uses = uses + 1 WHERE id = $1", + self.id + ) + .execute(&mut ***db) + .await + .map_err(|_| BadRequest(String::from("Invalid or Expired token!")))?; + Ok(()) + } +} diff --git a/backend/src/auth/mod.rs b/backend/src/auth/mod.rs new file mode 100644 index 0000000..da67d56 --- /dev/null +++ b/backend/src/auth/mod.rs @@ -0,0 +1,8 @@ +pub mod account; +pub mod session; +pub mod two_factor; + +pub use session::Session; + +pub use account::{generate_invite, invite_page, login, login_page, signup, signup_page}; +pub use two_factor::{confirm_totp, get_totp, mfa_page}; diff --git a/backend/src/auth/session.rs b/backend/src/auth/session.rs new file mode 100644 index 0000000..95d5601 --- /dev/null +++ b/backend/src/auth/session.rs @@ -0,0 +1,76 @@ +use std::time::{SystemTime, UNIX_EPOCH}; + +use rand::Rng; +use rocket::{ + Request, + http::Status, + request::{self, FromRequest, Outcome}, +}; +use rocket_db_pools::Connection; +use sha2::{Digest, Sha256}; +use sqlx::postgres::PgQueryResult; + +use crate::db::DbConn; + +#[derive(Debug, Clone)] +pub struct Session { + pub token: String, + pub user_id: usize, +} + +impl Session { + pub fn new(user_id: usize) -> Self { + let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap(); + let random: u32 = rand::rng().random(); + let token = format!("{}-{}", current_time.as_secs(), random); + let hashed = format!("{:x}", Sha256::digest(token.as_bytes())); + Self { + token: hashed, + user_id, + } + } + + pub async fn commit(&self, db: &mut Connection) -> Result { + sqlx::query!( + "INSERT INTO sessions (user_id, token) VALUES ($1, $2)", + self.user_id as i32, + self.token, + ) + .execute(&mut ***db) + .await + } +} + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for Session { + type Error = (); + + async fn from_request(request: &'r Request<'_>) -> request::Outcome { + if let Some(c) = request.cookies().get_private("session") { + let mut pool = match request.guard::>().await { + Outcome::Success(pool) => pool, + _ => return Outcome::Error((Status::Unauthorized, ())), + }; + + let value = c.value(); + let result = sqlx::query!( + "SELECT user_id, token FROM sessions WHERE token = $1 AND expires_at > NOW()", + value + ) + .fetch_optional(&mut **pool) + .await + .expect("query failed!"); + + if let Some(session) = result { + Outcome::Success(Self { + user_id: session.user_id as usize, + token: session.token, + }) + } else { + Outcome::Error((Status::Unauthorized, ())) + } + } else { + Outcome::Error((Status::Unauthorized, ())) + } + } +} diff --git a/backend/src/auth/two_factor.rs b/backend/src/auth/two_factor.rs new file mode 100644 index 0000000..80a050a --- /dev/null +++ b/backend/src/auth/two_factor.rs @@ -0,0 +1,156 @@ +use rocket::{ + Request, + http::Status, + outcome::{Outcome, try_outcome}, + request::{self, FromRequest}, + serde::json::Json, +}; +use rocket_db_pools::Connection; +use rocket_dyn_templates::{Template, context}; +use serde::{Deserialize, Serialize}; +use totp_rs::{Algorithm, Secret, TOTP}; + +use crate::{auth::session::Session, db::DbConn}; + +// Utility methods + +pub fn totp_gen(user_id: usize, secret: &[u8]) -> Result { + TOTP::new( + Algorithm::SHA1, + 6, + 1, + 30, + secret.to_owned(), + Some("chat.zxq5.dev".to_string()), + format!("{}", user_id), + ) + .map_err(|_| String::from("Invalid Secret")) +} + +// pages + +#[get("/totp")] +pub async fn mfa_page(_session: Session) -> Template { + Template::render("2fa", context!()) +} + +// api + +#[post("/totp", data = "")] +pub async fn confirm_totp( + mfa: TOTPSecret, + totp: Json, + mut db: Connection, +) -> Status { + if totp.code.len() == 6 + && let Ok(code) = totp.code.parse::() + { + let totp = totp_gen(mfa.user_id, mfa.secret.as_bytes()).unwrap(); + + println!("input: {} {}", code, totp.generate_current().unwrap()); + + if totp.check_current(&format!("{}", mfa.user_id)).unwrap() { + if sqlx::query!( + "UPDATE users SET twofa_enabled = true WHERE id = $1", + mfa.user_id as i32 + ) + .execute(&mut **db) + .await + .is_err() + { + return Status::InternalServerError; + }; + } + } + + println!("ok!"); + + return Status::Ok; +} + +#[get("/totp.jpg")] +pub async fn get_totp(mfa: TOTPSecret) -> Option> { + let qr_b64 = totp_gen(mfa.user_id, mfa.secret.as_bytes()) + .expect("Invalid TOTP") + .get_qr_base64() + .unwrap(); + + Some(Json(QrResponse { + qr_code: format!("data:image/png;base64,{}", qr_b64), + })) +} + +#[derive(Debug, Deserialize)] +pub struct TOTPSixDigitCode { + code: String, +} + +pub struct TOTPSecret { + user_id: usize, + secret: String, +} + +#[derive(Serialize)] +pub struct QrResponse { + qr_code: String, +} + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for TOTPSecret { + type Error = (); + + async fn from_request(request: &'r Request<'_>) -> request::Outcome { + let user = try_outcome!(request.guard::().await); + let mut pool = match request.guard::>().await { + Outcome::Success(pool) => pool, + _ => return Outcome::Error((Status::Unauthorized, ())), + }; + + let (enabled, mut secret) = match sqlx::query!( + "SELECT twofa_enabled, totp_secret FROM users WHERE id = $1", + user.user_id as i32, + ) + .fetch_one(&mut **pool) + .await + { + Ok(row) => (row.twofa_enabled, row.totp_secret), + Err(_) => return Outcome::Error((Status::Unauthorized, ())), + }; + + if !enabled || secret.is_none() { + secret = Some(Secret::generate_secret().to_string()); + + match sqlx::query!( + "UPDATE users SET totp_secret = $1 WHERE id = $2", + secret.as_ref().unwrap(), + user.user_id as i32, + ) + .execute(&mut **pool) + .await + { + Ok(_) => (), + Err(_) => return Outcome::Error((Status::InternalServerError, ())), + } + } + + Outcome::Success(TOTPSecret { + user_id: user.user_id, + secret: secret.unwrap(), + }) + } +} + +impl TOTPSecret { + pub async fn enable(&self, db: &mut Connection) -> Result<(), ()> { + match sqlx::query!( + "UPDATE users SET twofa_enabled = true WHERE id = $1", + self.user_id as i32, + ) + .execute(&mut ***db) + .await + { + Ok(_) => Ok(()), + Err(_) => Err(()), + } + } +} diff --git a/backend/src/handlers.rs b/backend/src/handlers.rs new file mode 100644 index 0000000..d65a7e9 --- /dev/null +++ b/backend/src/handlers.rs @@ -0,0 +1,62 @@ +use rocket::{Request, http::Status}; +use rocket_dyn_templates::{Template, context}; +use serde::Serialize; + +#[derive(Serialize)] +struct ErrorContext { + error_code: u16, + error_message: &'static str, + additional_info: &'static str, + redirect: Option, +} + +#[derive(Serialize)] +struct RedirectContext { + url: &'static str, + message: &'static str, +} + +#[catch(404)] +pub async fn handle_404() -> Template { + Template::render( + "error", + ErrorContext { + error_code: 404, + error_message: "Not Found", + additional_info: "There's nothing here.", + redirect: Some(RedirectContext { + url: "/", + message: "Home", + }), + }, + ) +} + +#[catch(401)] +pub async fn handle_401() -> Template { + Template::render( + "error", + ErrorContext { + error_code: 401, + error_message: "Unauthorised", + additional_info: "You are not authorised to access this resource.", + redirect: Some(RedirectContext { + url: "/login", + message: "Login", + }), + }, + ) +} + +#[catch(default)] +pub async fn handle_default(status: Status, _request: &Request<'_>) -> Template { + Template::render( + "error", + ErrorContext { + error_code: status.code, + error_message: "Unknown Error", + additional_info: "I don't know what to do with this error.", + redirect: None, + }, + ) +} diff --git a/backend/src/main.rs b/backend/src/main.rs index 2f400c8..49ca698 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -18,6 +18,7 @@ use crate::messages::ChatBroadcaster; pub mod auth; pub mod cdn; pub mod db; +pub mod handlers; pub mod llm; pub mod messages; @@ -71,9 +72,11 @@ fn rocket() -> Rocket { routes![ favicon, messages::chat_page, + messages::chat_page_preview, auth::signup_page, auth::login_page, auth::mfa_page, + auth::invite_page, ], ) .mount( @@ -87,6 +90,16 @@ fn rocket() -> Rocket { auth::signup, auth::login, auth::get_totp, + auth::confirm_totp, + auth::generate_invite, + ], + ) + .register( + "/", + catchers![ + handlers::handle_404, + handlers::handle_401, + handlers::handle_default ], ) } diff --git a/backend/src/messages.rs b/backend/src/messages.rs index 4be21d1..7299d2a 100644 --- a/backend/src/messages.rs +++ b/backend/src/messages.rs @@ -161,3 +161,8 @@ pub async fn event_stream( pub async fn chat_page(session: Session) -> Template { Template::render("chat", context!(user_id: session.user_id)) } + +#[get("/chatpreview")] +pub async fn chat_page_preview(session: Session) -> Template { + Template::render("chatpreview", context!(user_id: session.user_id)) +} diff --git a/backend/static/favicon.ico b/backend/static/favicon.ico index 62a6d8c730154b33684ec114ffe170a3a0cd47be..1adf3b783de24f0a0c518d55bd62de95120f41ee 100644 GIT binary patch literal 59951 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 z

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 literal 15290 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 diff --git a/backend/static/highlight(1).zip b/backend/static/highlight(1).zip new file mode 100644 index 0000000000000000000000000000000000000000..e90223ee8d711e6c0c1fe50aa26c5e31efb69716 GIT binary patch literal 2979207 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℘<5lB+$#+oDF!oV!@LlPg-Zyw# z9scpGJot31+sAo%Fh=Q8ZLd_RIm1i7bdq2Tc9?^iP2Ia`?7Gu#rznqx^nmRof_Nv4 zJ-+=wvdrIJPDhw;vN~;j;z^G!-|_Y!il4xD>^i?5gU}y8(gawv_iOKH#(9Y&hyGaO zaI*tde;ibv#X@^+O+6kaJX@n?fKv02vFj21eoQs}?U*J>+o#Mri<(kDcTn0rlQN_S zm!Ab;XUUN?qS(9NgOX(g?T!4Q@56r8c4YJ0YpTYd=$Cz5SeN!Z%esA}9)Ju2xZT&iz$-WsovneteMt1a7;{cE z9*HkxX+k#e95OJ%n@jrl%XIwsDILPuD)e0Wv$m%d^`Cx9AD+ha>HNrOJ=la4F3w4- zD8+w*;|>(g%>%}fT9<5FMHblXnTCtLIN9_r=K{W~(2wHav@DY@XAG1u>2~lv8%}Kp ziT|un_BWt>yb)6aDDeXnru(q7y_XIy9q$V$Z>eQ7Ht<$>D+I4^KVX!8f_Q&c*6BFy z-s#=b3wQ-jA8F*%%N-W@1=TNqT2HgR@8^2@=8V1{_EP-x2Mo*B_L*Yu72}VU2+QJP z4qV?{r*0{irGFmwQUSk$&!53p@cGxTpK*`{K<=MUm)Fm?AO}9*rWx>mI%|%z7q)^)R8R zKAqGwUIg1HK@Q3So@`Sk1OYN)8wLlJ!{<>_y#Wx1*a#@duw2)2jrU&e=-V!`GZ~so z6L2h7VaJd)IW=Dy(nsvqe)zke-HE-*+WquX_RE9iYA8u(dOjO20h%P$6&dz7 zk;&TNDvX{d|ZYh<3KvZ>znI?dR_l|{je{5p2+195YJCH zzkYrC&(F`#FE6jp&kwg>o?l*{Z=Qes_4WDr=BaSsczMd-H(tKn;D}#b;27Ryf{jClE)#;xQBfkusy?4Q+cVL?OhZD<^vFb8Y;7XTjnjfi%DV^L80!b#3zlw`3A4Y#XStfSwzL@9 zAI-FMUy2o7hrrvo7(}Ms2DSlrV2Kc}gYOH~dk?W!fxQMrrWc~qUa3&65U9sRG_FY` zC{QiDmwkWI2=fC458&(l?Y_AE<|8t@b@cbQxG1n^*r^Hlj+u+g&*z24KNG|J79f1y z2sKZqA2xZZRB$2u02`OWvE#K-1l-u6GT(}qmHG21HtA5Os>E9l^?U+xhUuq`?G z3s2Y6-I%A1viBGx4zUl>QwH_z9X><#2(Iyl2n=qYP7Tn({C)%ZL(p+RmdW<uymn4!mCN`T<<@G;ARowR!hVoE+GDwk*)!Bf~&*dubhMISb5A;2h{XuqR{d;b}(l&GjjjXG)UGy>&cr zHv5_VzmEXCI9)0KxJ|VV^Ya_{{pN4q1N7te_kE;&P~+pqrIS4PAMC`;woT&yaR_vb znEp|r3^zV(*Zh%oJ$%Z7Oakx1#K%Vtvp9>D`lL*?f8zzY&G9YlEU{5mo}0wa`v&QG zwd}?96TIJ%_w$$M=gpVvLxT~I&-_t>$o%#}+uzO`^P_%~5%=JppOxolEqC+${D6Pn z{(6K-{dU&y=Kj~)o9AaG|CCH$p5VPs-m};%=Y<>@~6@@oeC z_WEb6i23B<;o%PC)BiQ3;*8-P&}|P!2M@*Zq&PdL;Q3j($tzF!!b|P|M|pTS_%xCE zO_E7bW<+T}w7GeN7zW((3(@(EIJ-$9af5G4QmmL0ne7$?Uf4zTv zB_3ai*RQWXzy9*e>o31NzT$tckB^V9_}}ZdZ{P5LkFV*EZ?E{@>+>@n>eK7<^LOkj zU!R}xy`j~EWl zA?$6#DZIn>2IAq%vqBs`oxnRhBA%6pFGOl4@QmHh*SBq#*-9?WXnh6O4vOG))-}cU z^#i2H)xHAaZ+oQpaLyX<|Njc|S;ylv1>esnW4hf2fX|-$H3k0pE4XoRY9#beJk;Jm z?TznW9v`vqz-=DRHU(#92@mPVvErQWPCHI;yzMwV=rT!lr5-7@e`6$y9N_7V2fiQU z_4D)d^V9Ql`1~xrq`8u}F=3#YILUz^{f3Wi@~z+c0)2pSU|r^7Qsy1OUZ)>ZhF$MJ zShkG}Xn(~>-SjmMpYTbGfZL{__d;?Du~w@)t`{5TtKqpWd^J4FHC{K7{u+9(VXT_38_Tv|w_c3D1B`I{iVrrvI$nTopA`bL zEX^{1Imr#+BZJ6|_FLo6a+DVl-j8fdr@`I37Rc33->3fR6@35k13Y1++b1<%(l*(I z3&Hm@Tazt#GrgjOetKT{@pzEpCS~g##&egFd`OdI`!=xVW?eBh@OUztQ%jLeX>ioc z{oqq=z+V~ky-~q9_P?Ge;!FDINA~7qOjiJ;GY>z)*`-u*vt0lg*28SjJT-#ZY)DJ@ zCf<;N|6Dg-Ql{Zg=tC8y$MS)KZ~(vGMyWlVytcx(3KodGl&a&xAX`Lwc%$eV3pcG- z;mhN)y>LNn;{`k33y%-~1H)4k8zYK+e6}uvIK_Bi$5(KTZS&2qk2iQf>?_Mn`^+mZ z$jobV)Or;LGS}zk%xjyZy06pe^!DrRo}ZaH{Ik9GRud)ouV|wtw)1%JZM@&Fc4|%c zhgc4>X82Z*liKMV1doT5(t#sy_dBG)O(8vtQ^bLLdI;4EG`#O0Fs@-+p_%sj%ze(} z`xzd7vBJY|p?CN#K0b?%&tPP|pTqmzOYZ6V#2rS6 z)$;%d+~e)h*AdvD>s0-=_$alFqU-Puph(Tw_y+YJhgZ9oTn6cP*Sp`q?eA&REK)zV zP1}7h-u)mj&g|%g3Vka|tCbqwAAz^S;XekyPaWa4Ylz$^OvtL)^xHTyuuTB$=y8N+-(4Q zrMn-mR`?2EIc(J9@bxK@U!FYS zM{uA0z)N{zxyI-0q*`{)`!>U5SZfr5INkFY1)ggFe1H<#8UHrudY#rOGuFuBs5d(t z5b}u)9HRd@-~2z4qgBtSX&{^4WR_$Lvg@QFAD%6LSNrn9u64)nFGUC z7{(|hiuGbG%S;?YzVpZ$fK*qr*?!zIff;)6Ephmf|H!yXd;x!lab$V{XnG3htA=IU zhiDgnUEdsiFF3Q~2hWS~V_iR2^xI=x55P6n`0Lw)ok(+6r3?K{d4wb4)J5+jee9{z zt(W^?AlC!F_n@U)%w3V6evL(0V z?948TC4po}LYe|t0BBhya_;9@=6>E|uID-CZZ2kh`zInmQns_Y`*5XGBoP0xW5@pA zLUSl7CqJXDZg(pQw!VU{PRoDy`sBr*9%xWOG~C(p81O!w53l!(PWzw{-SoCq2Izr0=3YRD1_x>XgU zo_C{zwEvgxc>z9>0fY&V^KSn-zn$F=o)Xk3ZPpX-l4Z_K9QSu5KR;VMi5A=CJfRROTh8Kg*0e}8fD_NUXMi;JgS zSse)!006zXm{w&|UR?Cp{&*u;kz4duo}kq7`R%Pdp;9fGAjZ^NLUnkyTJm(I9HT_J zBYOG;HD9c`a(Zi@a_N-|4TV=8a#`=LK`HNN>pg~R-||RTz_z#g2yLufeZAF3D5vPB zXTRa;vKYFz@`Orxh^f~?Q+Vr5s^|ak-eG>Nt8`Vs(_8ZlEv(3)daI96&b!un{ttfV z%Zc&Y|BVtNUG3=?JabsS=Y7YUHCVm3?%`5dzd^4F_jm&bkg%|`*ndP*p-Kjg)36#d z;tSf~@DSC}$HvBrzz;TY?FK(o+3hVECp4yjZ9*M%gXv^;ofo9&JTu0{-}z1C@z-CI zLU~OG%+Q9!@Qh$#U(c?yD#VpDG%x@_U`_T66uy!0J&i}XsmlCymLn1aMWTXFMm4#| zPuA>PPeO>jw?uuE7ZP|&pdU~KBVa=L7HS&A7FY(lCGoDtegDjZjO#{hU-ULNH zBI9ouanOgrgdN6zW(W76FxMFiaLV%i&d}Ttzb($WO$j3jV#qnFz~o-3nzQ%$6l4p` zvT#r44M!yd%QZ4IsxjPDNLWi@_k7BOm+4PTaMhRSNLe*%5tDKoRtFFr!~7$78e9&` zVMj={&bW-?OS0Txg2}?5jgCgf5_dTko#rtkIw?a-6gD)Q1Q!ah7ap}iW(Cmk5~T#n zrDl$PY3RNrnQfW~&dJx>f^f4NcY=-7dkS3X=pTp@^Xw-DHrYnhMrfW<+8_76$^Qk{BWwma}4v7|oE`mrYR5D9D~E8Zyt4kdiRd zq9$k*OI4Y{LIB>IyfLgGfcL+1TMKTo>Xrm{#eFc!YJ(_|z-zNg=K$dz2WaSaIUM2^ zERmoFpcY9EZs(g7_jlPnY~pBWbpz3j8z9i9PK-xKypf7sX_;a90=+mmyVb=f1KTFr z3bw=y0tSk(Q;eg7C$RL24$|}U;r#r(j<>Lh)WpRFpD9Yy@oW@A-Vq zh)~Uk(MB+xc5(^7d%%5Fws_?ncab1diI zbDV7-WX0kgXIet`R29pc%L>vP9eE{|8N z;$4Te=-?7+@8mW8rBWT~tR3)xrlG^I8lO(5v49{c(d2L1`ct(WShq<3wJiA{J|0p%x2U;ypsjtUuW4QzsgM&5+vX>)A}$qYsd#spodqM+ysXv=zC2L`t)uf zQeyAT5nR#&nZ9085{i(ZUtj^m293^#m2Q{Kv1^>jt4WRk?zHLf(tAth%3^wZC)6iF z`g;@9GtlfexLopy1U4cCu-ry8MKgB6&>FbR_~6MQgx12O9V?WG07;EKPh;bX0+CEh zY2Yxj46yOYBuv7?f|dFtr56d#dvnkCycfmsy}4(z7#~}6q%e{UDg0Y(?*f*gU;Er% z6M9fY_u&t+dN7RQ6rCdIW{wut_wEza{t07F-|%d8U* z7VMS)Su**UP`68n-Q8w>bN+-Rc2U>AwX!B);}hnjiqfJ1*E~o36Ftbun>Q!N7k@hX zcd~(jr|<^kepe*4-pYzGf4M4IU$K?5anDv!vf;&+eIZrA2yz`hC0nAjCjI?~tjako zD|0B<(UYw9YR49NH+8AHK5BUcJ zZuibD9hp*OmVU&tS1^dpFN#W_2S zJJRpVeAG}h7PaM&VU2ZM4o9rSEQBRJSTT*poQW$9NEAK!i0SPJ7x$EOs_cVCsEX+< zfYcbJVEPZwD#HQgiSwb^N9^8!_|GJ+n3g%rYoKKiTPU;)LJ8*+SY6#P-CnU}F&DSy z#WL^LdEKxJF}h3qEf#VaQOXEEdSQIqWRusG4Gr-5=KVHV`Q;;EzfBvU!NzyA>!bW4 zQLXCDPxJ!V5D8sL&Jyg>fNP1*xDA0xpEfcS3<(h7n6U~Rj7u4x(i?r@kGF3}H~17_ zGd>j!F$c-zkdvZrS?*ie0Wq+!-rFLoBwr%WsY9)h6a+CRiSBmvu@{8U8Rb_j+af1{ z`5!~CjGk?VnuUW%Dq~+0Ac!aC^M!T>prUfHD$q^S2`xjM3=ofXHvz`rC_P-FuL8e( zkov#K-u)v8oR6KRd|lp|>P1$YNJDl&0otm*3Rf}~*BRe9(=3NixV%+1at z!bu-B`nv-}E_L8QSgkVOmz97`B*hZy0U9U`Zo!AchMqtkBt#%(Dw)N1*piApXEHK; zDRh8>?hoPe(`4_7%_h2&ocSGP!}p#bAp_rcE`bP@YC_@qq8$$`mA7YFYXc< z3rOC1n-w#X$uT*F6jEN$KLs7>XWgs5W`sJ!TwtZybs>PMGjFk^okUp%uEcvqhKLvp z*Q$eTLb8NA1eX0^NIi;+Sm(^>w=O9e2aqdCjDb{XQOm1f4^W6y9hIRe=0(j=4d84I zTcJhHt@wwuivUn4?tnYox21}ebY^jI5bOp$WgnPDUJhpp6DKWwN>?mqHOmv+&uoB>KAyi2iZ+ z_hd{YaJ=))AHI3^%^&};_fPErBrG9lhbh*Gv@N6G+L+=cZeLDXMpU#5uDY_8w+P~L z&BP6(2ZK2H#A)#>YeA3K<-~NTK%{Sl2IlQu-YM6*eU%mW*1K6X_jg$ZS(LU(ftuNG zUHCigdQx6Tmp>n#9`}N;9;ETbr7Qo*!F(_k6ea6Ut{bNgX)H@fuKtl!O|+n06C9uA z74Khu^&k}%U2mAAkq6$RyRS7R-7qtz{47_2YoX)Mluq6k_lLmy6vUkOe<{itg0YjB zWM=|1%Zv=mzECGAgao)jt5Bq0q)}uzdV{17Bx$G23KE5cvn;6gldb|b#;Su!HZ&6r ziYwMH9-=2hKI<18HY_SVprk!W_@HjyWP1yY;hK)J zI2y*tX_!6_`eZB}ghRv(9);jcsp0Q51k+VEnbbix%_{LJ_ZC2AuT7)jC>qAGZ5)Q! z(l&Ll+{?*~F5oGy8WN7(1tCm#%c~%p{34<kVR47g!CDs=CqWqB6G>w_3;i*h>F#d8K~_L5xfgBI|u$!1@@yqKlK`*Zwbq8txXbg8uiC;2CEu`Xgyl^V*SiH(4>Bs8()hZn6(~St-yciff+%$PawP!j$Av zkOJ_WaG@2+pYWRx@6CNLU;!n?r3&YvhCK>7tT6afkCdRbqoUw)RE;A|L)?KF^qxzv zb-&%k#m%SFQuVkXFnSv)-Z7za+wis}!WXv!<0GIE`HrCB$0{=A)T%cv!BfM|z-D&9 z@s8jQoCok84)Wkz_~O!XiF@pRkZ*4*ePWyFBOEnP5g5-+te*@0iBT?<(x60vF3vW5 z;#Pt~Q1AVmG?YU15N~!zDI$XlntxN03%T0IQ9LzM1Nd=&K#@)(# zEr?RVab^wKuah*D#zLp27d$L9jvp%u+@$D!!nzTCi@}Nng2wFHAVqJ;EO}^0?7fEu zn-WBbI6y}3l~D1wG(zx&;A+rZJT{>9N8gQ2PJbJpNCZGvDo7s-4&ci8@d0`W=R!7v zzZqssF?MtL0*Hb3#tH6QV)Qlea#W1%+VlP&LHol3n02sn1jjd9axI)F?*03rL|a%7 zBlhhh5Mtl|C&LH%{L$Ue3v4GX*nlPQry)byP>1_9a6wFw`Iy&@Ccq?xS9up)5@yD# zl4evj9YaHijunhOGFmx-4HVIDY|%o8_ELyB=R^U`I$ius<-tlQxHEY*2G}qN5c=!| z{h&KGS8&2OzuWGT)ZaQWJ_LI`C!r3K;8`yS$!a_#84K`$<6b_8B596iuw+|;bvjt| z7BL)roWc*u;6>31!tM}?gs}=ik&j8-8Ks3$-8>Zr=4vb9?PFj5@}(Gm?a`$cy*Uy) z^9f8zQ)42)8uYBr;UTy{DwE#ID~SQt5(iUtdr%(jz?E2P-oB8=)nj{kzF5vR7|d#X zi7o$J&PY7q2a0O?X zlLT^Q$UME3^yfIl}xE|~!&ckLZ^TT{wMOXiNQVz2TIo7m=+!*kw;hbejz{T`> zKL|eIZ_-#!P#}_V1^gD)3F5y!B)N%^nxwPde$yJD{^cR z13v?84LN)=szU;t*`&z|Q_kwieXt`71~|j!daf|A!fnWiNm|S6V0a&p#ty|Z zjzAb?^Wl61;^^9Z40cumU*(OtwdtUU&7wdQ)v?Pwh=0j9^+PLQp`1PV^{vXV3E=qkUSA!46|CE_+D z^pnZ9cM7s@fUD zSNaZSZf2EXgee;h-;7x_L3zMQ@>^b!(Fu(!vKD5E5J>PJ2VrZPQH<_5{SZZ_rW=h9 z43k8}{x9XkkdV&Q_bWvDBdGvK-^8ce4gR^QcQ{N6jX`P%e-6EnjROUY%S|0ZHXwn( zq=E$#GMz))#AmJRA{&oSXA=bLl`t$a0c87WYQH7wQCoI#r5+u%KTpobK~D}zet^cA zifYf1V^Q?+8XN?R1Mq3hcfA+^W|^`MGF`bDY~BZt6@uTDX?%JuR{pgOOIHZ!_4-wGCSLPDH&0;P3B7{-QUVeuEE+FRJ<&8Cd{DXp|Dv>G7r3P|wbT}+<% z6MTeXX;`cBvC782u z4(>7=X{IrCLlRF*fAB0Qo=2vpwUd%{cytfn3!AGN26BL*mBJNt5CpII;=P)|kB8iL zD-(?Gi|jTZiRn5k#o1(iWGa}@*^bHYirQl|KkfvO*)&%|yl=rhK z%itD%PB1<|NP1mNKs3rD&M#C*OcvAr3k4$}!<+ZDc$4Mz4dBg!gEWT|dTl=L1#|xL zOuu}sU;dz9{)qFu6##h<>=3E3%PUVRC_N^mh(lCoZ=OW6A-B8wqwrM<*=o)qn1cY@ zTjylRoT!$mF0VYxd?LB2W-vzBGlFfxIC*j1310C*g=5-IUW_VE8qUr&$T>?T zv64*rXN`mXXXLd}*i8_t8(J-dd~M3$Yp^#Qb{zsn&RRc$$+YeqRTAXfl)(nC+D0gZ5lxdzC9XZylQ&UO+9*wnEi~3694~XXEtB^8fwHW|QsAvgGMJomK z*rb#)GNjtUN5D;5;`&0HL(YVdOlPC4IBd?cTk}@bl^(gS;A$y$-W7@}*=h}|l#fky zIGK3Wm+SpU*dcC<)|c}7dCRHmf(<9GiI_=}my#kXwDbzkQZa z!6JmqBBdbmy>Mt9knygoPN&o1V)*7QeST%@qfx%hDFj}@#GRNLG8w`*I?ytfopszw zh!Ed^$SrQcA)3Vv-E)JLA<|w@XZ~y{UoiRm;nVE~5XoSlJTY6G5NS;Tzyt(Xb3`Me zR6D`lO-U9dH3T(o5w0>0*pDuWaKQLN9#NRM;Y>@2y5PAjLO@>iI*9xbcS54;>f1s@ zm)z#pH{=KOA)DmmPVB9?(yo+{pa)AB@anV11kIiJ<(aBZ5Y5mcF(slA;m6HK0b5hN z;UXQC#n|)F0iCJ@hG<;Yk`kkfzQ_5fxGtB!{_#yyXmyBz51M_ zkUui$6tyV#j1wd|iJaWn{xto`FI~Z${Lei^$&E$mS;uTRE%Svg)8-!Jc9JCDBO>%}) z3a51p0O4HRNNSIO04~|&Jq8Jtp}|~Oe*yG}5F|1gIxy0!s@+sI%7(EJ=yN+xW4LAv zBv)IC#3Z(ZvwyZ)ne!bgecpgs0oVhxNTZp*Dc%PjhGsh z0$y|S#BY*TLaF^*fQ^Xto-#4_p$@WPSvB~=h?cfY_KoO0V1dk%r4E3ZV~bUL|bedtp;-1snQIk8}t*TIdMaI>u_NaE-Rgm{7wH@!;VH+X;d3HvO~Wf4p@iegunI(|><2>>M5%x= zCP`^j5$<)wCR*M%7UIdoVgiqsCr4+HClZXb@*!c3Ia5)CU{>rDeYxBuI>ffq7%;_Q zHtyE5A+jtYov-ptIs1ajl>-)pqZ9xWy3bWs!9FV(mv;pj&|QlR1^}L8>xBhFMkJB{ z6PIK%UV!D{DT2jGAg@qb-WGoKKOW3z%5esswOhOlDNukDs9j=FF35Rt zJ!u0BgF&zpyt*#P?f@4{8xEE?9%uzCgZ(D?9f1Voxy$Rf76$C5bB_V#Ob8k?x+x@0 zmyPZW46xj$&*I7nu_=(rp2t5A{^vh)cX-v{hS!Eb#m6g07iPb$6U^5+$q*yKt-ewI=A;L0rN!KUbG?AuH?^mW@M+B9K2CAV+ zTg^Z1^1Ux~n!BrOEvCl1+>!_jHA(}S4%+BjY8yo1l$gf?!nlVTLPm>(i8dzTwJG4I zG`SBb_lN2x5GAU*2i6dc6H%mq;Bk&jd=&9N7@Fn|QSIm$bqNJvV~C<6=VxN0bVwv3 zrh)1cFOCHwC!*rO(o~c#`#HwiURouW)bL9smIzEHkruzWjczw+2X7*8Nfs^|ga-B! zw`s{s6973A0A$ES_=F+md0|1teyzZzOh%m*$^lgTe88E)rJk!ju`NqIfl!F|s*aPd^ z&R0`zOV2LzU=q0o;qa&T_8QhoPO>EPT@$kgAB4)Gq?er6;u--=CWhod+N~AeIa@7N zm?FS4O`IA+o?ZDxt7OOWSm+vC!ZLzV#VuZ|A-fXFH~R6%w6~=~Y{#F?JEjBWY5tp1i?f(7amh2Hg(pg0%bFmS|Kotpl=3 zBE!{Sdu?+%3I;#^zn#0~b$RUa(_aI3A+H+u>aDExR8!{mMoAUf2>mHaOj;iT)7A_8 zLY6oU45u&2z)J&Rz<-sss8*?FK2Eb@d{Vublm*ipBa*Uh!5DKZIH0bAUNBOK*YUQ7 zU@yj2Pl~*VjB#s%pR^1k7=NRk*v7K*Hl8Hf-q96IXlWuTU`Zq1v(|}Z&J6C%OF|my zmDW<^4fF_4s0G@MPf!A}hZ-1#cw~axDd1-qwMzUkQWL0z-g+2{yM)&p^M-)+m4_}A z0`HKOoU$((#7ykA9Uh&Y_8i%JiE$7g)sCho>H<3$=%<{?ekVXYX(Y;;!L69N3HE+t z$xPQ8Z)9{+ilK~3gC)Ztn*dzTvI+zP?rb+NjmCO7$ulH<_7j;sUTTg^YfQ1}{t0CW zl6eiRX;T1S=NY#g;sU@Z0f@(DiZsf_=pOeaB_w9V(~fuXii|E$jTl^}pR}ac1~JR! zRYM9lYfCl4sUts!D>y4qFC^&!Ll1pFC&0;&vxpKcXAPT@6V*TwnUqcoyv*DPw~F@2 z)?_DxoJ0c;!&BUj4?Gi(sm`v<1awGHnH?H|0LHLvni58WXpcp;2n3shsU)X&WrOHc zEBk}~+TIt|fnf)Sfl~@){sIY6!fSkh%Dy|RTgj7xuPM5!8J$_wY55t-JVexhN)tg& zL!##HIl#~(%_{EkLFI@LC0t=>w~_Y(n^*JhIafDX7PTRFE^tuGxP6d`W)n9Clh+iW z0w)wXswn!!SM1pk1vOW4a0*;HSj93QPr(84CNtd)hpw9MDBII|-E>kL?*!r0XfJT-97l(UMX z29x<3VnVZSr!r33eak{LaI`su>F`cr9Kk_BfzL=>BQv!_T0#^{(_P(hCO5>Tk$(gS zOXU)=0xb7U*VAK$%s{i^uYkfep9y^z>uTr=T71R}|o#PNheM@j^1>3Uo_drwwE8B3cb6@>XGGkd0BL9 z3@00R@z=UjR@Yr}Y5c*trZa)?05S!2e8Xcj^H_h;JKiaUq1rnGAdb^N4R1Zy6Cz9rj=12=_) zFNQf=Lr1dofbkB?=1o1yroe^#1+b>s6qPCRI30a;d~!j_pMo?vyT2WllPD}o;$p#c zam#NGf3Z<}e|+^0QHZ~B!FrV(r_gOTlV6eaRvaveOw4OR_hyU`KG)d@;ahzI4p;zq zgW?!*mw4nSXhXYvuOT53IV3wVHqkFbSY6v&T&&$Kp6>jLq?yAit4Q_c*tO-Ld3ws9 zw*u$teE@1t?%a07TtB|ia+7SI)^0Gfyyxeeb4ap3XpKs8FtwTg?8=JcKE%`wWxuVcvD{=9{=#u;SWa_$0zSDzCZct80ihe7ZimJG6J%n0ePy+9c(=; zwvu3+kIBXQs;sWrYhY4l|7Jt>vxgFg|NIgc)DaxJ?@i02* z&9Z9~AM8Z^^ShnFc6>h6N<=ljt;|*au@`J%);koiJP1a0eP$+R)Ra{(*qXvKsvL9v zPAA|I4vGiR?LxH&od+))$&++B5-7((my%K1O;%ik!!Z-mPr-vOuSYXcQFOb1PX^$< z-GBTC68T+F;4Rq22Jg!Erg&Ewb99^I2?T%)IZuP18p@4fx0be$w-?Pk4c-}q&ha3g z=wH~98iV6%_W)4iqT9hxY04Tc7p;czk_%peaBamh7R9Ip*1kgGy z2(Nr%sT5=8@EC~pVC9k52*m%=2GXu)#Wjw=&Qpn7%=yPS zT^gJT;T1cjQ((s84~ETVBLTsvZ1s`aW!Faays=TJj9Azv@QqYYr>>1@pN<VZvW*ORP7sss=lw174~A-T=Gcw=3!&5#kHCD+@*^HwYvKcK5vA?y6ZjIZ;Q^ z1(hVfq&4S6-_GZ)1(nBZ&cF*e<=QEeW%Y~=6xcF^alpyzm$*6jhb>L#3pWzPG;A9q zns1~WU{fK&el!JX>iFpAbxm<24_LnCwm3D0RM#`Bm<07sDuo=N2RX2IBbt(o4zQ1Q zRjlfyRm0h{|dLvhT%DyODu?gP7`cHzib z-2DV5&}rIA>^gxkq7(ChL|$CW{icZDEA@2yC?=28v5RTOjBc^YkJh9u;Lcopmh5hQ zB^6AtAfzd$s98?cnNxkIh;pr)Y$Vp!-s;#b)!o`5Ve%-06#Gv06p>i;J>f9CgY=U8 zRMq)Y515-UL4O;HDZ~h9IflFCGod(;?hpWD8iXQ!!Xw>7IuGs@(5M)9w4s_D@Fduq zHVqt24dYLHa4hChnoiHWyA*iLk{eN9Yo(>JwFY8u6D}+%F;tri$Fa#+u?K~f#&-l)Ubec2rCUNR zlk_fhEXBim(UNdeN{in2%312$)-mIU)mlG9VpjytxM z!H4>|f9S!2SZ;N@oRW4(>O&-FWIoCUejuRiD^j7c`u0^FbLAQmUnDmND2z;$;7UyY`;hxxQ4(0Bj})= zmW_F8=?n3RY5B?L2_f?6bFlt#FSxMti?pJm0z2OhpQ$z!=^}8yRK)8XH5lY6M{#R? zWH)WdiCn|^;a;t0IT`TLxOpSkjnIxWr1Y_~iQNXF)p#K2lyzguPpHMCZGfavTf&a3 z3FPFSG@I5`99`QCx{dBo136C0|;Z4*c!B2-tdXb))pJu*6?kw?Pop&h3iQ^Fgpuh>K8EYpl~vi^VuIjVuArnD5isw7UYW`Q zK0*chM_x^q%hLfdrjdh>4^vw!LB0Zzm)e;% zmh`+TZF~i8f>r?6;ksJnW{H(p8Wj2-&aQ;O<1GPRpO_VP8*W`!kRP~aI&jly;1L;F zXHQ|3*%8&7JOeHzNai4E5F@M$mPzyI?+)6zYl5DAp$n*2IDxXw{X{U)l+%Rz@&v46bhqEiM6J8`Hmt{5a@y=@>OMr&e+7*Xb9?s_o zi)Z8N@dx8xt^aMhqTqm4kFrqPc0KH5{7F!oc`+76J&b*#@FKKIc>TaWpPXdi0|oZi z^#BX}1c9g^1Gjk4n={cy!+Ua}x(5Z3dGerEIfX0e@A|vm{sznBJAW9IMs-cj3@vb4 zvXY~H9bjECTYm+3BjuQjv}hOE;H1^oo~nRm?RXv?y{lyp$79FS7H~uSyNDegr$7&4wy2SwfJmM`j2^H8s#5N^lQfGdh#ik)q*V-rxrB?rYDeK0iBDcoZ2>*_+v~?reM!BluF)GB+F|r znM{I%2#XUh&!dI2WO*duj1QNk*Mh2Lo^3wR9 zFtJ6(>%W=Gh6BTLariU3v>f*81V7ahi#jhPV`p9mZ?ft=xqw0iESsu1qU+$7H?KJg zDVvkQnGum2Yko+t>jD}J;tj;Yl|sysV{v7hcP*1-i=?Cq-R0Cv+55a5CDkF{ZKRRG zKDojQBnpfQ%NG~fczotup)C|h0cB7uCnekU$kAuOT{`tkARatvrwPGF=&BaxutS!} z6!sXc5Mj2Y6mbVLNUbx3jM$@jRhX*uDCkda!4bFmj@Zwk4ICH<{K zAKop!g85|7x+7#XM+QxtCDqPO3uI#^BBigD_ZsP6!;w8capj1_n#!M}T^tT{PWCI5 z;c3BF&*Mws{0MpcLh-q^08z;qk7VY2Vc%xB|L9&*l(C~Bge}oYDUxopkFGVr;WT#6 z1k}%gw~;t$UooPA0Eht1(sb`BRq2h>Lz6brFydgxH< z5Wk-`Y+<}gMd;P}$RypcxluRY`; zSd{&=XhRm7(puS-;YoWahxW;hTcJlG{L=%s$3VV7fwL?>K?g8xX9anWjNB(PM2{(_ z!9wy*;Ul8Frkrx;Uv{hlD?tHxpfj8+8)R*Ak5C~zyw9F65v#zBxRw~y%Qf|Sqg8!7 znboHh5f)KBb_6V^lNmz&BTy_Jmsf;TP2tYDmC)#Yg2NlkgAZjsUdSK{h<8j&3-|^tMrKB+@Cl;c%@DvT*5zLdXVsuV}J^- zh!)Vl&;p5V9xo=ztSKYmg4piEz2a4jh6ym_{(c;H7$zR9}?p2tRop{cWMghSr2!-q$w z$|9T|q1pR)TSKqN|dF5|xGSHVKaEX*O~X09<_8f%V}bwdd+cMnml9QnPM>7>7L>4Py*|q9{2C8Vw)0Rvx`nzd`yZ^*-UpcWy1$(#rUFVe$NsI0x#rxRTe0suZDsFX0JQ+D{$XUoliMyXk&qH-S zc`p-0NPRCsje3z-;}PwOt-)AWuX~R+a4)Lxh4@nM_bR{kD1iF%Bt~~EQ`M%WDec)~ zxBL!Q2e86>eR2dIPvtke4830Oye$859PmV2;-er5Z>4oPn25ajUw{`@JF#{@_;~2- z^JjltdUX{%h_7!qs$#v-q^u1ICG6Jv_>6!QJ3;X|fvf0;({Z$0Z3%->(mqhQ@f&AG z7scAd{6dwzD1bo!a!Qmd(6%r*eZ?G>KbjU6Y!_PrCppuC6lFggAbbuZTA{4KHXI4_ zf^CF-Z9QM8le|WleV53ME?Y2+O6ZWjeBb`W5~wuAJx%q!F3Zx!OJnOcA0z0@iuxwM zYL?3B+PZzx#i2@9Wp$K|ZX!y7h(K(jrL&?fyijv=cV7gQzcqMxfTHZ6=e!~l4rhG; zpKJuiPbh*VO2D;uVeR6uI?zWFjplOM+h~InxA1LMQtY#(c!OX+wZ^M>( z+`$e#5kCU3Lb&0mp&+VrFhqEO0r69@Wp^CW5;e;f9x(TD4YA-&MznOl2^_s9eu^Zv z-slv1?S2bbG4mxfD$Xhmn21$@ZwS4{U`z{1=7mI1A4xNWaVhu#;Xqq^MIJRvC}=xf zUM)-M;ymgo9#yuil16gsB%22S&kgs^Y<&?k-7a*m5T%yw`)r~h)IUh3a?O@MCYIL7jw@QBwzT@9R+tt}( zA^z}jGZlzN7qaQH4V*mF=qvL4fK?H!8yE4VH7$IN;!T(8;Y)XQ{hn@#jlV*ExD{;c_w8USq??RphJQZXgE&^S1933x|{IuMp2ct_~7A zkC)jb*AWhaD+&rj84tfn3o^E-Ye9j>N7rV2Efx%*X$Z%*HqF$*S46XcL7e1;iN#(U zE@!4&lx%v@_@GeWQ)Cd#l` zc_XI8b#M-TLAhI0o`rRn!LbU*A(P$d2tRONSLM1)|K@o_@9ap>$%>(9o$dGAoM=D)ZMFxllWjc4)-KK~iMvd?m*B z3?9LnH1sB`ZY38jEnwZ0(*lz|Ryqqx}xoNIe_w=u{Zq<>nS zdxUs~e4w_q3Bzr=@@{LSSLx(4Q*an}1u7J&w9eOZdx^@p?9lBsuEMXYyvQc` z->m5)2sN=+)*?-bAW}AAlqKaHi0WY4UY+Xm8L&rrPg-`5t$@`%5{kPOg$5rruI=fl zToqVflP!^ezxa_Zgiwr3<(aks%D}nan!3)e2`asxUW{X*s$H04eB^R=6MxL1)s4D{$audAyHLGg*MEK?HNLy=wFVUgGQXZbJHMs?aQhLiFY~cM@aEQ` z_cQXs!gP06M4u2)?C!Saz|@WO3&SrDDJg87mEUKTf`j*d;TK-naa&L}*xG$!PuGe? z{zq*WU4;JFAKNb?x=xWRW=t#O*IAiw>*W%RQ>-9{nib5jhIB_spddQ^)-{%w2VsOb zJh=5w(1S|${}i`bv&C~_aD-IgM{o&yPXm2QF*3b2SgFA-1jNTd@#MZ?cHoJo`w9KggMo`rZ! z?KZ34&!$|56Wx9XBhYAhd`OauR%WASMqxxMDZVpA`5QB){ zNC_)s(6VoZ0-u!-ii?E+u&{&fLxN$qf0%)%_`8h zJM+8%xEPo!g+?t}5(cY{q*q@g3v#HzONz=q;r)|8dF7H z=&D$sWwWN_kXU(H#1x^M;-;m~1($kGW_ZCKBQ8rV1Z{*mlc3mosa4c9z;==1Vf4@rMQLC?Nm)LL}-W-5fcQ?W#G61GpDd7 znds2{R-Zxt8A1}d5|-E|?<^iLr8dL~ZgMiI##b7EZm@KY*cB9Y?#1>tVfn*qJj;s` zazoS|Cye(=_B6@gBN7H;C>c~}O+Xt4voN&36a?|XM7^zzGFPfYv7u|zoLrHte|-a% zh_iyo79HWY?KQC6w%4uQBYXsp?)Z(%3@zo2h&hNhb%&I3$o<^hn0s0)^VeB6(F_&{ ziGvk4S62v4SY8pZ08t@6KYhAg2MA(zFs)2&st+iJ%4`jgO@gu-8?uYl=={haT0&H1 zP4EzwCi{Q@Ds@vW(>P9SiahCb1UdKZbQTyt^Dp?%C)MnT#-v z44q05SuataN?r}+N&CR3iHD2fkI5%Sz}1Ow)}p(%;Kp9qXts4Tde}box|2>mbvFi2 zgYP(dFs@_rhvHC-AZ;i(U2vVlOdFeFq1#67!YVk*r4<%h!Wy5@HcUc;y(8;_$9aXvNZ()uEo+Wn4GP%cs{wxKel);Hv1oqB8S_;_GUV3}wN(69SdtG7&(;hr1Btue1 zrul55z)-xhDFk@f5$JAh`?Bu9plgB@>Y~PaS4i>o(U4^9p^~K!ftmDl{*HujCmOx# zb|L^oZJLf<3E#g0ld%FN>Bbkyd6hcBJD=g8wBd;$qFGU!Cb(SF)g{73%22FWgwHrH zryy$1FeL6&Lj#2q8IL5;0*r2u`4~G<2hmL9=hBYF1QD#a5>AK7K-{cCgXWqBA;=m; zwnN}L#3ZtpV@WPZST(Bxn^Yzn-v^Qzz1szKtkIn#pckUEacf8`T4T(ae(GSH-9qHS znnhAl5EiD1k|l~UI3alxcRC%?#oU?T-b^OJq@2OXgpz0Sh%_hAO*u7ikGQ7^XnU(S zy=XP_A{d(wW>QX()k#gnZ?pH@F*$D8X;EuF;Lxg9rch_smNz#FK2Z{sHKVP_#d^N* zQ6S@ZqbCL3OZU*}(IV3M!M!z_%&^1l4R(>5J)tl1k(vr(V_YD!DsS$CDzD#rQS6qx z{Vfsc?(+9}R~uIJxH=Q0s#d&2{8W47y+>;#us{SJi_M7tLU)R$SLSG$gbp#ZJRU8z2G7C8^xo8>fq(SE*D2_2 z@961v4|dMVl4wPh~PyOWnEcu(Fz1dy5_W^b>fW?z+S!m>5mhJ9dru}^3l zMZy6vlXOnNe!12!)h^|>_nhMro zdsL)GQ#X-UOqX3pV3SQKB1!y43CfskTLPC4d(RMcSA&UeC|3Zp6HAlf+DL=QN&kUEk}fwC#a_WqKmkqKtw9y2NeGEN`uvzJ#l76yN%6YO#y0FnyCXh& zUp8#pkSqS#!2<_^ltdck+Aby%ZDf<0WdRn-AT)9Dw;|4$fF65JH>I2`%E1L1WSU*m z!F+_|r9F|8XIExemW^Epwv_{uXjg>dbBe)+87s{I68;XvPMM9tnvyl$9U%oz(C7hy zBkR~|2*L@-=wL@&mXcFkSXDF%&=O@GwF(@g=_oryi=83C44V~71<$0d+of1GK@Axp zmImIs4H=>%K{@zu(m-bvs;4ZhZzj<(?TyhT!{;t9#^oJ&B}#h)#tH33TQ5)E$W;Zv zGUKg;R#v4~3{tEHpmvtGUUPKdvxXdICPOHr)F$Ta{B>rkd(Fmx-QH%D(Qr0lU?a?A88+pB^@4)&NxOuyMo8hLrCu5` zXvtu;p zR#B+qLXdLcnY=7W0D-hAZF?%6i5YjorFi^0hPI^-35BXLA`sN&6%lx)YT^h|eZ`xj zxiHLqtD0iH7xb<)d>2{9%YVSCAC^EVB~2CB98huxjQK+IGa7n^f1#DThEP8h!O3;Z&nt2`V(o*soLQp8q%CroSkor0kT^ntaMc^uCqrU^XgR~bqzZSs+I*4`+ z?ptqz)s=GrN*J3W;}otMj7~dpp5BmWGD+E5B{*H_`Z!NA5vTfd)E0eeQ1?*9aEjGQ zVY9=3N{B~1xoT6Q^(r?X6ybAcbzo6`Fn6)f>3Fq=?2G@=lP)Cnng*;cqIB_bJDMsl zsLajIr;mCR9LPP=ji6Vw5iOu?-&8#7x!VM)O*^rp8M){Y5H$JbLBP&Q#o8^kd^vie z1zjvarmxvL1#dlow%awQPhbtFSwczL(gc`WJbEvPr1w7H^}vh-C>iP5B9>gBCve+) z&jdm7x4I_HaNe z@mLwN>wJq6a2AdKCM(V<@dNwNEp|N4D3K z7~m<+ly;Tu;e=kP0Q%S8(Mzrvqsx z;N{6(Fjv}sPYFD;>Uzz!KmsgcWD_c(2bd={8Y1f`*xdHIs^7J8{5nfZq+;(u7FIzNErU=U%cvT|^}slIg}^*l*{H=P z(!|@y3L4l%_Qtl!0$KYL;_Br`6Unt`3&~))oW=2{zBG96nO-Qa8ZBPWElPV6xHT(z zDh1mJS*;xDX_xH)jK$) z_g0=@jc8mR7xmuI0ef@u^5{%aOt%~Sb5rlIR*=q&N3BxH{(E!JeAH^nt<~D#s?7BJ z%9y{I$kiA0-s7+DL+Bdsu^%QpQFP1axFsBo>-v+L9L# zs7Nrqo0cpCG~>`fsLvSiqpaxNysl@a?*8GM z4LhbzVeVdO$13Iry(yzKAEz*id+=tF)izV#Vt?c9pZ?eX_WwTnfBx_PFZ!Q;hktMX z^gsVE8^8N+zx&lSeD;TD=9@9-xM&my&vtkJVdvTIvp)v^Qr0)Y52YEJN$~BBnM}%m z{`WnuhBSKz(&#W= z^jgiGnPzh{BGa67rP(zN!sw#i;Km|Op6XrruF7#s7ph?=X2>YufMO#znLP+oL`ldh^qi7fr*QLGe}Lp8Eot;K)M|?>GOxjYhW*m z1#fVjn)LaTClaH2W1n}ZYVT0e#DL(u?r?;cGz@tYs5Iw_COFM%`IVT?T{d}79>MWK zHv zqACC7?Bv)@6Tdnv6U?vfxl^5WLRx}9#ET6&wWbXr9=7gWZ~;F4T0LIWP1fY2z`nKn zp|R~#y+N7-WAj2Zaj&uKOGw}10(j`TcMh{P>2q2x*HauPh!?LR=^FgD;~ABcNj9ww zZK;msiH^l=Zkl%gcC!s);6^~CTFcJB#PNZvmiFCuIoe@7=y?y74=1d=k#+n*E#f#{ z$hA0P5^h{Coe3Q4+0;~e5=7IRn#G2PSVP>vW^T*_%Ob;OMZsBWGm6|tE7#*ZxVv;Zp zSyOs!j_$^7HgH}^FQK!>!T^hbUO!^#ih+_*$uH7rCp(uyJNq?EX zMy=S{vm}AiY8G^x%}pc?E!d5!tkP77jRV{}EY))DBztkv#Jz{b2JWR;=!`H5x1**r z%BJwcItasFc+d;u?MJ3C5994H4!u>JdaKA$T_e+JN@jeccpFvN2|f&Ci@6sv)nVE_ z??(r{{$I||&j*9~`FSUPdOnz+N9P9z^Yinlzqj*GgZ}Q$KMkJ7c-!6BwK z$9Fr;_lXx=Y~Z`+GQXR^`+00W#>qzBdLz%b5g%N7iIedBJOr8C-yQUK2b-Iwzc)Cj zw^Kadj+kwa@G#zP;$Bp5Q_*B2jI`S3X0g2;3*`~iiF8KIT!H=j5isyWk zhW%{kZ-+a79-N=wJq?qO_Q8cbxxg5P=jY??=={8czwtqs+^1o*a}Y=8=fmCp$6p5h zZ0G85=X>nV_8d>W3QuF~A6Jd~=4jC0*&ZBlOL3UoQ3uiPu)n)E*p9>GBz@SRxMIEV z{QUg9e|}z{pPvoF#F+~2E|T}D+{}s%5~;HlCZ-to@OMKUMZ@#+B22_Pq3-oh28-mw zBMoeYThsvlw(A2@;ocw(9H+pYNzo#e>NHo9Asm&rFw54F8EUrin;9&UBHpiYbg5w` zC3Irra@1tkVWO+i4+c-8gEWE}==}Rvzq~n`AD_HCnt%7x5A&0^?_Rxm_2;AckB2Y* zH2>w7U*cXICL36Z?w3~RCVtTA-jm(dipLvrYO3@q3SWgun1xB0*I^RYWtfCBd~5J6 zYw+R<|10o6{49$w>GltI{+#XnZLrn9!Fuf8z$jbVVu07U+3pfL!8a0-7rp0@#y#be*Z&O1&7Mf2`B!rad9!N%BH-y zpj#+8e0y?sarW-?)$tD(5IObUC*K{u_|w_z!?PbRj?P{jzCG%lB;UO{K0N*Ri{qc( ze0OxpI^yPmO{{7YeSYQo*wn?k{2g$-W(mj>m4T>FD|}&ee&W@7xIW3ev`bo zc>U`5sQvUTdC~5EsdoXu`*!!X&goI_J~=vmd2x35=IG+^?BctlA6^~zO!~Yn2{*~Z z22z!9(7>LsR1Xaa0Xi4-n7I5Dm~H`}p|mEp-=W5;aVU*3YV&2@C zc~+VEtF7C4UKd-F z%c98U*GND(ziY1MbvdtRqnkObx90cd4F4*0ct3~R%N(93@%ga3u}J>)r;~R_EolCb zoF4sf^vhcrw#=Qxu~P-v?s+#lNc(^3o)?3s=iRs~IO)9Gzs_%G_k*WhA1^1e+}-nj zm(XSRe9-lm&o4Y!3>L}8DF$_T`tIoT3~L%bnLkPAPttV$-{=25oo~)JH|Lw_{QUeW z{^83u{-yI|zBAuR=iPMPo%iPZ^KZYMfBS7Z$A9xQP3QP;{`~oK{4br;pXYP@H$Oke zh1Q>+pFe;wnV+Bk1^>|Y9RKJGzW?uGvT^p~(RYW(KlD~u>h52D{{$HQyxX-5wSjF{ zR^1cNL{O04L`~A|JUt(F6MdU>&xf6--8fF%T?5-RUGqlP_^bBHtvPzTI6h3LtT{o6 zi5JPnyI1dCAGNo*$(xDM-j4k3StLIlzdSlUdvS7lbYaih$7I8M{J93(2W$~LGVfPr zRyM*8Q9Yf!n9iEMOkign7O)iJE2+v7Nt!kZUmzu=)h6goy$ofEn45WzJgWVjwAX;u zq@B|Aci!HCa*D$3r2;B@3PNQEn3j$Xo`C3$4$|}U;r#r(rVG5CsU!V0ak;`%_jNvB z>cow{HMqnV$y$1fhHQVOyRkRX*D_Ixme9#-`U@g@iPhKz=Wt(cQi}V42n-T?9deTg1yl%)Ap>?`krtYty$1F`62SB(D*Oo~*Yx{3 zFQ_JuCIxe@emO0iJN(s*8Xa1ZJRnyU=j-Y{*@uT`GBhzxWtO;W^=4<)%nY;|Ok z0y0vFT~ZM_oAf#O=hx+(sa|BYiDJma+A=dMxM>ut%mGPxzv%A{25H|UUq$$u6yP19 zA@GjES8^0o!g?TlCOAx!KL624&sW9~nfPG0w_OZ33G#Te=t3xeIhfB$OQJO|Us^{ds3^;;0A)J? z6^@g3-So+Bys=1rNLfqg-6ww{hc2$^LnLaEwNHPFvfl2rF z&9`YI-21-S-j2(@+0F-P-8X}z;_pv(lYBd!Mor)B>l5fRX`1;}v~;1`8MCN%JzX$e>uAyTs@N8~I*#DpGc*1h0i5yr{J4}{ir*`0XVTcG(I zYfsmRtMA6)o&~qayE-&tm_W_%0|2Ep21BnxxBw<+oPDeJq$lMH!v(k;$gLPo)~q0| z)JN9us2ID|Loyq_w3gTIs2Js_CGV!cc;metb2yjG?d z(@N2MD-Cq(!Xni{Bvq~T)HlJ*Dun+hE^ z=^p>o_}b|%sR~YK6CU9!;7aq)n@9mPGZN#0;RZf$~jC0;QRF z8@T^=nopo*02$?vTM(lvED`vWtQ&AtES+Q8Rc^B>2`fp+DY{VV(Nw1`U?Iwk_9^ZA16>V<3$M?<893RxxeE#EKU zRBY5YNim4i=VTfq@LYi0fwEBHOhCBZ9pH8W-|pMIxL!?UiE}3O4Y)oBr8HrpUl4Yf z99!A6q_rH`SVv<`C3p^G+}t-wGl&z(f`LOosWC)ZN2|WQZQ;@CbZ8LXLN5&}-iM#O z#2Dtn_9v?=0C)nObVEr4kFPtpxyl*D8d3=DopBmEkUgC{sp{otO z@6yD!)50O7J%LScxn+B3-Rv5Ak*s0evS1EUV4^y*#&PpG&@_XJ_c-kXf8h;F*hw?2 z(spMZQk%(D7|Sgr)?7!YrwHB3^@2+jxr8-Vn+>Jhs)*+{-I*X13waD#-@>=7p>-o$!_WQ4r z?~?D6mjlN$g0Y|$SjE1wX6s9CR7;`=pu(j8E_t22eWY=JNa>SZQnih!o}vY%tt|Id zS%!6U(|zxJHO&xf6F}vjDqH6mW%n*lHb$xYX&bOa@S1mVGD=7DdH4KoyX!U8?(>B= z02nAN5e7h6na<%Y51Q_;5nWarCACIW-FzNZLf>`Iznh;AyK$271F9k4#bGoRBR zN*vA%H`NEtV{30vkCMfuU7Xr% zHL#sV)Z0NgXNqU31{R`HNf1>Ri4hIUzTske%4kaZgN`l*vnSnH+8^N6C~KfFch4>5 z0Jx4!hYWR#rrz9qg6$dInDM`5RnCuyl=B~@t^zmIq|afw_pqVuut7o65cj>@A`C`a z?e+c*tTDI1vJ_Y*z+R)qQy<4GeHg*Loa*j}$pt5tC_M%M75&1FpfINnk%JTni{N z!YC~`fn3?%qU~1+r2yWtuC3BVSsTSY+3FTBZE~VbwByva4iimWD5E z(ie*F3=4C$qNFGWNifdGh|mS|cDA*nARS$~5q%%;+Y*5x4#H%TK5VSGMnX%BmFR_U z5qFlN>-d`X!Ggv&O&`RJw-xcK_XHeGRkq_`;b~D?Kb2F{>;5Gw%AEsi$sT{z&65qC z633uLvGXCGMF&0jtHuXAQUCmIXRr+oR-SmqmOYA#xDzHDURaG@I7JMTa%{pxo95G> z*hC_|(ZWgXh8~~=(@ty1oyOEn3oOCF5Sz&cCt*nDCL7l9+FpUpL6oN^*#K3=I!#SU z1$%89LMiS=zfk<0ZxDYcv};4|-x_MS)9H|-7x~~)@KNU+)qxDcZ(^N?lmszWJ1(+~ zH`%yzUi_ALYvPRX?AbTppwl`vV2a|z+K1y}FCeJ1HUq)w_>spZkS zX{~)q!H63#Ta#Zw?fDqG_X%equb!vE*<-FSPC9(=?3;CqX1So`Q){|_!AHKazr2=l;?K|l%5@Y!fIxnd9%Jd% zFYX{>FOU2x3URZa3N#RsG(;Lh-moH*Z8gFYy(f9U_0%%uYXHlnM^USAa+*BZP0p5E zSb36~4npW}@IspOV|1Fd8WK^@LF*w=H}S^)vC{-WD1!ae$L$}H^5qqhTZ1jdKnAkUOoI&uqW5Nmm3`SG|V3D1ydP(Zf>D~{bS#+ALZOzr>qSWy6 z!#LT%=EW`DL5Eczo14*CMclM^NyA$m$I0;$f`tnOGAK4Z(CCwy=^ew^=h#8T6(Q-I zjX-PiF(Kux>Q~7;oN#61Zh~TS6Jksek&wd%@lXkyd)Bn^rmr?h17*K+qM&irL&0NT zM@5pyNxtN$w7D78>65*9kzb)jHu5LUwz!SauA)0Rq0;bi{3$fwd=KUOT> z(S>_rFT8)Xcl$9=gPz6BP4`_P?K+B+jak$r%dg_N=N`3dl3ehBtBxaADlu`~t4Mux zaJro~y$G|0Du`4dRY$Z$^b2bM7X=K!f3vw6ou*A3?~luejblDEo11TZ%X;8NQc<-~ z;d~CP=OID>^s#Ky#^UY<67*v@-N`dG#}3Fpqyis%6X|z&*m$Eq*zKtja>fO7^jQ$z-$)w;SX!c9bs!V=1T@NrIeS zkWiN7z}VLSK7&`$MOt~HSsuDfmKA0eA22W*Zl#t3oyTCW^0v?`$?1sm0u5k&;Q8;B zS3w0yEBSavCaL43UP1uYgKZdjRA_FYv*<;+0wifF0eIVKAt0Ii+RpjBU35N=PE%NM z+(bD5rB(P~x2JKQ7jXod8Dxg?(%#lS0bb&jF|s|Hyh~HuhFja&c01$oHpmMondkG+ z<~k1JZDcyu4K$SHI6Y1b&|e#*6iQ8c8&yP2nkQ-cuL_%nHgw%^1?&Vtp2A|j2$MaU z-mB+(=8v13ubzMXRKTw-;B~oFe`97>m{_NgG8yjUqNEHQ5VN9+8EWFA?$x3`nLxpV8=W#V3d9Zt`oo zo4iVQlXvNpz5S-TCu^^}R(id-{WB_(H=>Easd9G|#&4B0`}^_3#;fh^ z%8_OFeXZ4UCBG=Ul&nu{9o-?NS(4k`ufIRu40nd_gEQPEhr2`0>~6-h<6Bj?`xRex zRjaD{k#9Ma^_7)vz&4!NK_JAotN@7>M}i|qiD4iL93hT22olE;q(F%i*p3WEN(4oa z>;w*k;M{Z1ty}%|y8HF(eoYpMo?&;@{is`2=bZbif1L|e?@ZV&pZu-^{F{#`xPys+ zqG1>a`1DQ(E|rKQ7T-L9m!Jj~zFl_>w0G*A4j7O}B%S-t5Ed&Y`@`Qw}S z^y+_kok46z6Z^)D(CewRrm68MXR@-J(J5e!)xpE867Ra2jonxRcAci zQ2ao@KWjFPA=GDKdZu5ONGt#I#FwMqH%(!aZ@iXJ#p1~~>sGIqz<~uvW?4`0^6`%O#XAa=)+x$!A>({Suy^^e>;`$faz-Iu~)kd?TB*T)0?eEO8?yGqV=a)x@ts9XnUd-LL3}wWJ>0{u9xs zx8eHo9Vy0uiNl8UUdYZv=%P-Zyb#7vIZBn5e=58kkuW?TG5?tK`gAo&cmab* zQonOsv;<7Jya)8V!JhED@u4IY{c%fP7$U@#taKqwsvHPxZXV(~w8F)3Rj03PF;oJ= zmHxOjD^z>~mhA_xEwBy+_$jsQ1VoBAg}Q}+zZmO9&*~fKF(w6k)f4xZpuX+^3p8keNw2x8=>*bFGugi?|=BA57kN32x&FttIuj# zCHaCnkBr~RQWdUzS|&%4BqAZuPy)T*&BO;MoAaUAf$5!6Pv;F0w(;{bc*G~{z?Tau zN>-D6y=k~jb2n{64X2sfu3Lp$bQFXS-O+duJ7HdWeD~S)XJ9!`AlB2*;U0tb1|ogR z=6>_$%`q9@>CQj-@WV;T*slyHV}}zao!H}R@cQ0MWqg!y?LD^RbJ>$ z;G8siZ%AwX{>>Ov+j>-wp?egc;ygn+()i_D5@Vc8WgIVd|iM{y*D!qA@ zjDM#;!BVZO9DjN6|JUIyvX0vwgaW$ow14x<*ZTOj({Sp$9ethUv7>Uei^Uhac$Ob& z0`ut2*wCEIQ*1rU52xnSZ&Sh@8(|Ox^Rwt?3@IH_^NO!7CmBAB_|{8-aux9_Uj;ND z-SnPq;bZgocK5 zT{}nltyDt8o#VX9X1Md^yiR2(JB!9aOibAeVwcg4WVGK0doyM8O?ZoFO6}LucHpTD zEO+9f@T4wA26gWZKRT6nI5Z7C8_IM$)Uiohb-#voP*tDOt!L^5hY-b@@?}OdldK$A zvZM+S-S0q&no%~4l#({bxMI8ZT54&}JL{E3?y%3TjQRuxC)=-}vqS=2PFE%jMuRxx#PB<#MUo zwivqtiWI2tb?s0dMccOH7kCtjIFhTMU2z1aZgc}5_I+^T$NWi>`w%8s^1Tr9=Q8`K zPGMeT*ZQF-DD|Yn_V(XmSUbG7$r!zb7G2q4@5vmQiFZ@0uU&~`lUKGFdtVkg40-~V z{DJOJux}heF$lZcSh>2eU`KsXL8E*S9|j@(e0s)2tO*`nQnJLPt235n?8-qm2-({~ zH#lamLiV6;aQu2dh~jQ2qJ9_@!vQwL*p+uZ?zlZSWS@0=!WUmAqpy&pA zw>!t&XAgLndt4l|S9{!dx&1mUm-3j00>8?!&?P=ALeV>6Zw@?bAs&vKtVEV2hd z9K#;*>#pMoON3pSk&+s{>#{Emxc|syuRf9gAJgDH9@;^~_I~NF+aeSZ95wv#I{wd2 z)%O5az}biYyc)ssBM$ewulED*XdwHhuO@5Ig)@q4<6Iepo_Sey-S}`|LA~Y`mi!ws zcA{zrDtsm{E=Z2;NAl`4Q)%LL6bkvSNf4eSZPIPsg%luo52$WH!q4qlI#GnOx(9%P z599*Q#C$MBPOW{xgYwGq5ag4=6=S28x_*8=AL~XsxxEksD9Kpknp>%FRv?Q7GQv&7oWKa z8PtoVWLHNV?~A_h9pT%qS>$y)@PZJM`@;XA@K?$>Ey7Fq^)T?fL4O;w>Vt>u1^y%4 zvC=A*ie>8e(4G(s$m$wXc7hHULJh0Y-@X z4&GK@DOZZ+q;;yRDo>6&NIQxOa`X!_M>QU&IcAVfyMS4V3LFcx=(0;<&FLoxG?lN!{L%Owu*JBJ;jk% z^;L?M)^J1WyvWmz$620SS3eATE;^{MG>YY1}bW?Sj1iYi4VYA}8p{-z#-<=)Az;(V^T>E0&wZiXM66a!sAbP;~GrE){FZ z(ct~1>M>3#CjP+=Rg0BkmAV@XG7Vp;7c0gH#IAo*cpQXB`b-{PZ3GQBx?aZ+m+A$Pm9XO0{7J$|x-Pd;F=hTvF)9WQuXc(NnIclfQ(9axQWhm}Qd z3lw{fQH9=E?LT4l{*$d|TbQ~0;i2e>9Y!74Vr)N|KkTpva1iXy{sAlR?Hs_;5dF}N z1Z!O~9>7W#$-qiuv%{{IN~Kb#1A_>UpSoc%@SPoYwIlz? zp<=r{0uj9zggY$a@gS7%ys^?Ny2gThqApL^_6?n0Uap*hRrCj8KZxYY9$h~Og_9KR z1YvLB@jUjez~eZifA>}1b6N4$GqnfUR#+$$++A`Mtx~C^cZqp7wYgTS@zh2+4${<8 zTTldlg&qu-)`j~6-;M`z0H`E!T>7qZmC#qH4l>v4mLlN^NT&`>(oUEckiLNnNcEu8 zfzzZr0k<*j+vg$g;k}X!2AonH_;(@!+4JSOI~<4|R!T-5H4s!0=B1-=x|6Ox5dD*U za6&sm@^sx9SbNdqu`mxUk}t>5?vl2_>YM4amp(kmMMVW7VUOKk9w44D`MznN3ec(! z^j-I9c!THqN3@eZHuLfe`XYpP>qd6!M`GXvsYBpay-{!An3FO*HSTTmcJbU;gxpKj zFm#R~fQ~RX|GR(k=Erh5_)K<0-!;Y&!Ri*n&gdyQA_+=gF`N+a-dD)S zltu5E_C8PPSLJw~J@;-$UM5e`+*~b{I>VMwWUb98VX0XiN;v%309iA zRVvZ3lL4f*pTQb;W_f#F)U}BZZUg8(H zC8_S@RDfkuI~YbTeJvOpaHy#ow34ceWVN0e77Gm)4YxE`xLKL1W~n5j>M#Au&QIAN z&E?=T*-im5S5Y-Dmrn`~506HSl(e;EsLnBB);%yH;nzjz+K(;ndg5d_(ls}2F&R(7 z;?VLX)`vka2tf?~78r1L0RMGy6;24wiJ2R4(~T5JPNPlB3#{!PhsDsh0o$q3idFpu zA8Ia0H{ps1#t!0Sd40%nGfWk`TCw0SM8yF`n$;^gfc?0(4ou1JnB z9Uba>P4z9BBNIBcFq2(Xa) zC7IOFPsufr{DL7XeOGQjsRbi&+N>`k`T;K%`bJkEeOJC#f2R{p+v$|kcf2U+TXKu) zTUh)_pZ$=<{RC<(2u= zFymy!RXmCoTsdUA7V&bHR|9!=wAE@qGL&jZBQzWz0!@$Bz=&guqjnyDCx1YlL7S{P zqi-?X*9gz(-oXv>#=(E4;>(HQDOz6DioUm1AG(1@@vSxlSa~YO8WV}qL7*{J)lZE) z!E&no=*GjQ%)5@NMI)(pClfhu2sV>VR3`B$_GM@k^myq}Q8V{3gOtAP&UOM*vxUji zfMgb;4czG?Y|g16P?eGD*YZc5uYEL^gU@7J_8mjEY`t(-nm5^n=QdXD2>5Hps`VQD z#Rz2nShdlHzgYUh#;Q)cEXpcATSu(QdEKGNbGBI3EV0~JwM6iH`^NmSYO}*t$iHZ; z+H6-^ysXI_8R9HfO=8o{h*j_Y$!ovU7wUidNBDtNqp;t)f*{ojD~gI$Q8#gf+^tQmg7|$hhchOq4`1uEC(E2B=^z zRZFJ_sAw70?qnCU0F|cZ7#|yF@~i=BbmbrZCtv+&E(f2<2JEt7z`8sZtH-FMJh%nT zgVe^96FlUDj(f!38iZkR*yBEX_0WAimOmDJ`cbM!p=3%?FuWJ+@J`?1u~G(<3#D42 zQUeCdu2!p{J78BE6}#2Je>N?r(XPo~TP=_|u&cb%v3Ujm>4_Hx zB!6|PjcNmH>ey|oZOLCdwq0pqu}+8MPo2&b_FAo0&0rRGrbqwj$K){0)pwyHWhpi~ z^%1)oV%n*@Rg6{``Y7WC9L_1s+lntKdUMlBaOPd#d+d^qz@3P;I0@Dp-M3J8-Q~ zBZU6cVacalsh!o8NBgJwt{&Fm^Q5lgq*VHeJK1;DEFl)^1&z>ft?GKGTFvW=+_ms#X-I}zWLI$~y0neD)(YzJGWKcQs zv!mtk8XGOAaQFlnkbc0Zj*LQPJbY3D>8*(jM|MDWD-j~m-H7&M`v!XmFVORT--E|X zf$yC#x5FUWtCW!ydLrz?3nHi*g{8O^n;l~${LT|Z-Bsev83-WlKN z1onWQd@#Oq2%-V=RHza#Qt-}g!4YH&t!A_oyO$EF9e=bI1Ku0n4&0c z^evy=_Z;?S&=>5V{P4fU9>hFkU*uuL@ZCxSs$a9Ovo{7&%#Q=M7ep~gan;I7WF6baDJft@1s(@ICAhu^DWiOM&||l`X9tNG zVbpDx_saW~vf;U}+9kVggSX$l!S)4@4{@yL$M?I9-EwPJRm8*ikiE+t5$dQ#+g^&L zwD}>UtT!b3;vmxIq_d-%u3+rx7X zQZwtPUnQQ&`bqbh@_}W$>{QC+ozb}I2t>ZWp~8+7%(fauwyH3%fHa-|E88H!=A>1Hs4gNC~3r>_?h^8&-Bz4t>hT<0?ns$W-giM60KNUkN zLxU}+1J7E=syR(H_(RdXsrzlVEUQ5x5Hb&{LNfVARB6@fg46JjS(rSlm@I((-bVb! z-}}Z~4nC6&fhm#loiK2nC>}U&uv&V%wa?)ttxApE7RRhoD%ZD&-F{v;VZiQt?y+z~ z&R#v@{z*K*z=suKY0}T6p(g1rD9`^Gtzls9O!+Ra_? zRd_z>?2a-1^cw}}scLMy*{XsF7ONQv7)EA$y1PSOw^3;~>)@TRBASV)uhJ%@8g7-~ zuihW-veb6Vvg#GkEU4=hPm%QqLVfII_b*zK#2|6ac(p7o7&T&`M z^>ssWqINRp%y?a^4RqP6;>l&LdM__}-7bgAS(T)V8F!qFG2kjzMGSYVhh>6?r6%#> zRpsf@UBn~&&YPcnW`87?gU{rP)$|CVGjRQ29a^)kty|dmfBAFlu6%_7r>O<@AQl}+ zbi?im&*Lt8H7fSxzg}0}E!y^Hw$eVqxb)fMLpM&zx@y&0M^2X1`GzdkDeEz`16|yc z%%DE6#zZgugbgl&R12k2yV>5?hE7LCstLL$)z|b4$9xh(mvXA|{c62tym*+NKBiq9 z-DT9$=-sG$bjnMfdJx9E)H!st<_t6KVRR*@O^Fdvs=nz?o8vD$G3I^O`d@!#?6$hpsBRv1J_#`y@34 z^d8={4y9c0xT$Un-u*5?0AY)PJ2)sPT8GR$c^l2S=jn*LPg%{X%6VunYS3(#8URr?1q9)KSs>r}oAB z70c-+C%8e{&6Hy6J{Z$aiu}rs#hc;`j5)r`pLWBn9IRu@?8n} z2kF(wFy?ES5SE+8cZ-!$xvZyy{Xx$fgzQ!P|Lgd_qA%j1S)g%mv#XU#>bW_W(p+`* zjd=Ui)-hQUOyLX#o~p8x8yYqEwS@N#`MD_o6K~m+h3#}~+mH;X7+v*&>_@6Zsbt#? zNTYxUt&NKMJ``V=4q4x6bbC{o#Qf<>h9;xc3g;r3X_HA*yX)KD@Y0J<@EVO;%{Z$m z-!|NHZHrV-^dSy2TFWYzjZveUP!&subTf&f$U?|-GtS2Y!2SBsUu^Pk%;n%S`R+6_ z{m8p>g{~6rCiQrbYt?4TPZ~et4MavrKR48O4qlLOub8fZ_OI2*52qYo+KrixAw5Oy z*u#%HRU>KBSh7bzq1sR1DA-NIlhQ4N8}ucluQm0%;gs-pP_~(F2Hb62d~k|495bbE z=)?~C3Lom7;Vq3v?$l=*bgN9mkqT+(^2a(SfJfX&*ZCMv2v_*K*9L>X{*hb`K9jHT zZ!`Q)WQ*9fSL}ke^g~nW23aSB=bWR-Rplevp;WB*Fcs?qwKsl^iuc3rJX2H4Ylk!>eQXz1pk z12C@jgyy&VA~|Lp^F2Hrz|I45~|1M zMWcR_&q~x6X_?2z&8JwepZSr0@l${Q8*(}LOuiDX8rCZgdWFCjGPy`06g&!~0&>;n zOzJf5`vO%TuqY~v27SmWDHlR|TXyW;T~L8wR%e;eIWLplIV|XO800^M&HLPUg~#6D zJ>C_Doz#`94B;p?k#=)T!VwskZ9Oii`xxSO`dN-;Rjko$dX-kit|mb>T^h=6kn}ZW zXKuGEjb`$wMWq%l$R+M(-w`h;nNL0(K+?HX(MFjIBk-k}-Awyn&G=X|Rp3_Rpi()| z&Ole1Du7?&lRhYJ&Aer|_uI{Kg1Rt!e1Y4xh$2-Ae@m5Wih9#d25Zvsii*{)CXZ>% z-LOMwK2lY;_xARrjso`}qoBUZiBxKTtK1TnRQ8OEn^m!NNIp&nZa11OC+R9#IaS_t zBPjzy^(%@<-$y5pqSUaP$pbhQC8my~-mn_Rpr*Zg8qR9lt=dnFxB5ZOF(;34%dR$) zM{hcqRfS~?h|4v7K)=bTlP)8O5mQ|k4ZGBYbUWB2bcYI(y{GS^et}vw^hA1$G1ygm z=wHqH^^a+x{uut~l-t~#wM_|sq`ySe4#v=3PF_O}*pzE@rjSI(S;Hbp zQ@{?P^qbz_y87zJayj@+c1E9?!5N)%oI(>uG~@=IQAT|1yofBg^4Te4O*M9;L084e zDvm3lu4=M5_J9Fa#P3w417WZ8fp_5d*1yH;pOPgXWUDnLu_0?65*@ z*o+sauIm z;us8oMW;dp=*-h$`5%$)>J0 z%sl$v|LWJTUdrX*GuhCZ&+$`+_F}}AWDC&uq=Fx11?CBUR5i*NkZ*miLm?wVc~L?b zegEP`vvBlBx9z!wLLd2r{hxp78*@4MOuj?SBtvwEt|5`!R>C4t+c!NJ!hPmrit?y5 zR7}F54u`)+I8<#_d97lELycC$YBr5g2gWGIeKAJKCHs91f|QfGQ-ry4rB)Cx83K?#q{QIrvOAwtsvKbwgvjns`W=1e3L) zIZ(52G6rMfA!P>69uMK2uNqt$8j`oWs&ohq;eD>QEgucx%}v!`7^H)@v+CBQN4g6l z9lV8g-Kmrb^Tb1V=c;<>zCE{i=u7|nKYKkL4~<(??c>QU3L!$dF=cHv;6M_uz%+vd-&#^2kiEpy9aFl&f5oj5AS}t2$>6HdLi{7 z+4Tf_%p*)J)D=FgBPASsz#Jb6xdKMH!LY+LLe`1g_NLoCMC@M5;Bmw>~4%8)0HS8LS@tU%X2 zj74bd!>+v(!BGVvi((!RA_hw<=9ye@PCf8~MFu*72dneRL>bX_thvJ2)f%tWYgNV` zNC^Zi3O3w+RYJact6pc62_ed}JN~g7xt1rQJi7~v+vy>5{VrBt16){YI!&9Qir{t- z3S8W7e6Llv>cAcAyuvHVpd>}}Y>$T`&a-{txjk6JE6TI`YL&1ETW&CR)oD0&r>2I? zD9^6F6~rv)#KMP+QjTi0$=KCS6aG?>WE>_GX+bMi#i^7SdzXhUB&v$?>`V9VvWL7I z<=H*CXe|uS5ql_}#KtcXjN!i9>A+!#Sg3Q|W(?lovYZlQcl=m%<A$(H(d^WCu_B zp@`tlkMiswvUy*yy+a;y8_%m6!7sr2cIw>jW3Ni0#@KDhK!%0yiTE&ZqI@za?9P6a zXKxA)*S#uy0GC#|!P_;)J||8d2O$)B5C!q>2+Ogk!MP0_ z+u>Hd3KwZV6gF5Fc_sR;-`(Exf(Y)ngPtWEM>xrXba-uuVz$`l^=Q zlmT4oK|S7UBeOxYOB6is?BJ6fHy}X+Gk%iwC9xx}qPs)Z1*+C0Uf$T4O(R*5(g~O! z#L4O(V1y&V;zKxfNxlq4&uK!C&M-ph>11E90WiL$Dl5QK3TeO!Gn=raQ5E^7h77AS z8mU1e%GecVHFrrH!(wu*$*8{$^(&(Y^($X7t65B1l8;UG045py=qGxLo;qB8(lGi@ z?GyC5?ZziNtW;DEKqeYu;41Svx&Ss61 z<4Dh)6&O`VWeQBjfqiz2`v&U{z#IC8^%;gB>8FeGxda`Fdb)u3D38NIvViND_kz$T8wat^3iCMB zWOPYKLuwZJwt%`g;5w#-cf)~oLP8m}s4(q@*AP{djQyB5s!C<>{YJkJSYcsbu7(|l zOdAW=$&cTF3XAdEi)t&M&DmFOCGb& zL_|xs*lkugdlZ8Q4=aI(;usc(j)Ok)#If*Lk@^o)k)pb#B0K1d2;LZmcO^W*kKoF8 z{WxG!hhv>EZriRS{8&HLPYsIP3&%>;PuG*NWz7AHaT{JjFmXCAmmoDvpT{tv!TFURp7 z6hSpZFT8|Pg0@t1RP-suT1Cnvm7;eP%&7WOVmf2Bb8JnU9UV*I@AQ?94TB+d37f+<=gw>f6a z=;0aGIqYS}d1Pu4-R!dwe}pxW9aQyF$|>WOLE~LU^i!(y_jt(I?<8_9G&L5@h^0R5JBtF_Ah zd7$5Nt9DSUpN4)byNy=;U}kQD9S8JVzun$z1Hy&0!3n5175%o#yY*Xp$)F@fXGOoa zntKO(E#kOI`3W2s(C>cbpn0HaadI9e6an;GJ!m&tt)-&h>Or&JZY&M`Ru5`>P~Bqa zx7C6pJS+NbH=q~GL%%TQ)q@4mFAN71K0Eq_p{eg~Jo?3ZZ4~`VyF@cfBTQEFD>Iaq z^PVK;*60_liwSnHF`Ra-5dA6xwk-6E)fxOjqF-g~mVkb-CZm3dew9&NJ^Ixr4Pz~u zipaB0(~;)~{i01b27jZ_FS-w-_iIDH=y}M1sM*+fLSkA7U5vQYg+ssS6pbO?MD&Y3 z**J&|LBHtxjeftd=obSSeSguUTHaywq!stc&~Iu`FmA(3XeH?P7ygGo_pyKRiChjo zli`8!GE5pCjDx=$Jh4A#0^BNFb#A8#aJ9@SMU@%0B0Dld+c5;V+^UHhEhD5VS2Sse z09UL=t4^k6nAk>6;AY?=9U0g9L{`kGsD20?B*1ISgwc zy_E+1O`v8%7!%T4Ey3UOAiY)j=QPsW*n__dkltns{?1Q&clY3LGAIeDot5fwTgN@-VYlWm&8L(xMUaZc* z4U+UKW48p-i!~YbOVX>1;_6ASK4~um=|zia4E{!uUUVNu@7G3p^*G{HGc94AX(4p6 zi%WW?Q#6Kn6G<-&vs|=>hIvCsFZzCC@LyQci-8O|XgzsOK~3BzBfY6XflL3Ex`b9j zdViw*H~*La`4hPud?rHzHu4g2GBuq*dx;@jxC#6@(_G7jzbTrF;VOcpd1-F7s>Qrm zv*J-hD7Rt5U$xCZxfrdf--*Z0hH_KQQPFjv+~MZ+Wj$ zs>oNtrzCM`S8s#fcKJyh>W%tA<5VSYv)0^e)fV8pxAu3dySL`&yL-*Oz5Vi8`0oDg zgUSI7nZbuAz*Qu*#)bFT?iE{X5nI>71{SRUVnF^BpVO5y;+0f%&UB`?$jXKKUwF5YV+d>8E!O&=HIyJ%fZdV`JO^n8VU zR~fKn@m;LWfDDrFDr2_S6>QFPxGWouVy5f- zXdN$BPJA-x^@Oi8IW%icyG5_68}OGqR@I_ZxI}PggTJZfsOUQ2uifOLO<5|=3;xHS znMi;|#pwvjK)cjDzb&iPglr7c^ZYhNvjs}fJ#>q+=lN~a>z#%(KO(NT>Xn9({CIu| zaHUbHRygT-lk!s#ak*V?mTfAMoQDZTAlZW@Y7LM$FEP(A=k;dQUK%3irG}_liza)h z@ODLB9t-4I#LE}*{8rm7%Z8K@XUc_$^+BHBdb8m;)`Ez*U9WSvm(Gretxm0Ebv7Om zjMl|O#Ml_l@K=e5(SR)t5zFcfP9YJoGImQq#8{J2zeL2!D6Sq6 z>y!3EAY!!X#^7%hB1ZRN^nPuK7(EXekeLy&E_PuNF*-$Kh&K@tqfa&tVnYxy`hKI| zFDxR)Kt|tRH1AH)P~0a&#Hm5SxD79%l_28(`(cU=-Y#*jfZzif7luG}~a=Pn#ZC%hDPj2=pLo_rXwW97ak zEg=ZRSKTpF;jhYooX!G_UO+WGwK&1>u~~q>^{@WIzw@ANe%SCF z884o`5}e74*F%blPfjDnDeSpaQmp91DWsTy@7$!A5cAw=ffc}}K}ksOtjQu$aNQ_B z0sDfOn3z2-DxHyH#xhboZAG}}gcK(@*9fDTvP(1(U5pf~@Z4At4jaQ++6qZ=0&!2WKwCvM(al75Fw@M2riTGlWpSg#?P~k1$tTJk?zA9-^^%mu zjYg{`$_pxstyaC})Rv(vc52mn9o9$`{ZQCE7EYes?+f4cyW4wSAeVwa=vl&Xgv0J~ zzdPVv!5;E%lxL#YEwWc%>mT;nYoCDyvQwe6gp-aN^*w&F!z?ebj{v#`$0F=_!Q;Y{ z9R@}Ye(S@tZ@;_4%A&XRYzxqcj0|KIdSkW!gw^{`i2kPGr@YsoE+epJ$}Ulf#dtAV z7n2ubV=L#y%786PS&Y>g@;2nfXzZ4tEXJCQ`Xw(`MsfALSf8{Pf)}GrHwJ&Bl*Q;i zjNY$LSu8yd84xvLla@y+MIH;cdl>I9EAUdug>|tDt1L#RXbkZtDvQx48war=%3}2W zM!#QJWibXa`u-wSR?4^IKHz{2bry5wV{l^(Z?nSLqZoKTvwZ_Xl29BAKW1^zXP!6~ z9xE!I%ee2bqC&Wl9rR^h#7-FWm?!v=>vx&!#{rYP*E(U`wp~Z~F$75Hdtl2LDm)i2 z#<&d+ekad zl*Jg)(BLkZk{F{3RmmyrSjH`MP>$oqZlG2i#3#>+yvmnt$KdLs>mQ2HjfL}pM%NfJ zs5+OeEJjyO9bQFBVsyewQ5K_zQk^FsMmMc;Uxx2O*QIus&LHs%>VY-+f{_hrWifgI zqo#?)sm8I&;!jt9^!LxAEC$=Yc4aYmj!k^ti1Ef3Z@vB2owwfDVf**lTlXKbgZ(=X z*~2&QJYcu)+&y6XciukOdwBQD#jP#I9v-?8iw{Llu#W2q_LxT!rOd~R*F%blPm+i> zQM4vGC{oySsmfw>I;W9h0=_fK^04DI#)#0&D7C|Kb;dNnra?(a@65_#6RsQOr;uV| z_H!tUGg5qyhev}x+Y20#XZvoaqm^BFHX#Q^Mv5;oDNb;%5k@m*muMoo7%5iaxuGn^ z#&DLlLS=CRac4APrYupWqf1S|M@X(D#R-l+tFm~6L`zbPW48uUtWO#SUo&3D&^#L`;a_n1?R6JVD=einQSkk?@2a2O-SRXlI}IbU{aW z0_Fj!lbexZb)KbKhlXu*ie~PmG(D+t)W}!QtO7qH#UZz25k`4(oL?9Ov51hevF<=b z@&ThJV|rGpM$rju<68bfC`_Bw3<*b@$KfEkK|;|LPx`5|lab=CkOpS^2EC$6#=>>- z>U^jxmo~_IV8S-ZNyZoJM`GXvawAq4pY-)v)3ysw>u^R$Rf0(CQ^S?wG@2Z=o@I~O zCnLqFL0LH|{<-)6B|D37O$lR*|g{)~cu$`Ov(|VinCQI*gSo(ln$j zPElZk4yULwg;5G=_2C7L0XMK@G_WF_207In70u}IRAsS=d^0+HMrCnEhqbc!zk2Wf z_nfXQ{?x=bMMM-2czAL_(iR_JZ?eqA^XQ9Hr*J*sxKry?Pn8%qMZ-B4iE+EqF1O03 zf#X)QRd0e$b?)TFcEhUk`N46$Qx~-}NsOzdN~c2ko@WEcl}e>jw&s!;Tf9-JHkO;b zSTw7k30~6rcD&whm7GN-#!aW)tU%h~GbJysTWzP-TAswX+Ti6zV?l{=z0)qYD$9@< zx1EOFlrINtw8R+iHJDr)5jInHiRPt?fn&5TCOF2%Rt}Dp0b7>D7^^chT9~{TjolI? z##ob4KPE3mqqusBu|8=SeA2W<&c>fVaEvzH82pWr7^C|zdcQu2vGhD-KxUU1Q?Uyx zF-E6o4DlvPjL|0>2eBa%WAyz-zh791F$OaF{vvr+ijm?z88}W23dU`C39Uq8{PjQe z@}KWMIZ8TSkrx8S2<{5L)hCOIxTbmJ_XdkSN8#Y+(yqn}cpCr_r2OwQQPM`(<`Ks9V+ zG8)w>(@$fC#@}A}jXVai8pg1;JyHS3c;#eX4ITXhkIG#muoPpzu ztT;~St`Sc&WtV7Px)?ZCak?Rs!p3mYwnD{m!gOaeVTtB%Y%XJohz)un!Er*TXES$6 z8^gJbN5HfM$I2+K9vthFh5;*0QZjHH#oUKAV83+lF1tl91tx0JyRLu4-U(Nm%UC{l zG%n2y94|YUaR!dpn9Dc=$CS%B1IG*IGF~}2{_GdN^zVK1>;Au#AoPxpzEKWgW3Z@hcJVke$YL1F#uz0HO z*d)LiEIy;|ID^Gncl_)B<~LhEb}5&G&t$9q@SHScui{=qT{O5Zdywe9oI@tA({({jvI|eL-1vYj_qo- z)2VKLUSoN$jf#$?T{;^(M(bj-V{B~Y>{uDFWr>clIs?#QUSl+NOAsAnO-B8g*BFiB z>e;bAX)gpjMw@O7{zi$8(R~=bUmH6{&qD@eX3?=Oc5y|=(kU84yosV?^vT9SY>4O> zeZSG~7gltPfsDStNUD|6*Wx~z=r}bf7`Ndiv=Y(r)^GjVAAH;8Tn;{yDZ`D~D8n>> zyy*nsoGG%3bWMtkQSM?CSw**sB4g#_DKf^3YMVikG0s!J6AGS&S16 z_5J?yy5aI9eSYy!MQZ%ing1|?y> zGiNw9F}qQI0sw9T09N#V4!v>4jAzjsXUzB_>x~nzYXs9w*(I8iE~YnDLAs$g#>Q~I zwnDvef^%myVTl%aoZfhZ>0*XsG!oM*d1;0f;M*QGgXXC`F=BQ}KiKnTJQ}8$A#Aj3+XPj88jeq*@|Lwycy_CzrXR=M7 z{0_;X;PK%F5gWe=eaW=O^JtBY)3+XM+-Y{IohAqtJAB}cDn0=lJ1v_#B!XQkHs)5_ z;?`-{xGh?pwpc`J+-$U)aBw_4O0nB_BH_sA{87x~LBuQ`Mg}%+wChfzoeawS*tpWJ zR4Z-L4JYNNVB@k?Zq1qB*ygoT#agP=m^bQeNGZIe{Kl5m;??@1QsZ{HWmVzwI8%P( za=l$`SC^OHxL$5>NC|!$){<}oA6^U>@nPUZ`Q&YJc4t4zgGF>;mWxj$4y1az-nL6i zks908s=fL7jqzR^l^RRCbT({^*2Toe*x1Uku`*ywlNw8VXz1NgYK+Ei3D_8GGU`XE zF&f3yV`F{NUI=WAHr*KfjglIp`!IUHHmNas9x@;^OO1803oA87r)UiECQ6ObCmRQ` zAyQ-X{YJlESgCPS1~U5oB8k?}6AlP=GO2NDP%v)8OK2rh<6nq>?W>nB=W_6wj2Ny@ z#Ky)Pbt*gF@ag|K17sEFngAJN+{FO0ifu_~EMv3r02!l2waoy?80D$oi2~0CkWSmfm#Jj7AP@BW48oWJi?+;VvNuAR?mv{Ny}LAg_js-toYm|#u+PKqr^C4#UwG# zSn;9~WBH7Kg{=7M<-hcQe)MuK2cOA6;p!z&HhcGd_GqfpNx%OV2+4xo`UB zzx$D||B)ZMl*_?qvN^vt(VTnyNJOq9E{MSRuIf&vF`h?boIZ)`LC3=Cv^t$cQ9CX> zg8aD;6ShZ8pak*XRkQO)S^@Lpi=Z=5uMy};Sj@-MhFW8%I_t0~@hq3D$ z=(x_CRtuDvbIOeC<%ZLQOvp-mJwG}wcPj0Qm``ThC|hNRiX`V@0&Rwj#!jW;G%HJ$ z8Mmu-yHa18%(%r{ywq7#W?XNy?6b>^D^9D^fVA0zem@A~JbPPo2ObaE!IOR{q6n43 z2a(PDg6$phklV2clU1d@FbHCyl*0Rvtfk)UaA!f8al>j@kY4$7;^c7^KPX1jO&e+;i z^Mc6ryX>H63CFq6=os&{5p;}p>1^m2t&53{v9Z;oV>DpPk{M%l!{}HUyCtAwtjVZf zqGM$gSC5YMNqZsCG1_!v@Ha|kjPAqe{n}*4=y}M1%q%n3#V)MO7@eXq#G5EHMxSgP z#D>U>(f1queqm+C7|7`Riv(IJMJ?_F4%o;D$y^!M7-M*w70w>Tz|+?48(WO^Lvbwp zn8iV#dE!`jtf*F{XWVyKQ6+qd?4U0q=vo-`m?!uV1Wc|U2TVd?>x6OJb{*lzTQ|0q z?}06pIA&3FjBy(t{z_!VzxX3x`@QeHoXf#yGHb}s${MCIFR|5uObur<$Xp>ww7^GO1%YFR?L3HZ-^kij6V4P?b!F z$*EnJBsRv-K{dZ@u`#-I<1C!J*chGhQpCpSsZ{65myy_5xiQ0sp$k*HOQ(QylQBMF zWCQvisvEt5Q4_-g%4HeF>8Gc%ACCplE}gC7|9#MT@6TS!<=`{f#$P$r#;;v+Odcdt z9g7f{4u&W3p_gELjK{)rMW`9_dgw7RO9G_{wM6|cB&kTD(4`8G(E*)C zj|l?LO^*pX&r6R9YSW<1Pmfc;-6%f+1w(FQ;`nn2k288ai|{z3#}`?6oFHB!q-M%4 z(d2Y7;js$UjoilA7|z^QC_GNU?u;gEy6|{}?qZS(ji_fccS##DPrpVxLZ>A?Rz`94 z^jM#?j2>Tj;c-Tf&s}(&(c?7=k288q!sCn{FDN`-IX(XRcNG8it;@L_d?u5Hmro}P zvvA{0ob{hGF;)?-5#Flk7Man!@?#a%Dq@V4EBZ7fKTeThLw=kh$%K7pBgU!bsAxuv zr^$~~7&s%wXOtgj#8?yKfAqV*_mih*sQA=GyWaPBEcoDp2#`OIy~*^)^XQLLr*J(0 zxlgATqPrljmV|lNQ$dA!3oedzPbuj@lHnwtrtPI%Fkd?7p zg8Ue3GU`Y9F&f3y17v;DUI>7UHr*KfjglXu`!IUHHu*7n9x@;^%a3)j3oAcHr)UiE zCd!Y|CmRQ`A@XDN{YJlESotvqGWz}^$yQ2!jQeEr& zIrvNl$e*4OG)$w&8xH}_86~S&*F?z}=PrhlReVe0V;P@~N68p5s%-{J#z;^7PCR%v zl$>ggimn4CW5A@2;k?Ah7}wC?E+{_6*g{n@9VMrBU6S}10|(Xovc<>f(2cWj?&4!~ z#Y+(%qn}cpCr?HKVdccmM|>>j@T%c4Pb6{10~@A_kJ<0sdh^d*%H`lQ*}}hcnuTAx z_E`CkO?(Ksj)cbwAFl@-6Rw;Fj#CtLxyoZjXz`VOH}DN$iu|z37$K4Q!7&l%*`#>b zV4X3|vuRKg@H=bD;}mN*%1@xcpgbmoKZo)-1IM!{k27$5k(I{@-8JHArtA{UOBYlg zYbH%{DQpZUZ7WnBCro$7XJ3gbScyqeQ_m5wi^^ksytV{zJOZXAIL5JC131<8xOYXW)2^%Hs?iYga0tfRlsP)9sX_%D}NolJV4d`)TFi_}5?m$``)*axMp- z$ynhBPQ?l{AmdG(@}Dy-R`IP7+^X0XananmV~lAPEXK+ecpB0jr=YL_i&GGpi0^E$ zIMo~#&0z5~-EoQlXR!E;y5kHMYu)h={Es)k@MD*9IrvPr>XUWH5kKa>&o7AX_yP7N z(;d&FJ5HU#_26S+cWOc;65DaQW2YmUqH->}<7T_k;-~74Tdii(SpXl`I}N8%TR?YQ zX_V?x(%Iny&&0p8;^RuS!XbMwvfu!=9 zQgz48v*?an?RKNe*aNwcY?Nnr{6i7CkPSu(nYE00FK~oP4@}c{d>F6?c~|T<=cVQ8 zj%&@9-7YPtJFeGT^|rMP-EphYtTo!3pY~YZYa_a2v`aKQT?`+ibxG-tWn(MH$I5^$ zO?NEqp&@>g_*facCE#PM$*3Q7$7mGSpgX3M_CnxewCTp+Zja`?eJC=ciYJSB?~I~7?0Aha0ygvOjup?QK}o>x ztl&7s+KuuPD6q_UtPuVjy5kHS&!Rid!10CF9m{)d1RSGXqIv0J;8?}!hUNzw!%5o; zb;k+Qoza9%*By_5UDO@py3V8qyu7ps)dpQxKVm?`*I*)f^Sg zVDWU_u|a?{SbRp^aR!UE?)a^L_SxS&lkQmX$aTa;(H&!NGTrf9x?}Sct_L4?Y8|Ts z(p)969fyzYj%eBElkeE(jh1~HK5muT?N(_4-EpJUbQ-Ps@o`-=MBNZ$&ySBQHOTcr zBI2a{6ntE+mh0sz6-my+gd(6j7L9TnM8fa#(B+l~`Gmi8?=E}DL8Gh4>Rs1Ak{N}K zU!pitD&2kIiCCyd1#QUK(QKB>&eHN7w_EL2dEtD=l{T+d+Go}sx7%$C)XRf@KM3PI zds}n|9uL{UlYS_o$PN4`&kiD+_XXQKx9Gj_G=G%B6?g1Tew zR4mZ>e@>h{4nil&vj=ey@~(jF&z`X3Ak-)7j$D^qovFP;?sw@--Bu^xu5P~WSl(+R z_!#Zd+3+!17ZV?2V=KqU%786PcZ}5;;y289jK*#W_!w(4>POu%8pYM)V|~(I2z-n- z-5C6h(jBAwFnYf>-7$I|G9WYSj&-pMt2;)gXbka2>W-yPHV$G#bjRrXjeftdx?>Dv z^!-I@t(3$T_W=iNsJ0lcRd0;pZB}6WXI-@c9@lK&*kY_7ieur&EDrk26UV}1MYVQ4 zWNHb2YnGi*TSI3Ji(7#zsp=d4wwYP)(PXb?K;Abw{C1J-ve9d$SxXv0Ne05T7g*k zLazEU=}|NZXfbe5%`aVdEFHRW7S3IFjIMYox?}WHs`KQ@XxNk!GdvhNFtxjM33xWf zc!ZG+c*dx1^aVyu3=1fSWfZ5Mp2~ha7H;=2LCODL?&tsUnRLf!x7V*b#(reFV-a$A zxn71Q@u6V5JQC#wi|j+u6O6~gb46HCr)@ppm~iDZaGau`%heq#LVHTSW5s`G6zwIt zV@)6KY;>czGFoAbLfuIXJ+8|l!O%-IA(Xb-yQI-P!APE zv0G%XzSckNv)4WY^P*J5EGK`C8}&VYvcoJdu#aH!7aWVQ;{}fkPj(m|!~y))hoHvq z?y$1xZ9Ut9m`1ujS%uzM?LT4l{u7#IrY4sO-8JHArtA`xSWtJYnKX%|urZvou26TJ zFx?qVm?>K9^C#geR)BNzHX|w0Rs3JiRFtUGb!!Iy)IS?h0vOwr{ApqBa(;lSc?Tyg}Xr z6ShfUGQLbRYbYSv_=1YS)$m4V|0b;k$`(7>+*9RJ9# zHa>SI-Lb+7Q+3CiJLOM>zE3Ia#i-W^d1b^)5p7xYp6OWkDgCO#T;xE+hE#lO1h*=- z#ogxC9b-(ZU@=y%z|)ZKI0c0bSe$~$6ig{Z)gSnFJm3(Ns9&Oi6~*aeQO!}&3>Fi{ zHOVavS&9H>u=tF+;|vyS-SLChfBIKW*Bwt@{xlkR{lh`n4+8I^XpfT~W%}c}^vB7- z;i+5?O77G<%}!^!2HEL|N~f&Uu}ekC?PlAtYNu+D+bzLsi)fIoX0^RY?qkttw9c0M zxLvK(8zd-BQ1ld(Tq#wWHC<#T4YJ*?wJVjSqGY?-ut4^E$B#uZVdiLp=5L)M(@|AK}OF*24rTGtczV(l#EW%7~)OTAfrz<4q{_8$l&{pe!s99 zWDI2V{YA>H6mG_SzyTWyt`}W{jBy)YLMuVZf7<(W`IDD(IrvOoWNCZi(s?5@)#*?< znb&SE5IASNj1f%=FJrvB7+zL!ZlXnQv?k<0#>i2zU;{5>#5cr+v-^zVE78wHw)%>!x$mrOOv#Nnr$t7epc)?Yj1sRa*g%hU$7+!uUcUeHf9_H)2cOB7 ze)1xzhNWM>9y#$NnI?HgO>%0;tP?3;e$(w9dZ1V@K8i@oOacN1cfTXT;?@>p1$G$6 z{b*-1FL8Uz3oFP{V3YDq!7Ab`~)Jz?HkDJN|5VVAxx6sCJ+<%k@=8KGP+cl zjGpK;m`qG~Mo}Mj9P%L(g`Q2Qhvn*wX~s>1lEC0ub;&9IZj_$_lL_n3p-awS@+|p~ zGnjmlb;$|wHKZG4muRlKur66~YSJZRV>pppr7l@>-Wg3;B8gRElk^;Y81|wr86UYV z0Va>YY6+8Z?A8F2^-0TM@`cZboWbOC&xf4B&M*n zMYzLWH<;+Q9fYC~3*Ose>|GH;iqjodDOJkFQoC4E$ds`!-g^73J8!+Q!}jm9x9&e= z2m5y(vWIWpdBASpxqHC&@4S7m_weqQC7OMB=tcl@dxCXbPq4>4k}q=?y5dwcj6<^q z7+fk<8rAxAWpSxgZPlFfP!`wA&D*X0Q(^F4YqwoqKv~>sv>WZl{Mn6pnU~vAwAtYU z&xEX$HB8O7Bri}gu+Az(1tbYt*0 zN?DBV!|46ml*Ql3*gd?w?9@11}P#;2y(sHyxpV_p@(8sV#o zUKhl?KM*TCydbw4eo+D zi!owQl}y(Or*>VEP8h=h)%>z`!sw=rvvBU17aiA#@P3 zDCY4XVipf0L*d)vt#%7w@WN2H?X<0SlL&315S~D2A@i`sxoFcU&jxkvPJ`E$n|avo zG@WW~c~G}4M7yI&Wvd{L-twd!qW8Bn)fZI&zLjfc8; zuZ=)mv`aK+TvXu;*2RRn*ceWzR;lns1GY4%EB_c|K|)<+?3Ms^u_mK_%sh-narIDF zpR^YO>Y`0I27jZVF1in+_v?eY(({l3nH}mGAW z;zC^+$msivCe0~+iTh+wH$5maZo^AxB~bTvNBoUn`$R4WpUH6Glat`UII4SrC+_D= za8SiQ)RiHs66#{*iUth}bsMz7Q0Zc%rV0>)oekfn+M=TCz_%FisAD)U ze2Z}jjqIZMR>lUZl2h=lx$BbfEjoVH{Ic;aI%MN4oIk#mu5>y0R{A2y!3EKwz}##^7%h1V&qH^nPs+7(EXekeMN{E_Pud zFgitJh&K`f%Rk0JYzPEK-*5E$#f8A~kG{WX>Ye7D@=peVQ-gwW8(u;yfxrhp`^9fv zB+bK^IqG;K{CrIR&zT;pIM<}drIM2W&5MpJl?riVtX5&DA#Pl)sx|IRZrpBDMpq)g zvq9rjLsWDf&=>)d`C&qeo0NS5BE^f72%VEX((kE}FL2%t z!|FKzuFRsojLy=`z0{g5DGY<2NAoM3 zp~*eusvwUAth2DgtiY2hMjC!y?85S4bc)8^nekzH6XDaN)K!zrUbl+jz&cU;^h4kq z@k#m`>I{5Y(FgQ%B(P%eE_8Whe3(W;I|&?jnsKK_3-`(RaB5Ii&WFQ)aPYa0U(V&= zGnp@3n}sio6%42F@TSiFGdk?s@qmLRRai9|SW!#>Eu+JcaxJEtG5$TYY+TzSzC0Zb zC;Kgl3p;}J))^FreD&ai6eTAYMc4F&hQbFAb_O3@%H`lQ*=XOGYP2059u+zRNISc} zHR4k40pHfg9%X=dW9In&y|e0-f5M2ePK*oaysJ734${j@kL%OPRT1$ zpjRdchCf7kG8wVSDl!={kAqMSNzmuE8=vg3Qqfdawpiip?^Yxn-O4brA+;fl=Al?8 zb!m>sL)RuFM$bbAWM)jPi(OnyES+M8i4~tDx|?C*JQ%F)8?-cy@PrM|sQQr@IDy=# zu*OMWKdI7>xbR7q1Fx3hULbp-J6&ZqOx@`jCKfR*14Nl0)c_k?#;g{%a!mY-|MF{p z`Hx-B<=``!I230m4yVH64W|JaGR~0k5(UK=Qp_YMPVKrZa4h46Oi&DN&mhE`$c|ed zVSmcMl*_?qvL*l2R7>6s!fp@-@!`eL6u&{;$*A$n)L5Uw3>jz0__;&IExXximKH_E zZL8%pJDIW=CUTjw7=>PHUS__mC#SNRvRMAfGEeYGWXSkv&}VmD|A@U4dI|bguU#s# zq29<;-{gy%>fbU6p!zrIsFSxdY0Je%#^`zGM#j3>g+<2b6fM|;vQQ_x~3b&gztJYYQ3JY5ZQO&4uMujsfY^2A`Qch$k zC)l1^Y(=eBno;3sC^ND2JabcFUF^bAVRVWa70&d-QIh*S(+{I~I@1rEDc852eg1Rb z^v%EeowqN4%jH}SK9k|X^cR&8E}W_z-qeYI#)C5+yhI+1LBveD;nc26qQV#45^Y~>G3ohM$a=h8`i}xEE`6rn6crE z4QFh)TV$`k)<5jC*D^NDMwjD6Hq7t*8$WZ_RqGUAI28_W?A$-2!xP0G=Wz zxbS3$@j)EGZ+*Bd{q7Dci{93=Ejw_8%-$ud&>O4$C#>FoA|un6witVOD0*Ut?Rwlk zV)sPMJ$CIa*Ap2To|z28iOaZf#)Y3dF5GN3oAvslT$uBAyVc6LaK?o*E}U`Uj0~v3LHT_b=sg@R@9|r{@>&{zm?6Cd&?5+C`*}?vuhwR~-cOJ0YckUjr{X1_T z>^;2u<>HnUMY|D;p$DwvdV)RXk(5~%y276s1!oXAgTT)n1m>kiqp|QJbB@z)x7!&6 z&LD6Gfino4LEsDm&kljn^UMu_b+HQzfzc^u5IBRt83fKC@C*?6$Nz($i2v{txg2~Z zE6iS+3KCAizneG7&#-TXeV2%RF>II#`=)kX683ep+B*{iZ?YKp_uu&1H~fi9xg2~Z zo9gc#HPxYbEW-8SUfI0i1RlD*AU^!1pAqcyfg1%e0^c<6jr(%b3q^ZroU9YT#q3SO z(#1y++m$4n#iG~ucq|y)$&LsmU@ovRz}$q|3WFOzDUb~tN+rgwmh6&K5{&JO4j*_i z+vWCAHw*^8gZq>jyIK*IPPGK|y?Ypo(AbAvdnXbO>jWW-Vjd47W^tH~daf^+Kj>K^ zWZZ`xJV+|SdOSReu4By=#;(@O^-8_U*aP7Sdm`vaZFs@1ewRy!G#q-dV)@leEh zwl6%l=f(n#_I@8|eh^03a)Ys}4tFfaRzqf#XV=~eVit5_;j=*`9Mx!(v8x@s<8%ZS zNzTKBA}z+QifWmcZN}c^q04bJzI5*{d&s*{p55c&(V!2*bHpBsC$aHM1Y;=i;lA)h zEY!JfLzRtsz2q=<$B#u<9^C?2C~+Ka!8q8w)F>^g_N|tAwSMNDz^#&1cHkl#^!q^= z=h@q$JMehO4xaQw5y6w5D9;WeoA(9VJLDm^@w}=L{K6oJg*vzUj9smkTNTS;>^8(o zSoofZ4+AI4vs-Z-y4D~T?9P6aXKxA)*S#uyz}VGhy$DTw9%~y+iJI=}g^*i?m#CS6Xn9_CsOwSUB=Z^j*KZz2^lH+;0axOE`{j z*j?^-2fQoPwIR$Y5}1Tk+=JRB#Xv7w7pOYj7($Z% zAnXT`@J^T$Fh7Wywvu3kBf;WBICZc}x$JeJ6NJ5i$LX!}J`Z^>(%(XOp)Nj=V`os9 zDl0HDV1=1YSkkC^sZUl*M}hXxXru;>C}UTc)!Zd*#JroTA8Rt|uS5OHC_??pSIlY_ zla``^6~%hUjJd`*h)aiy4b!EdUtE-34*J}7NL6LkqwdbYC#ACOgsC$rwck@eBtS)N%7I98-w3wg|k`X}o)vhyE7CvHH_!Et z=-)h!_3w1FMLWPH>OP>oJaB*9OZQ&752N?DSb^=qdT!vVl|kJNJO|7j5A8$gnoMt} zZ#S9km)ep`!u|j3y$z5oSytayplI#VMtWlid0}DE-F@0+X6TQskF2U}Hg>nWx_hQ~ z-pnjBZ)aK7>v4YEtj_7G%G%7V_g?QXD_JadfROF5Wd*kEkQA1~5+DgVAS{8f^vW2P(f-kW)E<~is7@?YmN zcn(uL=H>(j&lBG@@H0$#u2ZQqRSOXpyR)DdoTAdjJ+^yG-zGYJ|9RG*2yZx2tWP{` z#OKrTZRKA6oN$b^3yBj9kr@S(LA)#Aeg0&ex=+9-D;IIhc9(Ie$!+4I7oK%GlV=Y7I>ctMn6pnl zv9pVfLq2hQxf7qC%W*t3vF(Ckb;K)WI7;YlsDo6RNLCpFnfUqQ!|}NpdJsFLj}ecT zeCERFa=;ImC&L=04^P?d?V}jDc#*&`;E(tyVv#>)1OA8)*dCp~n2PL$Q6TQ|(DuhX z6sH#WLpI>%h4|JRMZOdyiMg0*+n&QmkqD5cJ4JL5_7&Do-KFfo#?)H~;x@Q^F>!iS z*O=`O$7UoZG@ut!?r){C8O_jlvke=p827#J`uX?%#=TliZ1d^CH_oF6GZ`<F74HR(MWDgj_!V`s+BTu}N?*XDh+^42|kdt8iez~jMUkDDc`Ph5I z>7w(7KhT!IALy>(5Af>n|KPdl+Q4ZmqX51Y4kh=ACQm zOVA|QL-;Gcmz3MYql z8cA`wptscswWDe8eBz~dz5Bbq^mWgF=T@yIw)s|k76TU4u0RGXnpYTb?>z8A_7WeC zLw^(lU|W290bdH)?`Gj&?4ly@ul$!x=@aY-3{T+SrY1fs!M~dL+=PEEO?(z+Ckg&_ zH1S!Khd?=jf4L?;NvABzIiLoCe_dUCh~*~b=dfIff8{?al8nQgA_D)qmR4_Qx#C~f zZaa-uZur-A%x1Hm75|!byRF|^=i6!99jlWc{%yNf(`jVHzfQATx0|`(U*2vt?b734 zc-E%zulz@|%Z&I}S{D`WKw~iVS|k2N1C|&5h3b^~v&6q>>~g@rP?J)>#J^}1*N=bW zL4!bvW-xNbOH+}j2mgXiS318`_!r!Va`uJcU+_F+Ko-Woaj`p#f59m#U0g=|3qD!7 zh?3x6@cqhpZ!G?WKqh{^XhNMLop4Nre^Z?TaU0x1Yr((Y{1?tne(heZCbs$DU>5$B z;9xfXE#;(s#pD-5Sw+T>J;yJ`u84i1W<*F=urEY|xKF{p5XIs56f_}hQs2BoR3%@` z6R}D)M@5Ukz7P!IHLMEzLd-&)D_&L4K$t4d1b``zjIl4o4Oq$b*f(`(PS_WM0&G5S z>=tf5ewHoXz=jYh)wbb}p?8}-jd~dW>tBGwn>+Sag zb2uzi{!6Ez;NLgA3-+2hG)I%S%wddwm3$9luiw862WEKAgUzDAN^ccFg6ppMB+xS< zkO>KPyY+g#y9yHAaBN-YH<4g&Tc##*$1W=bZkXMcV0Oz2fm>WR1v^|;@s^O_y4I~b zZNj<>kzl9oSUiTu$v9j?f~iQ3LSTnC^#;$41lJv>+0IOY-KOOTdGhO0yCDVO=REKt z?tr)~mX`H=hofNjY!vb!);9MTi^n1_A+X-mH6atvBm~ynj^kK)kYIXqP;wzKJZn=V z80->FG_#Rlur4YIhQ?qPwnh?+1}rZU4Am((LXu!Kb~%t>s7a|`l3+B7>nFkSplt*R z2Ai&QeyK<>xDVy*3nRhcdB}h)OoHQLca{W$Q&hURj3gN1BjqAWLW05fE9bqjBp3pj z`1ztab_#mJF%=0;bqd67a0{)41b@fNpFRG{XKFRE&1VU0h7g#hrgLa8?Jny)f5l)J zBU=>=LsScNXjw@xMzhF

pI*SJ*JbhqzB+!w}cu_XKzsW5cQDsAv&v7{VjGhE=g) zh+?R7GqPcbB(Rd}*>LL6oY*jg3D|tzY#7|PG72ka!{B&xVZ-2+@Z`yF5gSIAwGuY$ zy7W+H2g5)1l{;VlgIl$l*ybDa56m#;lkj{u3OEmU9W%HnP#HW4&)Gw9B9hA~&g0Mu z%yV9y2E{lnc?&0Z?zC0#A(t3JN{uCdQXe5|-(R>j- zJ6+2%8@XX((-h~JRWRJ`Kf~VB^BH&q@!o*;gXcn3c6N7b8F)=g-Q?xZ= zVl-fRVPdFGVHJ=s0*qY_m>6nO>X(=pjpF(-aXe@nfr-JUE1h31Of21pa`uH`V(>g< zKo-Wtaj`p#iNPr~Dp@cqhpZ!9K;Kqh{^Xu6#uqHs)wiLZ2uh}+;6 zS_>wA<41q{L)*{PYGRvD7Cv+{S(q&yF8{25#kkngY~Ajra4|%;K&qC-#cikC=yJlv zP&qQME4Wz1i6((c1s5A#)3pe-67yXQ7pIz|qDA0h2$K|0iRYhd1__8}sB<&oVu&cP zlIwAC>d>5UF@y`)eBQVi+_*9dE62s)fOEmc;GOW~$$t?pM%T3xTnsaJY&bhH{>6Xz z!TXhXXaf+%d<>&BTkyC39p(F`;jA_nWCB4TI^re|wJ#0kA!(1eNnhyX+}>Q7BFrx310#0iI9%-khy zTumuFg`g!OMx(fXL>v!Vg@|{uBzR8-di5!VD@07cWJ!A67C&>rn>U{K;os`dQ};aj zoy?m_T3g6}s-`5Z5OF%u`&v^9SBRL>1;ZSg9CSRzPTi_F&#qDmtIsb0f;A%IPk!0{ z)!H+)n%L%}gc)ncC3Dl8=x`aQ`6~v)NOF~+_C9ZNmuJ)wBWFe(F;tF_=?WN50bm6T zr+_ih-NnFgsyQlJfniF3tU7T*j49e%fnmAmZ}!x}6&Q|F3x9drb#9gtzh~-&pM7o) ziqjAGMC*!|s1gfvS}ZQK&-suuIX=ZO;JPk8N#cZA47j0*&njfXl(G2wW#uUQ@PYsZ z;I&v*4)b{~2t}Zr$SaH~I&Z;%Au|(ceiMc~2k6SY!l_im$vDg@0(pfESFBN%V>Suy zm`1mgn@reotVUZT0$E~ZAsB}v#_pT8-4Gh~+sTCM4coOv^6H$Hm210pgS#1J!n|%a zInP5T>~PcVmR}|e&zhJgD&aCiyF^pWYz!Ezi^_o2jJa!Mz-Ykok_kg~idIcB;3RqR zZ5i-X-eSps(I~E;0mp;35e(RsHeDIqQptqDeJE#Nm`oTv4;he!Wx{c>J1Y|gr>Jys z8D+xYla-4oiA)%LzjEFiD-(u5CVsw1W|hL7a7@L3Q=I~F8{9%`kqN){|Nh9%m+sYS zVw=x^zhMqFn57La=Zt>E&=&()C5pu$7EtZ7YG4dr5&A;qv!O49gSbzDzNv)6L~a*@ zzNzM@Xc5pCq9MGtRV9yrpoKa&qZ$|j2dw0J=$kq;ek)9x4~Nh)y#K}TRnDxwERLD8 zoGN4Ud8>iJTPvfmay2mc*<94X;Dqqx$xTtWp@&+D8W;>cHk@4zeDZHT|92j3)oNm! zZ@#D3le4|Ro)jkp?#bpA?E8Ae$LHpV9r>3$fP})~!M>VNIE?t%KKCEHlhJc>3D}b` zI_ClVlsW3pEWjU|qkg@yN!f>CR10FohWI2{G+~s9Ubt{p?CNGa%Nle9nHPg62`e@` z;*)er!g?1?Dbdx$XE|29{2FwQ-PSu!uB^CaS#@#gXQPPsd5}$^20eMm*nPWcneAp) zR@`k_M#sJ_E2c}zjTJWy&RZE-vDNK%c|Iv6u%?n{9)@RaniWgCL{rhcSTQsP^R#uc zVlZI2v0_=B0xTpePJr}c<}ML5Ueyavv1rMP(I~E;6~}|N5v&+&x-z(>V#Q!Ebf7;;H+jEUZ}iex>s_mK8(z5kFrv2~S~BIHqF7Gdcxs zp|!B$@B88JX@B!GwVK%G!-nZK=nyu{gvFZ!0#;0zG5k#tW*PbdW4aw-hRTsvU6B<- z5Q+N~!ki+{gozg;%&F$6Xc2@NVko?}RS{-zVbr-92{VKnSjqK-Idy1Ggc)K9Y(8(o zoa!Jk3acl~(mUrun89^n&yaH?!i;`xC4@QEaCXA{g}=`Be{ic-6We^F|4q{`2*r); z*~MljmdZlUmJ?ZpHh8Y=@;5ITOEWyVLE_$)6o zKGwwNHt6_76Q8Bf@u@C8R3t(8*T{?yd#!q_kt;erZgg8MJvVfG+B!Pz=vmRRp&c6f ztrxB9=tuhDVU9B6Lqq1c&XkS#@UWvBr+LVXyQjL|Y>S(;)Y*vPS(`@3(k{`=G%s`v zjlr~So#z7NFfyY_$SgAmuR+I9lTyD# z$7mGSkB;L(+X!?FHeKobQlVpTAIjMmhK|AWkO5g39mmD)EIJ0KsC01|(J}aB1>)oNm!PZ6fqIZ`L5 zvjH;9UQ0K_Uoj1?^u_}odHx7_^T-^=!dX7xcH{>FRg-*{561&D;=7N`z%#8leFObT zw9d4}R2Na+s%WqyC%@Q8RvPTKEVo0ITu*~jhvr0s4b3$4RV`N6(JkFHl~Gtd4K@v# zIot7Em%#);@Kn5eF8JkRKX9(zOUmtaIZkdNv!fd%`z3!B-(Pa)YG`oR6*G10wd^$b zYu@?Hd!B67YGRvj$AAA^8a(j&=TTw#hsjyUOsW+R4*VgDrt?i850*n!3=k#^NojTy z5SeI+Q*<-e+`|YNZpb@9TzBcb69{4!BqWKJn9^ZTr!21}PRXy8@^k2}$U8x3eu><} z6%c;e3@#=&ZP-t0! zFcM}=K>?K$wS*Ph32UWNP2?jGPBmAgK)6D}#67)e!1p9Onwf&4Lc;thMZ$mgoqxS| zxmBx)ZN4R+@v9Ku;h}x*`-9?maC{0147LWoeKGL;@wU)G+I$r91NH^>^4UZ7tRJwU zA8^5UBo8Blgy%7%%*vHPj{<*}e zZ-x7|AMo9Xo5O9!-rzy#`J)5Y&>HnU&DhhnpWol!e}0>>PaVGY%GoO~9I)e8*(#nd=QWdu)cxoJ9U^pWm?B zTrw8L0N+NlVK?iE*mV~0t=rAE-a&0@uE4ipHd{^eCg9t2TSlwJ7NsQsZbhQuZmVl_ z?d5^5!Oe~-#g(o(8K}T^(c}?k$9Byo$$1lCd=2ombf@dKsYo&obBc&W!wpk!8Tlp} zZZ*3N&B;vxY-&xb&a*0j8_kZVaMX_XYbq`^*O$VITd+1jBZmr6(v^y!?QM}00z5s zJKzh}MFqal*xG?F8nC>QM?iIO6~g@i@I_;ng8~?8QtFoqU^I&B2fp#3Z3OTIo33Yvy4o=}$Oms15 zRf#SHtl5Yz2C7JOq4L>87eYVWrx0BT+3IMo~#Eh6Ou zL_T;8s}lJ_fI^)sURdBu8;Ma>q^kZu;#K165F}tF*Nc2phvp>mg$Mwf&pYJ z=IF-{OgzF44_JH3PFsuaS2vUm>xUBtR3&QTgwBq}!DLR)KVN`R^vA+mZh= zAYDWLTOR3J@?X*^36fnD={oWs@!6#O96l@8j$1w-u7HN0rR@+M$0&yGMLTf>~|JL~7fAN3ZtJTCdpA*bdeo0O+Q@l$v*2773?gs~Va}K{^ zu4`FV3hLJD8Huj0>x6SH%R(-6MV;H}Q0iF)r^B-E!F5iSG;SjqJWH+5)U z2v>T1Y(8&<3!YdRg_R>*@S(XNTyQXW^5lXD;iC6h3Bm;;F1UX`?mP@0>0d{{ozJY-MEhm zz`CyG*4;)zFcXC+aIrdL_uYnDcU!B#x=z>89p@&jYq^$Tw=-Z}Q#TybT^{Rpt!~}u zCY_RC*+sE#r_t_oPL{&DdRN!l4Jwk1!yFPUl)A@y=cKFWigizpjyi^x8`eGU9o5^t ztXTK3dDLuoZi{u>#-VX2YMG43eh}@j*LZ(2Favh-WE}8NDD}e~b`sj=mmD5$#!)K|tb25LsCRqfCM`AAg=cLF>w;aPSz|V= z3)V%&y3iO*sn&>f(SYTJb)hO?f z98+Q4bf?I;4Q`>eVBNpP?BDzs_i8n<&1VPio68Pna@}~&N?^Af^ZFH&UJPbc1uq1$ z0DzXx$sni4gnXfLL`heuFNB1+PXWIW%Hj9Ka2I30sphC?5%|~9JG@KDZ&#(@<(Abk z2%Todzm9Fy+oYGi9{;8e%?baSO{>`^`ky!cZ5yUxQsrw|v`zS0D<}MG8HPndT5?q} z{*^mdgMTg4)Vp*?WXHe%2|M=!Kz27j)g!3TsMt+e17|uXJz{lJjnxjU2lM*sa zl5Qx1@}gvva?K`mF`>M+CO)g6yj1h+GF7|hkEYshinI!v_++5GRB*8+ir|8E#_qQ? z@wpAObcdBM7EeLLd`AUo>@20ZlljqP(e2Q7z0`DDQj! z+>d|v-@jL@iETdRow1S+%}nQU-n%+|UopzXh&6?BT_mYXa@^1xJmLXiT&OsWagoR- z;I<#|%S_ZZReO=t79t$HhSgD9F^{Fb%qZH0M-?l%p4z4k&57EAr^n{=rncaLl~GuO zXxGg}u?t=W&z$@YAzO4gt5NJqn1KyvN4C2k`ERY>R;?zs`Sy5PvFn(l&v~PMVZip- z9DSQN>MOYRQ+#x8j@WmcPuR0PKOFkubL`pApHCjk?+slu>dlY!ho(2!H03UiRY5s+ zou<|h;#N#2JB#VInyqe&vcKkt> ze8P0O=4$*j>6C=YE~?z+w%Znh=p~r0YrEWyb2ud9Fb4w*GlrWMx*>WcHvo@ zV!B|LXv&z4>4J4pnJzR2Q}Q)3T{K{MFF|33x{E1zQ_WG)A{4x?nC;Sa zuZjg*&92!dV3?H!yPDl-Ql5b8S#avmoLF$zw3_iX%`VycNbSi*PXPTn!GkO)*)==Px@Be(8f>dgBjm)oNm!Z^~!k;J}^?%mQ(+Y+u2_ zZ}G?qOm8GI^KQy|YEIk>1&DVWmiQ!0GXadiJw=L!WO5$uNUvOwRW?eDMdre zYzjiWEa){2t0Qtk5dB^r^t!IyZpYL%DL;qWX3V_X;-wcvMjxk z8T7WzZbvt63wqlPqoe02-Zi?NwrOSry|&%yif8HepcloOWf$+lvo;NSrCp+VWH!(X z)&K#B%1b~%7vs7a|`f?hO=>j%B@plt-`1)HvPeyKn& zxDVy*3j@92dB}h)40_{YcNX-5Q&hURjGz~MvT_k60lnb+mGjy>Ltg zdQ+fR{b|fvK<}Tw{GONo-o08)Z1d^BEYJ&dU^eKzt26f%BU}tuRpl;(ssM48MYtHE zBEp5r5eHpCxDfQ=J_X@Iu!i3ghg}TerkbOoMIc;=dGH!mg>WG>q0Y@H=Y{Y9E4d!w zrVh;s;ezkS=JQ6l;FFb6Sh<`RylGAdSIn#N%GK40xbxb;!XR9_;V;z36;m2@&r;?WBdl95c9p ztJtK>yyB{H@QTs+iXWnhpT-mAoP~ZH&AKVl7)Zftt{UG~v*Ad#cWvGV-Doy5ji# zg?_;<(abU%`UUHvqF-nXX6|c5zi7bnLcdU*!XG61MPru(`h}X5`X%~Bqqu(b8xPt> zpkJ`*O6Qjf{et^Y&b~183!aAz$inD1E_P?pFE~Y|i_3_9!6z#hQ4;hEzF#@-jYYo@ z$i&YV&9+mN6OO6SZ>m!uZi8EBE$H{BYJc)KfA2H3n%L%ph4)XTc2wr3^YHJ}GwEM3 zF~%rYCB_=16<8J*V_1v07-~l5bp;ngposevT&%hDB>~^XSaGT?Dp~|9h9F6ylz9HR zuGeP8iFUJsVhASiG_ME6sY7!D#SkfA^Lc|}@Zic2tQ-`B@681igJZ&zC)Y)w7`@g? zQa^z4$A+`B;_fg1#o-sXYBjOVH|g)4Y0`&&7#0SKg-;PDpitr$Oe^sCfE_+EN1yj* zvSL&0`uyj;O(VnDQw1o3>zz8U-;nyDp*QRX$y;;9!p%<8Zr+&sLDzMzyBShHbn9JL z@Z@E&u-&mcrk=3!MA5r&>W3z8+FfG2N%=X9S15vcotu0)EbO|iw%*MZ3-h*Pbz1ph zVaKYA+bbg$HjKI$zuRHqcH1#T$L5vJw`FuSk&!o3I$y)GHF0Cy9t%5-j-?B^d%3YN zJZn=}80-?wI#j!9IySrFeIz^?6%ZP=+Co30G7A!1%zjEFi zi-jSOiJvc;Tc-#p98+Q8RHs1P2Di{!u<+OX%-N6q_Ptt7Z1WkyH_c}Vvn0Xgp5Lz+ z0%J_8LSTqzfd?(ifiaFn4h)qeS-Q%BWn_r^6b=j#9ez(dcQF*4YL1E)fr240!fRNS zY#8Df>fDU7VTd8Hk{f8S3^(Ya9LE!D8sWg$zQgf%_H#+Bm z7jfs!HwkM(fPi)8O@qO4(+SgxK6qyCWMs=lnIKY^CrVeq<(||f(BW_H>;)6+5=)H( zahFAx$>oUYb}lp+{1Ki!c`RxNoz+TcFxY%-I6Dn~???Y#{R>;Qn%L%B^69nPgt3l% zKRPcA2MYox&p_e9A2&mP#9sCW7v3nGiG$w~M+_UyO~b*|Q$_IL}4~!n2cFZxK4KLxh^{!g*=Ej-o8Dt#N5%LZXD&ugSF#!yVK3cgS)4# zcBh#K4?gU6nhlZXy4*Y%p0#NnEbS6aH?#3zur4YOhQ?qnwniR|1}rZg4Am)6Lh@iV zb~*51s7a|`@?bQI>*vAoplt*X2Ai&QeyMmcxDVy*3**7ydB}h)%!A`%ca{f(Q&hUR zj64{8vT_k6;lbehmGj--Fwr=aRPXWRZ(qS2* zx(MgSg5pg~g+zuED~yPfrJAFng#ckoZ#7jEiRYiIHrVB2{!5*k6$qQQ*2J74HvwVw z(42s|2#?d90MK?O^Tn!L5$|C?JfzRR9cb zIO1~y3^v4PB`~-yJ~zSOj{KJa23swwV`YHBw)~fLN+RxE6b5rme3pX2uKY(u7J|X9 z+i^QquHs!cih1LUufBDs4y%`42kd#S+FcSoqes;fN z7;M{iiUdP63oK}95)4r+NrP>hNToj<@=?reI~_`et1w`QNm^h^k3A`5PG#b*^HxY-q- zn@F(U6`w35xGO%(%YvP*_#~Z@fdqHOhp=u^evZahE*#etA1acJ!<-^Ad$84Nw;H*U zV8=GvdOJT7+_BBB7&_r!d7|Sz@(0cid!3tsea;^8Cy{c&aN`|`?8tRXZ`-#e!QHl9 zx5V;ulkwOOq8;`c?@tD1z)qfw10IH+KMHr)Nobp6&U)u&VA>H6l5_pGi68M0&gz)4 z`yJbK?M6mfuw`~F)6IhfoAtKQk}0lBojn+ywJ8z|c8MmM*+?*07nKAJ%ISBp8fc9wb=Sq|`4-FdD`6%Yx%U+Xxa2HeKobQjuVAAIjMmM}np2Ap^2F z38rFqmIQ-SRJyo~Bp7_MauFpV!QlIq^WInz41rAie9;s;1wG-IiUg-R1>!cih1NoX z|CitT4?h1p_i8n<%|{6zn4u+0CZ}_NaEYh+D`vqM)}}H=$f-7vp=EI}hO&r*p>kwQ zSBNkKhqzCL!ZN7C?+NZM28C12QPCo}FvLc94Xfh95W-OBX63>%jKE56;KJ&mIdNf# z5wQ8ZxiI){WfWG8ngsS zCTKXtIdjb*3{K}JG>p)L_29Lr%pCB@3q5NfVB-UC#Mz5p|6Jbn-lz{J-eQc9%+eVn zh*(pnBxrY0k#LHpE9K{KUV(-Q(l4{HT!n@g$rw?gVfMfr^(SVZvxlb0yutVSd+fs> z9iNZcM?bRt{Qh<-P?j?p#|y^;^YVaM1K++7(>wnW58Q$Oc=yQxGbfQRz8i~JX4F4m zbw1pFXImt_k^oOu5$|k{pD=y=gyxZ{nNq@Ul`xv2U7`}%&@hJQ+l)a-&9E_;maP#D zC)9R96ULt3M-YmEf2zx-(5*zn34dNJK~B;}WTq#tQ|MWuVKj>CN5jxC-3syCM0SZk zHf=AuJYd?Ms+#Vy-P^CWnRJjf84P%|gG2Jj3_Q~saQZvq!|}k3_|%S2=0WlU(ZO`^ z$Q;H69X{YP;o95EEn1;r>}JS6M~}hO6iqz})9I!9F=o8*LII{{@(3CEKjtDvK46wV zNaYxhi&bd&tuUEYVlO(rt=!9>6YorE*9E_P><13?wi$_aqiI*b`~1l`H98d3#rgz9^V9q|tNoE%thkWArawiNIhwpbY0a5-oC zshIa|igzL0RbpKk>QX3M=fij6Aop$h7UNssKE#PVZ9LVm!$ zz+OIk$e#5BHuM9|#yl8$Vdy>L&#})u@=Rt)oVp7*HQWvTNnrEOZZr0>>5U@O8}Z

O*#NeD;t%eDUmcc6#>UgdLx~cG7$J;M05C+l)Ot_d)@8hn%_IfV0PDDEY{4pO1KO zE&s(KDF*#gA_JnFv(T@jIi^F&4)R66n)uv=emk1@WI(?SO?;L|znc7a8&xn7b>O%O zI=%+|+AYVhTT7{eyDf2|xvGLSt*y87OBUSG^&@eH*;K)urlyI^y0^;@LFbT{Dp;J8 zxTZ{t$B6+mv^-S7bXg@&77Wjt;Im4Q%+M|o@5_jOrFBu!FEqAx^os^8FI6y9r%2Nz z`bA@xgDMzmQtFrJ7y7OM^cxQv#E&%dkn`!M5B-8oS318`s$g&*%GnpD3I_8?24rFM z8yCB?=og%#(#2&|1y6NzNmRk$`<2e$SXHpF%0}{hk-#cNIpG-LfEA$?^CENLsj~J{ zwtM?12DrC)8y)aRd=#o*dEf@(Duh%tZgo3IRkE9c%we^Mv>1X zy0tEuY1^K|N0FEiPV;aD@GgaZ)mwips^H$w|HME4zwXs)Vw;bCXZ*mJSivmnOFQrO zJbuM=SJSi<+J(t%Nbs_G- z3s{xn7s3;4Wcqb7Jml({XS1MgN7t=*c&>-KsY7#8{DS|-Ysg#in?B)ntPKYqH5bJ% zxEt&la!7>Y(HAL>2>cKpF046@{|v*PSbus^E0-^#x>LP&ZE#zPg1Z0JKlt^p z{p?n)Cbs#8`s=6P(FLYG85GBKkD-0V6};?S2$^eeG4zu34}C8>pI9RC!~W2_;1=wD zPV!ra`6H@_J(L)gvPLMy@Ip5#Z$#X;MI;aIHjJkH;W@nGodt)RX47tQ#Fn|j;g-{K z+c)Zh+l_Xs+spum+YP5J5;rU+lmk7n&e(l!aKpXTN^)-9Z6x_07J|bfO_FOZ1&6t* z*R6b0Mp!M~vfbQLMrfMbX&YJLFt=Q{+qo?qHtXEwt^86(&|Q@Y4paZW1Tv~{hrJ&8 zf!XIGfyRK_ksrkCVnaL(lkb;0qVZ3G+!o33cPIZcE zVb%hN|IZKoJ3qMlOsyui`OM*cbD6^|HoR#(V8xUfgJ4A-fdMd}t7SFB82BP+hRP9w zU17}-O5#3+HG`eQ?}-^N#+p;jQPCoBGelB&4XeVTN!f?nj|$k1>4#P4G8tIIJb>YEx}a&hUMtHI5w zVa|@5hhO!z|MG{oYBjOVH~rIjbVMwsmila#QQSo?vd{gxH;Nk zJ%1EN=1Ao9`1Y3{utR$7m?Y+X;EgWWCxZb1&O^rTJC@byw6d~evu?S!UwBUEmTBtw zv17WcGO=U2F>cR}>9R`Bj^SCGX2;Sl5&Fr-j+3e>rv!Wh$YPD`7$5Dt*fCV6fEUS* z@wUu?9Yak@{gNG{QCvSejt325JDQF>rNUw`z)I(riXBg#ePQevJP#R=h1qdj?9Q@d zaEi(eQbu+R&P%z7lCa|`)3~wh7y_C2`J#z+3X{Sy6+2FKihAp>g&qH%Kk=TA{Kman zO>FZ4!gPkpcxF129+!4AX1~8S@`F`8(qZz8}Yy#;9oM& z78Dsxh8Cx@i_`2RU@yEJT0WJF!C#!^3o4oO=bnud*f{S4L@U&t8Nn|^3|Pta;5T(> zPT&{90c<{R@C&vID_@JwnC{jbz%O_oJbCg@1b)#qtwd*>>b30P_x->8lYi-At5y@+ ze7pUPQ}6tw-7Yq*uyhVrGYt{ltS|8 z8wO*S1N()V6fh&%Z*mdKn#CkBubf#>+C_EZF^lU?4cbPqU$E&)=a-88PMv*m>{ogo zG9ZhyUn+KI*)KRn#v3V z4u0)R=f8QcRukKNhQO|42(zTa<(=QJnEpbbl%l^7%>ss6mi}TCi}V*NN1%0u{-*XR z^cRd4mLY_ToKy|MAihe`-&B=U^eLjh5U)^oW~IL}X242rpug&&IniGT2(bCw>92Iu zSovD$FWs#<&|mOBc=F_-i2kB;S`GbGdo4Tt{R;;_^uvR#T1{;8E%$WlV7XR?$HT%> z2cL+=Iy{-P>2MOA`@sS0od;gXUgE=X=qHILZ1L>{d@0gRY?SIZ>7*hOMmXYgJ@{=J z;{XJvuG?Y`sH2Tc1S0!l)nc2 zx(!$3HtB>D@%5Y{UB>RajZUXy<|_Ji4Wq7ia!VNDy0+bJXBGV#hHV={6E1W2$OQz? zdEkkq86`=MS$5BNIHK&cQOJXsW%n4n-)`HsZRZGn+v2=3W)l_{Bnsai{5p+}rHh-J zj{|OteC0dr)iED=qyBzx;D;hP-pSD7j>GTrLUQn|O@UvqOEj;{27bZ1sNfeG1KzMk z@QVg4FYpW1Dbz%Ye$m+F0Dhq+rG5#1(I~E8^cxS_Mu1nm z&|1LncYK{@e)(RlCbs$bU^<&HO-yHF-(=QWuBrWssV|1JDb25(Vgr6!mil4{i_{k? zN04=e`a)2M`xNR6!5n^1=yoycn`(}VPE+6OguaTNcZP)bCeL^{ zJFE(YNf11(0EWXFOW zk!zy6$u{iO;9juo*lKp%`-gg;|9)qyRukKNd;N9OFY1I|zChS3n^#f_f7~36ybJca z$1NU2Go`+7$wM|P$pdv$0kF5;t~W)pQR12jWQ3pT*BQIt=r!761vaTa%~j>wYBrCW zH>-RPb*!QM5XbdJ=YlOXM!198_wxve%Koi+D5=$u<1(YmkRcR`%uolFxU&8hYZNVus1GtXJIcmMWu_&2z$XN zD;H4~*eiX%a^4#Ydm)gCpD&tGr?@5@Q^DS;PSMdst_Ak~*dP1SFW(G%XZ%ta;K59V zFU?p9^pa`0TZl-opo<-rL@0?BTf=vPdp==XwLq9-ARECy~F~=OZ2n4IV5`8=Z^A z^g>>5#|a*i9+5*+OqvJHuGi~|ur&dX2>`Bl>$XV7kUs!!G#YK8HNHN@Z^!C%+B^dQ zHd=<(&9FS2>6(_=xD5cdO}lM5L~|Dcz`Vm74r!{DakvHmyIQL$WY{?ZV8_*sMl(0H zuVr<+;w3^h0NioAmZsen0Bf4j>RR~$U`^{fPCX+4Zkrv~Y2*Qbd9&5+^3nrfc-E!> zFxVxUUuFZqU|m!I42{A3eT@JZ4Om_P7^+h!gap87>~a9WP?J)>1i)w%*AIZ>LE8ub z3^rZq{89m6a39Lq7Y2aA^N;~q7y!q`?koTXr>Jys838c(WaT1C0)WByE9bqj02l(9 z`1ztab&7SuF%sL*E z<$N(E@rC#mXxXyV7volx_(J6bCezdxB0=1zP+y4P@OwhH3sPTsEmw*bL46?*!V_5) z^@Vr^8_7z2A!fizuBX1KLvy0O5D;MVd24;aQ7fac^3~nI#pXhN!T;dNlZPVei_U2! zX&%7FW5e00?`ZrVkKCFZm_cvc_x%+{6d3Vt73xRoghy6rR{5Kw?Vjyr`{!4i0 zObBd=&q^S0TYPSW!17-f2wWGR8f@_$&v38{$Jnl5waY@GVn5 zR1o+sr+k2CZ3+T|U7|T=MhGmeO9}$Z2OB0}>x95yz;c7Y@}EK?00M)t%L4+-nw0th z0)tU300PsXRSf#ClkNQgba91omWOndN+|OZSMsW>k^L{2ZD=4mvk5m0#%gsJ%@_lR+7b65STKsR}h#-Cf-oA?mRx! z%AOg|@7f{o@H;Qx`~Tdl)xm&S#XDhrz!}RQ5+Un5(KMlQPBznbHwPX(tqPrCcmbn(tfu?#b@v^f#GWBK! zf)6^H_Rc3>de^((IsEch@vT}-Z1b)6vo~Asf>(Z1UKUChadj2AN(u}pSPoM$EZD7! zPl7!Y2AK$gQ3v*1=oe3DLCo&`5G@gcCAl%E53MMj7eaaYD+ zP7#q2!qFO$c)5(I-*yX^2p{A=W7>(lkS#UgP z8^MCXrYoIaDnT%~59RC&69j|jAp?TbGs*R&1mv+yZh62ge~|jgKwRw33WC8YDqUPo zL9p=2%0-k$5G;JZa^4#&2!=o=e!fU zSvCJJ#IitTmj%KY!y*ud%9jAb5Xxl&!l|~31i}yz;WeyE84Q67^=!s`5D+|ICD#Mt z)S>YkVz4suR}X6G4T@0GrQW87w@uG74)@1`A)Ci!vA-5uQA`D(W`$ zQi_WL4~2(Io1d8fE3f~icEE^H-C*pMn&uWKC-Sx$o)Qo~eg9|1-d3$9w)rOf{>P?x1Q$twbywpG?3_t})noP1L0X&FntdB`T3k4Gh*r zR80~lXbfgw>r?}S0n1GdEUQy6gj55gvCD%1OS7reFV($G|KH&QE`^M$-moIT z*gGj*=k%ORJql+4MOgrL1vU2LTP5g*UZSDT^tUuwQTsJf(Uhy=N z?pWWB%s&0~IZ>GYKne!EZAQUl5bp|jpFbI=Mn|g%FqZ~q|9PAf#>T>Pc7SGH-65ZW zIr}6SnO$rg@`>ZioiI4jRFvM{9J@H%QRb%l3iis(Im4e=JVuexq zTCNl=LJM4>UmPA)eysjxh(@eJzg#-7#J^F`lpXzk<+uEoKiS`^)x;j37&wmAlxTM7bE}iXfH|G>xlQPhXekE zz3c^nH|j_JXy!t3=72vL#)mw&Nr{7#ek@?cI9R(hk-}c3vtq@#rXfCvI&-DNu=?qZ zbQpeW&3ce6DcoUaqeouoSpy#Kum|3Vvll5Xv^VO5u(`$9eXC`4tk&{$*p~m2PD%8= zi_&4PiO*7W*p>gNNHPxB(cy;P&>OkxgI&WkbR#!?u-2->;na#_EG1kcpo!5?!STG8`iuup++NbbT%MIYSz z-QV{&-}_9hCbs#6;hW|YhM7<}nYGfYaZkvx#mE@qqI}r4 zNz{0iA$1Suh^ zz)G$c4yO*yNjMB412!MO@r6^z7ryYvtXI6S2i^q3|HIo}x;Aj-$|$T{I1ElW7vV5? zC_H)cVRU8az7*e;pKutw05&}1MI-dI*g=CbQ#joI(LeSx|Nd63Cbs#u{p+V~`y+GL z@rK30<3}bt_Qb+%g&n=!CSaK>7H(N> zLoD=my=Yk1JBDFrz``AFXl8SHENr-D!xUoU%%WkZ?MV73U!yBnc@E&Cw3)`J*s0M*_=#`^yj5VHAM}Na*YXZ*;*v84Li) z9x`^{b{$R6jD>ZF>$k_kEvxHxI{9JYy2KgcH4HEd0=77YPU?I^jH|4wP`FY z?Gnv8vtePdE-Ds=#$ZaeM$s@Du)MG^RHv{BiG|VF<$#5uCZ&Ffh0!Rk9}CBW2B8v7 zM4nPC3^rZq{BmJo={}URFANKV=OF{KFcyxB-B~OQPEqONGGbxy$;w5P1Pg=jSI&E5 zu`mQO@$*Gf>J%1+V=641>J*6E;1*g77XHut-~YFN{a&pmw)yDbeRI*lOe$Q?Y5j_U zFUGQ}bQt1Tz(30}UyNUo`9kFglCEH1hzN0?A{~ZE4!@_s36awc(&1EdRI~{A3jq;c z!|LE~+_M=|MnK?zr+Gd3O&yvO`Gu$eo6np4g11(NVCCc&{A@1d7n~5DJh>?%zv!V> zLVm%}W5e0W@BePR_(RcFttPhl=KJ@}GT%i~--`Hh2U1c+=bRmxA+NVtXbVX-)4W(}<0?wWG>TZkkiuQ_G9Q|%C zdx{8*kgukQsAw;+O$_T(^Tmqxnvq}8-bLTNCBOJz{ep3KhxUT!iD?wfzvN@2W?`F3 z5*!!1v$PkSq5>Q%+Pl65gFW<83L`mel;QN*H-dw;d1DW{w znhkj6F~R{WdZ|s%@&Iug+(K)S^M2;X|J43JyH~4;Z9d?g&Lb(2!7MFrDW~%*X1o~2 zrj)#Plk2!B*Ro39j@z}n4k>w|aufz$QSutPshh+Y6(z6b*iD-xm?XztOv#&Sj*1qc z5{tyu!;m z`J{0$EZwl^@gOG^i+SbF6^VJ}^!(Oh-XHwnkH0h7s@23c-*|uBH17?}ArFcpzOs3R z`N9|M*_Tak6q()#^8bFEhaqP#`j>vVQMi|SrvOE7y(>P~1K+w#9<&PJ+iHu?O~AJ! zS0K#-d=2qg9{3(>;*)er0&Eve>wD4_AELKO`8o7f}zW&^%pT~y!;jlpDVjldTTSYE&vs#B-~0ADb6c>rHolTyC~zGxKJ4}9Z6+X&zb zHeKobQUPCZAIjMm2YjXHAp^2F@TFpR7WjfwRJyo~z!!Y7auFo~zTo?n^WIqC3xQ1h ze9>GwrRarYD&U*$6dAX{EwmQk`=9>6|K#4h=-W5WV+J#kFU?ppJ|9H#)yf@yUHQU^H9E#ENx^-^5^@L<5STWJ_a?RoK5@fli=XJV{?&vq+T}!uG zRu(<4(J^#Guda>Tnvv+lSV@ou|bcWs_adfs~5ZOL~KrN+C-(rStp zf}vfa*<&`m3)V%&yU-X+t=5Ql(SYTJccD6kF-W|N#x4iE3pFYAOT3Flas7BV9<+_X zyI|9m&My_-1^1zxePMVPJP#R=h4F4&?9Sp{aEeM7ml5xRPgX9XEO=M?e&xJ37VknJ z6F*-w@h%)w;oTJ8g}4oFp|#-MpZUK1(vfc$;BWQNiI}Qun~U08q+8_4aR*6$%SwYzb72K7|BgFM@0)ExpF3p*RV2@ zE9bVH;`QQ(40svcz^4UZ7tRJwUA8Z&Kue|z@ogAM%WDj3Fd!3!0 zJvd>~9zOW=-u5Qj^M3A|HUft9?ZGIEzHS11;X92yo=`>w;dCUg>9 zYOX=lHYtCNj@NCtmN;2hx-A)pIYmU`29dY6ZsrPl>xL^=#>)%zx{lq*ybhb&;BB$g z*zI(@uGKbeD?iZN(kxdD)ahg-a{`KW=y-JQJK;{UI2}7X4tLm#+;qHAA4R|?jNLc6 z(GoYt?RC8EdbcBQ?s9`(c-F*ZPzjxdSX$U6nnz{>y|SmCi2}=mqzooPBYiS9%^YAd7=uDt2c< zFE~Y|i^~Xl!6z#hQ4-J#zF#@-jRn0B$i&YV&8$;Q6OO4sZ>m!uZi8EBEui;z{q&#u zmfyTrtBGwsLHMRA&`T53nV7fCv-=g3V2o&$a2BIkU_r~0V2oms1ViOWm9CIrhzoI_ zLV_Wl!|w^_E=Gb=%~8=pNU#ix@ETS{f+2dL&do}KWdwnh+(3fWLvtd*5FTLjd6Qsp z+sY`coCJfz&4mPmH^P%Ae?=r1UDZlRFj#zSI6DdcnP2&Z|M@$&YBjOVx8u_}9Eh-n zVao7Hr{s9ycwk;0Fl*r37s6Bfk9gn?{Kvab4kW-7-z~fT&i?c7mq?Tk`2l-D0$zmz zA9HtTjvDoiV!Q%!7ejc(S|h-TTyrvr6tb8|c~g02b0xfX*Y3LJO@!BI8(kv{;pJWN zS)TAV<-bJVoDkYY2`_ak;M%1899%0hHKdCyM0mN=He1bH39qJg+g39-DR0Nn9W%3( zx87~GjoYW@rCM^z)IisijqrBrj_%|^c$1s7)KXr!4BQ4+#Cb$e_s;gx|*{Cv@jIR!J}7~z1Gne(Qn z=8fIi{`2c0yzlu3KlfLE?q01Xw)tdW`q#cl24=~4@9L~Qg)rVGd;#=AK^H=L^{s?0 z>U{W)?K@mX7jM(I&G8eakDmaRAq>=PHdEl%b&=aFOKmYSMQYn@k~H)RvV}ko(U5{{ zAwa|LiMuX_Y?HRAToJq$f*ibnRqKgDzPcQ9diubd;K`G}N$*?@p-rBd z?0EJUgMaeUw{F#HVw-P--#7i5&G-8QzU!F5MPYe%Uy$b@e-N*L+Shq>&OQ|g(QGW& z4S95KK9=8Y+Ujb`KovuB>rUNmD6-UqASNWY(QTLwz6z~wv(vO%0@d*WhqaKew%=ro zK*;iotXVCqW3`qixwdY1ZAHMGkk~~@F65~v;cZerUy|GFHCv6GbM6}L!)AU-8BUK5 z4Y6ihPdFDYRIO%kF&VQXf8gw}*SQ(k=j;Bzdt4pU*a;+{rYf~f_>=I2Bvyoh|E-J}|#(;u6Z6p_sT@EA{YEoE{ zB)Mo5*H3ceLE8wD3pQQp{8Euza39Lq7e;cy^N;~qnB>OA?k>rdPEqONGLl?yUdlz3 zgyc@0_r{W32xQ{ti)Pj-k_*RFBsbM5>MgVut?ti$iT&-HwYu-W79z~Vxn-T;ubB5@ zM5_oBFq#DjwJi0;C>E(NRE{`nLGTOl9F`$~i>PcYesDN3BhMeRBOjg)O?&PD+ZMMyLp+WLc)DG-i5&Ok!kg0yN;EZ!HMjY1wo9A9Ac7{ib|zibTYQG zrSSiyx(5G$dcH(^1~B7F-I^5vCjXQ4x}3{V&pM7LXWRJqJn;?fhsj^6iz@;=>W4}1 z(zG%)ai!jl*NEAkHRq(muFg-fG)`huov-3MktMDoz}Q(dzfSd5MSy2Kzv?Zt76SYy ze(~S?yT5&}RukKNj_`qb1Q>!LoUwD_s@{o0j-2FA0VRPgY5=%*`RPJ4b<-1&S8|_s)-qO=@5OeG0UQF4ge;1*g75dO-q{j+~_`piiaV(1+KfSL>Qx5B*akpY(fliBJNWNF~oQHJz?I(2yv=8Dp~{~hA;`Q zVO8lN3?uH@jJbRvoWRq(9uKDujb9u?%$rpo46y<>f1Mt98PPAHTkzq^5Ue~?1bE+E z)WYDJ@Z`yP(Uqa!QZf?dx2hYMe{49rTKGTuflvS1cWu>bVw-Q&XZ+5CEOya?VLFeg z_lXrQb_0JXmV#qPa$!0K3)8VHLstwhCQ3B2BKJ!Oh$~*ah=91_#SVL5j`|a`&)Gv$aCg4f-(w&C z==glhKKc={yk#n6meU)`q?T_Ycp3hrrcVjfRRU^;c8R8=*?2Jq>IyH0#$c|tMgehx zaujG=M_P*;*lq{y&Bj8i0;uhBfA!N}+^W^YHs7qz$S)CaKH3d! z@t@-IONiFl>+&R&{1UzMzzf++d^isMQJiAf7T;dLmm8O3SQ)Ki2(hNs>)H*9Vohr{ z#W9jy=1Pb)P1i-u*Qc1!v`$AHwIE(eQcP%?VaSU!gNqcV{ba};`8q$0%xDra%M8Nj zpq$RweND40Sq|6GTb>YWn&XHX0QV;4uOY;m=DJCdgw)R|A{52cF>henB>cHCP(XyI z@`uJEjc+W!ec*-ShsiP_!!aN5I3I%{tAs8)8%4a&gKSI!dh$>?!)!^0X&i2+D2{Kk zoR*8DyDC$XVY;N-CmE*8D!HNugcy2ACB)F!+6gf}r+F!gp*n@&Nsrd|QTT8DNh6j(FpOX9eT zA>gDHDpv&mO)hCwa^a+ZvdV>%bG)AXCdcI@6i$XHZWi>>ah}$Kb;I<}Ga^!`EyG>I!vL>5wn%%Zx<&kW{Y3q(w z{$vyItWBX|uuHc?!(d%hGz^Wwv}}#yVKiWQp<$>_;VKdhqp`~Y4MR;z{SpnMQCvS7 zjt30_E}F2&`L;hcZ7;e!VA`HgniDPSvfbOiFH6+b)?_f?5oyCHA20nKFMxb?M<`cS z^#d_sqk~80FfQnb_i~<}&Tk4fUAdN0p|OofKiog(8l zxP{h&hNGYOp`X*9snx_bA3%Kb0svxW3gS(H11o097ze8YV~ByX35+rJMS(F?K3iZ6 z(IoCu&@x1U_&o((i_zs&b5yhlzzo3@Uc;&wGsHa9xf!!kK-__qTu+))hvo#EA*jIS z^XARq?3Gbic~%N=)461&03U`YPhO6|Gdj4HuxIcS*l>3I{P+G=X#BaYT1{;8t^cf_ zjwpO`$Q^GoydwY_PNqW84?exOz0KIeb1xLBDTbW6-hi{mX2{G*1<62yMY~ISk!a1)<|# z!ea0(te&@Ry&H(Lga3PMYp#b*B;BcWthGgwp*TK;Gw>7WWit4oFxPoK2} zUIn37p24Dm&;@3&s30_Du&5w(#tar~htPlV5C8f9u=Px>Cbsz);<@V~G-8OGG4xZ7 z2-XjxVSWxMYS~N|6^QnOg9=3V@y&s{VBelcYX`j<=h~=1G?#J_(7HsIW1eQs-2`cy9z|DIFFdExZ-x7UeAU~#%2y&|>i+Y9 z#5Bh4H`?NJ1A;ciXB9f=78jqJbkJQ>d@|^ujh6Ui&_SD)VRVvCSspPZ7S9kN(LAzaHKo(pr!jz&b~MuwDcWhKo-|QQ?Wa%g9fLlba5$l(9$O> z7f~J^v|~ETd2g-`S_U%l^F<1=wB%PFQ|X}7ow9Bn^zZ!ai@jUxpe2B~89+b9a3FGpz`1!g{EV?L>7Zo@g$(UVehr8wai5}thA0rfCo%JaI%u^yDq4gN8iFaj zhL!1{Wz0jJn^gxb;|{Fk1|76|Xihq42r97o+;z~>*(;;44jr^(I{E0Jr4PfCCodPX zX>f3NSqJ@}-~XL=Zq`BHfS*I(jqV737N=6-=X~)q_Gtn5x!GuHB2NM(BTleqrGSn* zWqJIZX30tUIV@SM;a8>MK>aJ+ct?!kJJ~7?hv&MicW#dQ96RS!XsMs-G#p@;Xm(pE zpx;(jBCOJIn2}$l;TVOB{T?Mza)*~g%O8+}c{CYXJfOb@-spn3( zFB1Ay!Nx1~b2^W5d@qS)d5MRlTd3@5INtrtzxe8#@$(;;`}-HEgS{JRpyjDld7zKa zUOVaK2cVMyE+z+uYq+|jXnki9=oC)Pb&WvM317cPAf`B7evLp(z{-|gBM^SPbQ=Pl zN?WoRfu?LIu&iJ*4s)QjSR>GIG)-&gDu6cKrl~bqUIJ)K@3iY8hqv&3VhuxFx$wvz zI6LfhZU*+bT)|Me;DkVTj804BI=-C%y4C1ddN)4-wAN|2J6RJ!cipDjsaFE%SOA?Q z%22c)4DHhG2y~L(gMK&+je&k`jRI&iV0j6kr*dRS0W=!B90br)gj))r(I~E8038q7 zMhKw6rYjQ5QVF2JeJE#Nm;f3)4;he!1<-M^J1c+&r>Jys83oYbla-4oi2xdWzjEFi zD}aVTCVsw18kVBea7-nDPIb!K1<=3ew;r4~o~hNuHvbpc&o06su0zmIKOa~zgT_c$ z34<{T&c>iI`b7yeRE|2%D-vjkCvl%5frdB`zb73tLb~x}WJeQItYd-SgcB=_h})%_ zqoPGfpdp;XYgm;88loQR+>8=vh&-^8>m|^sLvxZqLs)^$=PiK-cdv}X$|ca?sB@7( zgBQb-CqG9wI=Z;KEP?)`zy67@`hl%lO>Fb+|A%g{|92!8G6noL}ZDo1Q&rSR&9w8JML2uuvg|0|+ z*|pFWi7ty4`X_(yH-2;bnOaS3^GU?>i;;*0Sadv{J)A`6esI8!&Bva@UYZ2_f<5b) zkG+dY@Ui~T^agvjKYVV74gKJpN1tcU&d4l@`}X^=e$sQ>BEO-{M^5UBo8Blgy%7%%*vFJamHW0I z@ZE@;Vr`~3co2I2=zuk}Mtx5+_O$Kii=feRsd@lm%POKP8ZGicS2UV5zBeeMD;hm7 zA9UGi^w<2}|K^n++N#yWHs1%_q==S3h$%WDG_vTY_*XZ@k!bAHA~z18}e-kBc zl9Qw2&=rRs?Xcd$zXFF_r{d7;MQ&Cc`hYdZPnbS_LR2}$i%fL0tjesNbRq6=J=uu??RkBce}T^0`gOMm=#{mAVV(UL(dK%t*v zK2U%nTF%ZZ2F(ZDjxuHCs2Fs`pfT%}Fxc1`OJ(IKJA*#>v+sQM&5G#vPQ8abHv>n! zmn)1szlbNGWPt9S2VTf}=3u~sg5OB4lNQrZ6q7ZhQ5T=<8F5n+pH(ay*wn@6rey8Lne=>TYgX zGkDvvI+?R(m~Gx@+&XJUN9#7bo&2(9wA+rs-Hgiy8ocegJP)lh?^@k%L)@g}fZJxo zogMb-n2)?sf4?{ILvPe)Cqs)n4tLlCbJU-hea;@5{cwlzz5X8i@JGkzWA@RHh?PWB z;jaXet67d#O4(At6P~pxMhtf8c8nOTi>R6=w$K>-=y{DN z%OPt9)TGoevu2=CTz}S#c+fT?YX;bKrSnUbH3Qs-a`uH~%>d6s24rEaa$M}rYL&q$ zDqUR0tQp{wm5V4z)(r6d%6V^W)(i+_;^&KgO`P)WaEx%k%CCx<7nuW3y#A#}?3C@^ zK8k^))!U4X1OAAQA{O~$HsFu=fbCJ;VTy)X(yXcXH1n1|xj0)NN`+`JIqdZWl^ zlKxtk%(QLK;iE_dNZ@-UW>Eeg=>s8$={?w(`i2+cHn@D(57?u+#%zB$HY3j(aItRu zkcUaG{p(RQH7#41`Vq$VJD+&zUGM(I9~}P3FW#%w#5P~2_D%B{!7MU-x99Jva5n!X z{xD`$^IJf?nvLdSoQnA^pmO|?{+0X|EmM4OpOW7KA~yVXVR94mPs=PwFG6*LO;>8V;uwjde%Uq^15F|ETfv z|Hf9WCbs#O`u(#k_0S)AcD=ppn88JnP#4cbCaP7~?#Ip1$h%;#d)(qdH1kI(Z^=W# zqJNCCX7sC$TQLM!v+8!^29r^81egYGBM30qbfxo4MS#J5C}&?70S3=Q24rCZ92X-zb;Ncv z1Q>k3a^4$DfFY2HpD&tk zr(h=>QxV{)PSMdsu7v=9{{P92aGRukKNuJFMdxxyR}T>3fxs&O#{xGFA&;1+<< zvI!_Ks3lx1D@XKn1s6k@i2D>=4B;JqPt12gT&y-nMT@}25GCO?tO^%HFhiZ25f?*1 zft6g3i&KZjkpe`$GKhfxg_r>Um={10n}lcqo6j2;gBMpuVdc0O{BJI}7@QNHJh?CG zHuPL8!NsC(o$iQhY4f$X_)q`j_kZDwTeX_l=9~2oTxZs0;)lDyi{)Bj6)+wNj>sK& zDIJ}2c4UUU-e!<)Noa)$7|W3>h8Pp4yf(kFia&E*X%9TmO~jbMZ_ghN`6vo^*xBfj z7m8Qx;SPJ?jW~PJ>z~VB^hSNiYS3bgNX^nK?GebPPDzOGqQp1_*_HCw5MyHZORTh4 z5o27quO}wu?AUW%b~Xxm5OGY4(qpV5#&=pXoM2rgreGg^j^FDtvPTeOJ zF)n+4W0+HugN~=%sZqvxccmFtHNyZ5AO=|rG5#OE_}6~nUwNih6We^WFul^!)d}iN z$hf@I{uMK03~`nC7QRm(DC3~P}YL*)p*t}x>i8&;TciX{{HU5pv0nxmo>Gv+e@ zF44yn2(Fm%xmY+MNOV?Sa0s^1rzHMWw+x%+-1>a(whQ;SIqdOcfGsw)|d6~ z-m2BaHs7$nZ<-l%9@*yw%ZueXT$L8Tzif6M&dtxB^UlC<&sE7sTed| zH?(@Qm1IsxM65~5;il2hbyCLWiiY*WmeD@B2@Q9S+Q;3a3}RxVXEYAG%cJ3=Awre| z>@c!XIBbWc2n4cECIA_M1-4H3BqT66GJl!XS<`=}yC$o9>Uy@LBKCDv{;ABW-|v^7 z{?0Gwpy8w5(b3V7C^DXh8AV)#9_UWj>sm_FNmz#m`k_KG@sZu}98^(E+%XK>ac?Rn zK5{k9qKfs4(I`ptZS*ENz3Af<^`4DVlF{ugvTfAM0z4vAvzy`oMBM(GW2)_YqxBl7vR*N393Br^=QXa2Or&HlZuI_8bz<%i4fmOo5 zu*9y0fh}x$HW3&YDxZ#l9p4UJp^cOtErRGG@bzorK3B6Fqlzl>~$D zxhV+-_o$8pn>7E2RgnaPb5lWrLlR=hebVT}!aUZ!N`k>IiG^l05)9TwCc)4ctio0( z66OX>6$yswBpks=FgJDzNHEkS)z3&UH;St#!NsI)2nnXE9%=9!MS{V7NWEVh2?oz2 z49LPHxF~jONiaA?X^5Lhg25+CH_;Fh48C9L_r{W72xN-)ODwKS&=an?Bf+IXfw&DG zp_P!}Z~E%!PyF-ytrk6ILxd@Re=IFd=b_-HE%0k*!91XqbPYV11sb%hB$x-WToMeG zbFOqn5?o@w5(|cKj+YTYcQF=RYEBgWl4Zdq@?Dh$mw@to7F@bi5eqKiTGcGL1e#aE zg2CS^VZj0`Gm)}zSAqp|PgP4A2{8CKX2D-(fA9-Ww^}WF%r@g6nj#7A$4R!nvY~!i~*mZqR4{u6<+dj5Dx__Y}EpVH-J`So9U}EaFse%9pu0=Gq|6!vE zFuZFM1Q_g+SYTEoz+hcu0t}78>T87rm>V!v1Q@E5Fa#sO+}J4~z)+J^KO?~0D6XCW z7n8OT1Q=|(H294oz~DZl-mi@SgXa+jWMKka6uY$q7@VRs#7!i?;FG1BXb1rY-!Juh za|tjDWQzAoEU8Pd6Rx=HdMRMEScQcVhI46TqALj(o7dRv-Yjp>m<@qSv-`hKl^Ro+o zH%JD1@}2Urk-p-0M^9)PLJtgG_l)+KX^sKoSn6vUhHr`t25LcXV42s0UdMBcN}$(s zJ=3d@^uhOh%ctck?;saip+Qmc5>j6(xu&A)C8WM#Xxe6=6!b=+>$g31pf?NxnsA}o z4svc3wCOJlPuPZ?ED!VA%pZzcU=n(h&pzbXL%K^QB^mlyR@9%Atz*m~JHOYKC?VipOher6KpHHQ~x}jT! z#<`?Y`m6U0&A2w@uYF`6Ia&pouh%`$4)o<^zMaEPudCgJ{&qXvqn;^H?m{x(p3$>= zJyB##;pfPFd!Es;)XIE&mfLl@%II(J=+L9&wHp2H9UUCG^zpb6{ngC__s~>Ff4fJP z?idwizK5ElciSrHZ_hk1T>5Y~TjmSz+64UtyCfEu)#xu+7n%M-W3cjCA^qhBOcniw z>LdgK^cRes3i``xlImylmm9^^)8As!HiG_wO_v70QS=wwht&JE(O>X9!hkGHe~V(b zmi~fMl!my8^cQ@xbQ2Aszu^0&es3)Og+Qiwzr<3z1UliGJNjE16o}j45n2iT{mMUh z|G@`dXtn4u8!1dl^dK!xX8>Tv9Gbn{ubC4Een3L4#EIKMo9H|V=(3zxCx&JeDS)AJ z&YZ4rVmq=UN1T&6afmf6{_I@9-o-d^sX0+}9h{hWMqmlnRu?BGmK!=kp;?s^lgRfx z!BXdQ;?kvxI5CNE}!r5@*iso=Os8XoUDfv6B8S* zc>k(%;>UmeKmE-0JHbu+Ne?*jnsWei&v7+J&>bm8QJM^x2KbPvnh~g)k#NRr-qwSP zkGe-%uRErqV?;R?3LhPG4=CPZ6RQ*zA9&9SbV8ox(l=S2ZKG}+MW{>qBqw~XJ%s3t^g8M?LWoDF8Ya9u*gpwjrpP+H`5~8-F1{OE=LFR1Cgf>i5Q?VhCi4_iHLDhHLInaS0VeR05CC zN>H)+SAJ^mD_&@|=rJ1=KbRsEmZ`#Yu`saWX0P~bhQ+341V&hb#Zee(gj2|6VR7UI zzF)v%sC+ss_Cw$B1r3v7vFQe`$Xg(Y?_#jH)SM`~9#~AHB!1s@!Q#jZNFX?GRahM1 z5Eo2xJ}fR>st6YAUTAn?pj3;BEswN`7@(EFV%_%r&{G1739(H)OH>Re>w(4a2H#jz z{J9@~?EK(Xt3{95W_=1Qz8K(P5{GM674u%85T{fnEB@Bx>Q!j?$Q9 zWRvnn$g{H^B&-{{t$Xv4uwfX!Au`@7MZ%_Q5{n8uNuLCHoD3xt3P{>O=z*=-Z7ZyR zgaa+m{0d2eBR6s*Cd>p$^%&_ciiD#e3L<+cB+QBgqR2u>IBK_bL+v(kQRG>4tGwf3 zPEJXhZKJ~^=@UHMMxA7s<#XFuZFMNEqyrSaDWE!eCuwBn*wg za%_c2m>V!vNEoV&k8T|4vR?a2?AuOPuWx+2GU3oSM zsC+v3g2Ow@a9#6U+~q^EYzM&0=%pe@Cz=8cV0Ltp%Ui)sg}**z|8Z8tE+_bU;E2@{jFAu z9KcD@Qh(yGzLk=90kc3q4IhXwk zguC?I(U7FFh60piQEUp+Dm!x12NTz-bO zm&$=PM{}sicZs~gzSg$r_G=2|z)@s`G@Si+HS+vvl7`tfdXgt8J|)}yB}mdjw|$)BejIS&cIONaPla&%2%#?(_6zUY z1p5WMB$k%d*e_TYnf(?-dGF;_vfnY5UC@M~m-jg7g8hO`m*`T%*e`V-Qt$8B?@o|}WSc*{#afU5JCE}|*<~xv zcXnfu75|-g#QBWnOe($o;1s1HZY29az5g2d|v|Lgkz! zUC9wqqP!CQEm2{Ca2KP$rRGG@b8w% z{rBJNk-=80MUUC$`@<9FJI3o3{Kf}YQwqfg=y(|Hq8A5A7)LP)=|*Wd#e+D5ea|*2 zX)vFj^-$k7rl0xLS7-m#L4Dhy**3%LsIOzwPX)!V@6ylmNgx9D-*`~Q)OJzDFQK5Z zK)B=bbEq#15sD%UDSkuOwQRNdfJK#;00JA^>s-Q zgkeR+ukX3U*Huto*S7=u!$QN8K)|~;L4Cn4iA7~K>I>FIroPY^EZSG7_~iynmEsqw zlh6aBzTDU;Q2atoQvHnja-+C<>RU|OMo?d{>C)ggiu!{4kb1v1>I-=Z^Z81_k0ac!XA>`2C6D zpZtk`e81JA$82oywKK87G~C<3C4J4%Hwc0f@r3{uVAHb1mj|w#_y&QXc~@{R#DSb= zNw^o{H~zg~wu|B3aa*F?I#@5nK>P;kQu;!u!W*f|dLdlkmCRTAmM$%R{e_s8{V)vw z3%~R7f6V$(Snz6y1$gtSSugl#X%=c{z2IGyuwHOIyz|02iDBb@sTS4?=AAcOUFrMB zUj5ep{N1fqiypI$_D7}}?e%JWQFzh-+l_Io3#1NZtN zv1lfR`66G}qn`@6mt&R%Rc~XFZ`-Ax+mCy_z`~lYROB0&2BEjE2=@l2tJCVL<@_~V z$8FzOmuV`XbhHG zE5yCrfT_a0P@Tja815Z2<(rCpCvY;uz1%3S9`_cLwh_1&Y`QeLjl#X)KBV5S4flfQ z5e8&o+*=g8wYV3YqBO)!#J%8?rJHC7?gig3^?PG+F9b5h`z2P?C9(yXVe9bV_$c-hwx*gadR>yob%@0DeBJyG z)&zgqe`9Uy7&?OfwM~=Un!2gilHb8}P1n4BN4LNZ>?-*kytW&;72vOL`39DfUX0=G zqWK*{FLZ+C;BOR0J`u8NX&z>zgmBq@X?9?1O5rc@0?k$jf1`*du&)Y#u^UD7{+_Vh zhS@ec7I_arL0sg&?a;)Ds2fKSIv!>u%|-g#4nhwCJFp^!`5inv@M(QV7elrSA?*gq z&k~xVx7g+m9e1;B^eVyBf@bh8_1Kg-Mii=mzkb`rbf3kB=XZd2jk+5tc191tE{U~e zHTVnGg;ou5G~$iH!fS=_mm4ru@E59+2n2(_+}J6AzfhA@KZC#AD6SsA6v z3Q0ydi1X+BNZaM>X&+}qbJ5PtQ=N~~9{U&lKFLL6bFV6vb{W`~{~d4RI6UFZg8XCK>{N!S_r3-dOk>u|TGHzr@n|iY=qT4t2oN5*x*A zvjS-hkI>G|qZn$f_g*-&+u-(B0)M~y&sqP* z@7`~<=rJ21Oo6`wAxwq8OH@(K zyNJQ92!bJg;FZh=!KF(TfnW#@c=M`3FgR^#7HS8<;BJ+GVDMMG^TJz+Hx^FT1A@Wc z^M)nYz?~9*6X^-@)q8S;>S)^gZ@l(_54Qj6fB3`Sztw8dW40BalH4~-@?=ET$AO`J z2?Kuz9-@<7^d!mYPG%3|fDALTk3NeY9iN~VlN1e-l%Nqw2XU6gm*ge%-IpnEt!Jw8DvuO2@^N5>C)sC)couXFP7yLRs} zxE*IGXM3_mai5^4IAgec=adXdigUVI7>y_LGlC9rDX&8@4*qj?`c=`>-FGu_tyoGT z`s#)xWo_;tp^k>!$Gbr?*pu&*E_vJbj`S73H?|hm=#F6vP+n7`pE}Yy*c$y@C-HSP z`l%rCrCIF*im;d5yDik{XNE3PB=tq$#GN$b_iU8%Mv!|5u zMv>Ta{lEs(vfvJ$UShI?a*l*9;y=I2X16Cyrmq)0a;X=)v2bCG_X-b~+6Jvmz#r;c? z@~;JiU5wwBni56Vz;9C`_*Y%*Hu8!QtqN{6AvC^*+7{O-LbgUEx~`hnYEi@=8#?T@ z!&=Rbl#tp$6Wtc>Mqt`Ni|S#tM$u$-K%0Ee7r)%zYPIMw+W>!PA|vm4O!pyN8=rlR zH80`WM{#y`j?v@Oi|1rG&deaOM|^&k#g8^gqYHDi9)+&hU9HPA5saDPSfOjQ>8B2M zYgty;vaVydwrSdC6@{*KKtIc~+itJh>)j|lL&xYCho%6r3$fdyqobpqEsBiiVGg_P zxNgVoC}p>%V|S>iSy6h1u6t(%wL1r$ zt_pVRXy%c5)Odw1ylWHe7VMH(8dg*2f_0JEEi?w}rWLYVZopKrTc}O~2#nowW2b=K zLQPWrjNNjhxO#S5Oxi}UTd?WU;5Ulhg8PtqzczLYo<|svh1qRU?AEedaEj6pH<8_f zPnK??A?y}>ztr!IWw#K>6z`WzrZ3WftOWO3 z2HgNo3GsF900&}Xgr5@77f#m0eI3n=OhKEgqu($8zNZf^w^}WF%(mZ?zrFR7VVDee z@(X```rL=C59s8=ztiYS^RXt@YqTR>lBA9qa_>`a%OtV^$-P2w4Z66<xIT(owY*N%MF++)(h21zyY!`fU#4+dZ8w% ze$eTHQCvOiEhcRvSTERgY497xdcl22yM z(Gb=PzF+G1#qy`@2cxD6hmm9XC5|DC`5(Oy_4~Q-SYoU&ohXTJ<>>c;G7Qbs=a4xVmiG1s<#l$u0}FrlVa5|0dBcgl*N(uH4)@ z(Jn+k{2uB;yAY&^!L6#^Wh+}=$$Ye1x>OO`g(!eGuNv)wca~?R}H@BnU7%BzaDTL2{9flkh%$`gHd^B{+{S z$$65FXqtgd()boLwjT7m-V_ZY`NRBO*ea)J5CxY_(NLszsJsiCsDbTHTO0ZfL(QY< z9p1)ijQu`Mf$*J=9&)_*2&d;4BlIvHp0gwfMb_Gfah7L1ZEct4f)rV6J;?2AYKA)W z>qmxWRYkw;$amUQpnD_qtLfOMJHe?#znT^r716KhXd1Ru$b3D`X&WqCbfeKPyeSjt z7wnQ)Syn^8U|nSND<>aVA^KfOiiU9`iDnE>TXn<_`Uq1_k0ac!XAhe#6iI$QQosg;t9mvsuE|&tVDEl)hgI>->7*Fl10D zvEl0Zcv+T24u(sq8F(rO4y?xc8>FNTg5@rhy`faOD7l8@4LlH%_#^LrKOUYJ|C^H( z_xZnu7xXXM`9HGf13wXG#MTMBK{Cv8Jj~w_xDMhK-biH%%wh&!$u$&MzElwfhJb)K zubKjbqn2i21r(UNSS1t~{15NE@K9pvxpS(80)vg`4ObWVe*SNN%dZT!S}l6aw%pSw zaGK(CvQ`SrdmvHZgFbnNhha+4EBG=_`f;%lo0Q~%Ui3`g+bjY+9;-DZ>D9Hit?A=@ zw9~}DhNcsmE0y6)l1kU07vIWg_TeN&S&s9I4EZ?CwoyMG5(E~R?SBv@eYzzT8sPLi zdkJL4IzkVu$nx9Hb>d$;uwC7#ApUi2w{7^#i+?@SCFYI9zd;Zf4qi_DizCJc0UD3z zVNRllz_1L#pI|fylD-!>jj>9D7m6G(j zuI>7U3IgmKmg|znCwhQ)ZGr%UT@nk-Y6KXpi%fu_F<5=AkN|T7rb_$^)kzqFiGR7V zQy~6@nxy&}0p><=^#r(>w2dIZVAG|+ZxjIr_aXIuZ3GxRk1!w$6X2rQ?Ipm>DM~}! zL;?&xS-Oda5Mc2AQolEr07D>CykBB{U4or(%^d+Q4GP3<@CdDh0KfCflh6La{Z@+} zvpK>v0xUSfbOJnHw~9o)OOYuW-$V9UNsa3-!08T?NAuJt`aB=E{S(uI4$v@bAMF}6b7@;8?Fw8KmLUu z{DvRcYPIMw+n7)8$Tq+^Nn^Z5VK8f70>WJq4e(HJZ_svZd=l29_0?@drx;AgTE~QO zoaRCA7@l!d2kA8&)1hfe=WBf(&2cMj$JX&WovyJw>Fsp8Mz=Q}lyRDdZPdXj$+xLU zHXhKQ8Z-9C^(oGiG=m|t5qi+Ix`#cH8AB>R1KZN=*l0@MBQeU-Jj^IUw`1#dtRq{k z*0*=yS#*OuMWpxWsMDc85>!j`;2w5u^TsKCU9EH2QJB)#^}1a;QPoJVesDkwzXtn2 zXWQsWo}~Dc(9P-kB*>Gr5M>{;-Kn`MyK{zzr$Uu|Bu#$9w_}5MZIbjdyCfEp)krT` z7n$@zW3b9vA?f7?Ocm*c>LlF2NG~^b3P>;1B-PJIFE@&-C%wg_Z3O8Bn=TE0qew5f z52^QSBfa2xgaKKY^cKZ#E$IcPC=GEFNiXPOM}1pckj1a^q36?CR0KRI53^_-qMA8%>XwDLn9<*fXgCPKsd_+ zTo$250^maB90pwhxDfO4a}vM}yda>;$g}>tSwUeJ1GuH;)(LP)U`2M_s$PQW!d47! zMSvRxqK5hOc6^;8bnE(|Z3=R%8r`~D;0JxCiR5iX3Qh$lmkGAxwSD&%A^ z>f@Zyr=CC9`STGe=&X)$vALY^Lgkb7pxe?@TOHk^UwyRqWUJMp$8767nS_U1=l)KJ z)AKcM+V%)ML7)AFDUo+?dyI2}-XN5bCBx0*xngG4#C6;BGe(%xxUQkmPc2;6qMz%y zu6aN|6%@ROdZ*L1m*={@9w1f$yO-y>qJ|}MI8@-eN1D@iT%`)$BggI79hF@7&_1ln zbvs7Sb-Ops;UGAyDh01Vvz54R$MN*ufeNmBbYvM$^V9djn=;9DnOzdg#)@2*Sr?h> zLSwKjUm@4!222&#h3X`@z_>0qb_%#I)Fjo7(eIOdn|DC`MWFb15qMrbk?|jDSVYPT5AmQV7}5kfaWX6|`@yD5 zgWo8w3+_Ye{W`hsp?xR}$TD0PirreS3rj*6HVc|f@X@xV`I541Tw|@ zC05iWTL#zMaoy6OK->n8{z|y+Kl$VT*Ejs5`>hr|W|M<&nv%nTv0Je|oyT`?`KrEV z*h`|QOnO=D3J7s&(hD&w&*Do8Vs!=cnwWkjF|V%&K`3@@6RdVI%sXyNlv{^LH)2a# zeq(isbR)+NY>~3HGUJT`-xiYSYcQ{TsUp%F7{ql&mRjYcmvdM4Yr$$rFUPYANN?bH zIuY-N@JoX9!pV9_ZxqoLIe&Jmlitt$um4s1(_5_;J!aeMZ(l{zJDuJ^@7iGBDT|$ zOzlUJi>r1 z0eg8dLGupLP9^^{{;42H!h-J?D?R=&=W*UAyKKGr&Tc$BBWawI@SS(WdDso41dG5a zN<-X4*b6>cx`~FsUhw@=zc&{4LLgJTUt&>RdQ{<>JJ?$q6o}j45n2iC{g%r=^?&}> z{Z@+}v*E!vUk?xFsCoOhd|_WR?gbfSiTFmCeyS1QARw3&$r(x-%PY_~2tp?mU`x{W z(h$xU+)2RO#h`DgIZ<>i+*f92^>JT2G=+e;I`{Q$UBKh(xUY0+5e-0O%K`=XU-0|< zAG3l40WiI`?^<;!d<_qWzDRnz67EZVtnVsO_&R~f#KH_(3l}AZ4Nlg>eFbd)Q501@U2We$=z;CnJ&*4Bl?(=CNVgh09$v;- z3>%a^q=|uFjZe=QMURK4kVwI#6t^P%^(?R3IUFPL<)yx&hMMW`ozxfhr0dWHHtNzp z2ss{RBrSHJ>(Hlwr(94)fA6He`v_m;30>8VXaF-j-A8RQxcB}&8ow}C%ho%^Nn`X3 zS)*rSsaRSJ!J9Hcf59$^64mH0SQnZ8LSwMgY^lZnU+9;| zTb+nAeb_9e^fuo~eTDxSkGf*|dnffBo@V3GjcB4t8aaY>U@K+ugpL=h_jc0@|2e;A zlu{d#KNpw5>RMD(Jl`3Cir>435J>M3_x+OT-B|j2C-o)y)xFrc$&}7a`SnKrd2c23 z_iKOe^KXCQeyc@~*$CmqMG(SV{(IY(_caq>&+@{+FA-qf(?f&jWLR4BOP9u>(ELK> zoF-i%z_w!(Pmm@x1h~|k2)NclfbW#Ql3$zhGqFIKcgo*cIUbs>{JrP>!OQVht3{95 z<{Qm6-I!k>7Wd?Cg1(_z5MS595FgGqR69iyj@Hpcj)A4U&|g5lIJe zmc^IkCG_2wF-AVlNZa1Yf-^E8*-n;RqyhQ#J%k?Nc$njONYZ`ui8Fx%-_7=dBqcjJ z!Gn7Uy-m_APKNtP*Yx(T=Iv_tUf#R6_wqf2K6UWsAH6D}-$d}L$A2O-@j1;^yYj4E<6Gg`JFrx^~+8ddsVc1HuJ4BJ^(lon@vi3$1 z@#zkE)w1?#8nGSwrh;Eh^Mg=f)?U5s*^yCE@M}8;_8k@39o*0+Hcd%QMkxuXoniT- zhw<=quhUO5x*uY1;FB;UA$o|1rx*B?pc8zWZ6mUKx{JQ;PNN|CS2-nB{O%k0vPk*{rdGV+DSR*rnR0aJy1p*o2> zFyzaPodUrx)Fjo<1;5NFt{(XoleQ7a7i_vT_>B_$g8Ptqzc#@ycphOuxD1C`Hn#o7 zQ$l4B`^ZoFp==?FVz*ZC3rM(GbBe_sQV+HI7QOESz+o{UhRT#`Q8(t|yprpbzH}ulZYm68X*ay8N?!;Cc%7;lq!>s0Hk{O^fZfHCM}PnRd^qlF8vNZSM#aT_@yOE@`|nssLlk*DlQ* zDK`1?=%#RYX?s%~z&3kaDE!HbBqw~Uy)M-T^BvXh()Oy*^3F=zt71DgW?f`#Q)GbM zdwG>wUT(ltfnBIhS{dJ^?Y&FeDBy}A7Y^lyR^dJ8P7P!@W=FGql{dH2|EcD(#>qdtQ9H8VOp;yP2?p6 z7?oAccUs=2Xn8;K*M`6Q_wTn_^q36^zHT-on1^(4=>ooHo;#7K_aSf6cz+=PzgI5*<W0F=f zAp7VM>jip)^+NIor*W9Yo21i~XJb7yw@oxlcgKpjsS@-kgf!xEVpA~(=zqflf#4|8O?nihJ*Q!3NN zSkthfOs4Bu7A8(*nXVQ1T6j~LuJ37@-&U8G*RnLtu9}zE^}M$4tB~oMp&h|P+Gv?B zyeSm9N?HfR?UGOdRm{x5tcy%@p)uf~E6mKm4VWsL3)Nkvxh@zx1u|WzNvfa8bh$}e zy-c^5G>DCafP@7rUwWAtz@|%s-zb?bxDToKYm@1M=Me^EVVQ1G?DooZnNyU8xQQ}d z@X69mG(@HgzF+G1#>#XdkSX3TA%!XtU%2K@rdt{mh}+;1T8T{e>~qH3zjVLVqQ`7j z@ZcI&FcsN$2-o=c zB0AzA=^AD3xGhm`9kN^qdH4;~CCi1#M2u`jSuR8eyps8{+|s40WVy`s^X7|RS|Kdv zKeWO>rv0=EXJ+$UaLLjv#QsHIt1K6ssS;T(cpBb$;fuzkny$I)k>!Fl=M7iqx&P`n z{?Gs5$yTdHkJ&bQ$}eu@SsWy=wbvSPF6{(>D~aYlIV1fr8KUn<&W2es+$gR)o|W}r z-N>b%F~J<;#4*+-F8$PjbwihauEV;%OFtE|FIX=9ERS^!mwv{BvOLz+UHTD>c3gf2 zqovsw+AjTwBI9|OQG{k+z`kjlx>Bqg2A*x%%CK(acvvGkL zI;`siI12QN*%v(9)@WLen{T&<+qP%g^dW6D)`fR%0_%cZ6062)SQo5|jCG+gSW>MJ z>v9983hP335?f#*U2g0YU|pz5s-Iz9ZWLFKb&E;c2&@Y>T^jsGVO?+^Qt#J>b;0up z1F|sIEsEV*tP4(28sa8mUGT}$O*91Sg7265y|Gvq0-56d5=-e4!Gvq>ux@EkAZ~+4 zXeC(p*FSaiKmEh|trk6IBZDb>wM&cB8C16c%lVq|E)QQNNdgaDf%Gg(czMXm2`^O6 znb8%<3qc@1CqZ5a-uU+d)-DElOU;R*>)^Z)1Mz#Pi}OOLA_li2=Y?>AS2CaTmM&Gq zc_9|y&8z0T;G?BksGakIcU8i9!S(RY3+E&_FZWBeq+bB@&Ks`IdH=}I{NR1E)oRgW zw$c7qCVz`df-}56z)M?~$ZqE>jWhHb8H}=Ih+aI)^U?m^UO>M+hc9=7Wbo1^5nnz+ z{&SX&x7a9b_uWk7<`sW9h3E?%l9c86-9dElvi-fi(>Oo7@aeei$$5o&CSvI;o=cdX zp!rlE7>9;_or2dgOq=F&Rlm2IZCbjiU59!d;%FAGfO>rwM>t#_^@dvD28^Ob_@XZ- z%H2jCoRWN-CNhWzbaR=Er8iA+o}~P5_HBe75RbIOP;lFYP;X=rLVQtVA=DfAw&pl$ zQLpa$G&ixTM7yRRxRn*WKJhKfzbWccy_-`<@Ea>-(PNvJ}~k zM!oQ^O`u+|OJXHi4fTR`kx?%+2Ft7!qF!#mRH0s|PT~y=^>SmU0QEvmQvD3|a-+C< z)LTs2Mxb7>>C)gg3-vPhA@zQJsF!&jVL%o~y`tEyMZMq@r6F!2>II)H-9$rBFZh0` z-y4g1A&@EFFR_{~Q%x4^+@apmpg`OPkI+g`?{DvZ!+&%A-fCYngBna#?ly8oUo-UO zfvgOD4WBNq0sAZqeR=T8p)XX<0n!!d3*jI?CqZ8bwvxx4e@)Z z4f?X6MGS6L=*t2JUdc7kSH4sc^o6K^H?JD{g144tp?2sCepU(e1t-KiFWi)XzT89A z0)4^I^M%8qlxq=&nxl8*s`wMvh~ZFZ=aRs{{R-p6MFoTJ&o9YOn3l)GQ|P!!Rj`&9xz_UNmq`qzK^ddlMbU3$MP}3% z9CuuPhGduRvF1f?WQiiRs6&;~L>?yna2q`# zI1SENqG0KUVg3&3{Mkg;>En^7bT4f>?`I^9>9&Qe!XmqHCkY8pE-bb+hgv$cmNtoq zLiB6fp+};s=$E){nsVXhD&HWmZKL^ntiiiBfqua*iIrtF^b6KSM!(P)EW1{Te!+k# zL%*y#i9ay(%Z;4^^b0jf^+WOo`u8CE8qjYsX&Zrl!KO=t-zfA8?nCPRI?-?B(1#eF z8d!`m1|#ojF}cT@$&1}u^b1Z=8sa9RU+~G&O*91kg7265y}9U@1v16^CDzm>$_dxp zq2JP=K->n8&`Qwn&-H)$x4(G5)uP92cJQ?`*}-)9E7q(B7x@{@ecp_9ea-ln2eUH% zg+LYn(6acK2e2Zm0}H@7O1g@FSxCswN%$8+IsUz1xQpT6Qgfo{I`A( zh{3Ine6LapT?w*j*?+cG626ka-7)<6{MT%okzEV_wXkcr*GhkFVn-BnF3o>k$8}wLb2vRO zLD;u460+bc%W-~@As?sNOF#@QN(@bGV{betV}83R{|%hL3zn1qx}hIpycGX+90&V> zQt7W}dOFQQph)^_MxJKVsjI|)ZOhg%O#*Tw{;TVDM3e14xfqR-G~Y&VlGBSmPEqgK zC|!8F8hASBR%~Wy`@UU~|2l0uz)G?_xPhZ#r}0@H;9Z;KzsxR)a4Su8eFSrk>_iN+7 z;CX}rS(yJ8#cnPC1*a$taTED3_+;rO8p40U_e=fWSpExvO!0n+MRf^v!ZmmNw=^ga zx4|Q{68`(z@ZUN97x!B&dd%hrADzVyrs3aaukCAwz&xTYL0}fm0)JW-0`n-ALtvHPJ+M?&++dC$z2Qrmzonr*8zbcEaLZ27X*grMGS652n-PfuVg+1E?ue! z0z-Jfn^z5i!EH;kP&)($hpPkvgE!)x7ye2>VD74F(Ex+R=M7iqz+d=FPyXZ2ZnawU zm~F?udeV+3X}C54@Z%&6B?gSsAdiDMAX$D9#>obycc8PdCdAt_OqyR|uEh7y)GfUh ziLYUHtlo7JU$bM`_CW>2+jYCW9!0fFBHo_W^NyrJSswBBI=!PKQ}Ehx`5Ag$D)DuX z4m*d3qR2uL-@_xjO$X*}oW>Xg&)@mzAv(cS4*LkF=NBWYfIep;TIrjN%A~t-6wxFV zBqv-C>ml@@tGSM&DMP%y!_J|5SQYUe7>7N#b5q3Yx*e@ce@9S+c-{6vyVI_Scn?jt zchFTK@wIwx`=HZ!#0&4*B;sXuNvt5NAzrX9GUA2CV0pDd#LEqsD#Q!bNt}TpUT*9Z zAYQ0Rs-GcVZWLFKc#BEf2*e9ET^jsGAzpAFQt#J>c){}s1F|sUEsEV*#0ySQ8sa7* zUhv7%O*91Yg7265y|IWF0-56d5=-V1&4g?25N~NvAZ~+4XeEgE@BWp~|E*uR-)hlg zHX8WIbTlv(@ZRQSd(HfoSj3C8GQTBs2@M2iS$=C8W?&J)Z=rI|g0ApeGq7xXN)Ct6 z4G9st1NJ=rNlx zOvAvJcm@Xk(qH}8Op^mEG{dk&la0U(ES@G{S(ck4_^bc<{J3f@ZyXJ35vd_)8y_ONFVk>Oc* zvGU1!_;G2}s`KN&@pHfQzyF!7R*N39t^4H0Z%IJ#aBTwM*J!?B-{GfOlh{OU`Oc7_5uTgrPB5(yx#Sa|5P|2}5-fn1JlRVC)ny zVW>%}pD|%>6j#rLi%HuECJZ)R8vI5vVQ?Q(@7KnJ!Se_MvM>`airrc!3{FuR;wCa- z@X69mG=&K>-!JuhW0^1nGR6BPR?{W?$t79$5M|IdkBqEa!H0c%99c5lS|S^yBrcAJPgrp#!`u)EJ#Kqqg_jr0qPTc9uH4ZJj@fs z7U=$Sgo7Xs$uOszWlP{e`hU(N1caD8!y9|=9zyWv`-sPF@CdDh3IE1_^gpz#Z2Sh) zV460#nJfCbF)v#*mM|{_u@yzbY-wCzURHS-^9pbU;UGUJL0<^t`1gX`E(m?)=0wqT zK;Jvju)vsc-Y2_^NWZfii%oFec}F}1wTgzpTk|JrHPDy&*=CD|VS&y^tvdAW{>AV8 zv)6C@HkrJgneR9ll4tpP(Qh0)CeLyS0H5XgRnhQek|x6#53}=FbbN>Qe200>9pI!J zlq*7-y!CM5_Mv`gm}3MwPE`Q<#x_Ef3wLYc!bjHOf?T*)K`VUV9CQy4mgmA9tz&h1 z<3Sm7-9@#+oo?6Y_LkzpBEJR5i^uaY10~a4;d&h_qG(WI%7`P+Yg>*oE_`&*aqY@l zVbAM09woXr$_i{99U6y*I<2s6dtRqgkqdV$&+J$#xbVT@mjoAvcWr_TgIyBK&Wc=^ zSr?fLLu0TeTQwJ^1Yyy{=5&z@D^V`>D6K5nLV(|ek23;Xm>W9et z3m22N5nLE-x-|HW;=zogGXp3T=@U~Q|F)lBQLaC^q8$C``ARv2x)CPn+|`e zEc#aujoZHN8yvPRs|~(`#!0&WfCO~;E8$AcQ2X)ly!hXoq`1%jHM|)3L|m0UANYwl zbIFq~?gq&)%keNTfNR7S#JrKJO5q3xZm~bue5G*dQbkH(&kGz+a9!0(VJq?tU#Os0 z0*!4iP(q9Y%QFL^G#3s`fOa@pk4#t*G5)m=eC6-|@K&oukJ*O(YbFi*knHs1)3Y`5 z;voUfCDGz89@0JI-iSyXi6j#HdwZvGesf=FK9ueyr z-78=zM67ul)_hT9JP&gaae&*pX(&a+p<_jwI_YrGc1`*-L$!1gmWJDAbW=pEwOx~L zucs=ju&Ft2q*p}5*w$@qszAh^YrAx48=g)A-n9ut40cJZK&v5Qur4wphQ?rdwn9YA z4VWrK4An`Tf=P$Du~UGEp(d$*hKRXQTsAruEQZ-PMC@1;du%n^qk(*dV59wXaJgVVRa|>lJ9QWm|zw)zC}Q zVC?(4AKioo`?enjSfJf8O`d^v=^k@|8w6poE!{#im}qw3s7)>$wmnQG+{eS5oRT!# zMu$n#CwRDxI{dfPY@6+5SLD&XvY*{sX&-(_I6&wDu>#GhoJhiR1H+-Yr*9@0wtYL$ z)zM(PjUy6Oq``shxS^6n5W9Sr{V8^zVr;9}A?f(C<4mj=ICG?=*$srPH6!Qgp>0a=&^ z7sYNZ4F;zu4RI4`F!*HYCK^J6!S_r3-dGw8flTp!iDh*Oe8M$%G`KV<5Vyf2v=SQp zL$410;CJq~TJ)HW52pMj@(}RB3>MtfrG3p1n8&j+1cq1^Fwn9Pn8&aj0z>5-C|!ZT z5Eb%s5(I{5j(;ym?qU$Q)SM`~4hRfE5xXs-g9YghcPLemo^q)4T6z+WT+3_JI%n(!Tk^dt0p*J(jZK7kPRy+*vOO zW_@57PJ+R&UYsVVOZxaMxyUjyjR&7yoF-v$#ok6y;qkn!hYV|)rs*`>!klgAbWPXH zgIdV2W@y&IwPaYcH0PiK89vkwwQhw}5?!sU9Z7>SCcBHKlIUqY?dWJJGJIqmS>qxL zk>R5wQ>S`nm8m2;ZdZ4ek>Mkw=TfD1MV+vB)OM(h{6=J0>m6xFnnE&cAF{cvwC&tc zTeCb{g--ZL(~RCxmmnxyb4P~DgTmrAc!X9$hQ9)555MAtR*N39 znZlG*663Y$bUOScvfi&56^B}=MYx2DS#VoXFU*2kEKo62&au-~R7}G}aZWSs5pw~%9r1FU8pz;+)#JL;8sM%kwIKXsI%vz;?kvxP_gAjZAWlP z)u>n_^iRm8S*RZs+rAd5LB$bUiSy12_a$&HoU8{GN1A33@$=4H(mWRx2cv)b^iOZK zTJ%`PtdH=Bq>#CHt+@CN+K*1sPtvQ%_&bszdPtHHPQz)q_}ygKhqEuSOo|~&hH`Bu zY}>XMrzA3d{P4BMrx(x3P#%PwUcO1p`N{*Z9`4)@=x086#*wC3Q61dbifG-}ap%y% z5p93z{1mkMutI(cSEHZtpe)awL&tTBA(P6_Q6y8J9%=$rFT|ZKmwuFTXF6oGXE?<{ z&a~K%aC&|*LZ7@ya*~0{x{J_*D58T@QIV`^G$D)%?rcS_<2HY5J9yV7xHH%#v8=7e zox!@u+!-2!HQx%kGdEzWxHD8I!4FU*gRxV7BeW9k{GEU1TR!~e3#}GCW&?_En)rj}E9=v#?D-BJXnK2B^LDj+ zFV_sPPgC-|M6V%425`2l(3ywEAatfR3%XiPbpeqkKPRDUh!FYrfYls4*S*V>`ga1|{aR%qcJ1^Xy z;MUyp)go~Q2f`b!&aIz+asMy;jjdLT9<$xTH_USj>&=5K`5w0Imn3$+BiG&6(c{-o zP_KJ@f=*sNeu9pUANEl9_|0DD$&JiLsv*zeOs4i9Ntug0fmY!u_+DHJq$^^_AXn@q!G|BVM_d2~%#Kjn(B zmEO4g9CS@VqfuAw@KpD=Vy z?-oZY&^6Q~)z8p1H;SuA*Ttl51iA*BE)9O8&^5RZsrPF`*Wh`C0a+Mb7sYNZx(25x z4RI6E^+XEphM?<-es3_krh!cHeu=eviPA!_bBC@c2E|<^y8g-EeEFwOUTC%GF`H3* z^Yx5kT2_raey}=tO(UTaye5PI!CIDF^T?Q|=rB!@YvT&JhCq`;GKpM6fXKfW1bQKI zEwv@et%F=cki~DHE^-aA5O1U^xrTUzS2CYmmo8OAt|8cv21c7n2kXl9ZqkNe6M3#h2tI^xc;+ zX8P*3y#xF;+sTrPG$5b8htMM&4|5z3NxF|daVAjWyV+ilq+};2cyJG)w@FG>j{7Bp ze{b*QdkB5%;LXR!k6+oZ8yK^BSPv)Gqc+j6;lyU!(2ZIo&L;f}8M-^#Tu$sbHgV`a zZp(6FH*{^L0$n!gvf&ZWzX>PyJ>T{PT3?J46Nh-=a$E3`$ZlI|lP*V|=eI3ooH!zZ z*>mxFZ zho^g;ev;AOWqJdjgdqvhLp(gaz^4SA;L~gyk=@f>^lcv>osH1Pzy03Jd-qCzUdWa; zVVsTn`1wBa`$=$4*Luk%Nuz%9bm!SV`zefmH=^;#@N^%w$>84m_ktuO%>T10ij&6Z z8L~#t#GE-;@>$LjQThy6DKm})smDhvBbqgJSYl=q)%8Z{hsuQf=!nOzfqhR+=tZrwQ*wb zJjGK3ODs0ha!NboCw-O`R#=Fl*sbNn;1s1HZXzcJpDf)(LpU+`eyQIZ%ZVY7Dc&!! zZZ6p}xQ04lY5j~KpQSX0M`-8fQ4F=#Y|%DK$t4-)C{ISHPcBIx?Q$}~BrCg+5))-X zG9nr6TAB<{pWt&EFvY_>L2N1RKSwwS;*bn;8Xy7Hpl5_7pR!<=t}5l1jFnKPORJ2-o=c zg1&O3cFop$rRGG@b%0xldiXum1#TfY5rbP%atr|iuVg;BEnTVz+=BP#&Cdh1%g|Wy zXoFXlWpAg%3#oW!&AJ%*ma0WnVMDk zAOFkN|M)#ytrk6Io9Pct`8hB9%mrB^#ih+l5cd`Ar!ncHqhy$qY-);&M{$;uG)^36 zvr<~{k@BB2*>It4-F-I`8e*}QMD*1TNy@ayJ7`Lp5E*CtOn|&2eMLi-y_Z2Tt0DA2 zciJ68N)|kpp~5w7gdVgt&CrcHPfFt63M9J=4z(wO(Kci1_kNoJSCyxm^6 z(`CtNBYe@9G3~+`l)JqHn%;H^Iq>1(!9lkxij3!BjvV;F({;s}EWEbsx}Gx3>uM&! zVO7lAvAwo=cvH;l=(ce{({wA!Wa0LlZpW^e$-=XYL$9kOlZ9vK^xbJV=7o1{67w>< zBvz5tFfUja8S_G8u*6y+=H&)V73PKNq;)c6PzGbC0P{jkQvHxY8I0oUF>f(x5HE?< z2wOXU>0w^5>C)gg3iE>dkb1v1%nP1J7?6cAZ&B>lVqS2H(hxTh^MX&7ZlWQW7kt0e z?~TR05XcnomsnSqh$dWfhj~kb0&yEWLMy?%|J}d#wZHH$?zdX>n9UD9I*T7nr@T#G z+t@D8*TbHNjpgaD@A`hAj|XL(%wbXb8~R~LmJ|6# z?7yYxZ>TwjX)8?z5ouUuGKk0zO`GbosVk+aJ9uv3!=xW>qbCHX!5KOs&+>@}?+~E} zp65rFeslWkdn!e~mQMRsmHv9J7X&Kkudlh9&5~_5TI37w+64UtyCfEu)#xu+7n%M- zW3cjCA^qhBOcniw>Ldig=r1>R3g|D?B-PL8FE@&-r@zIdZ3O)Vn=TE0qv$WV52^QS zqrc#JgaKKY{uaeCC~}i+|l3C zpg`OPkI+i!?>oPE_R-(I-)hlgHZ_>?N5E&{boATU6@AUvmxr>l{1?JlK!Hokf7#+# zU|*~=BiTWU@eT?h7sc!=LaUDy}G7BRRLu`h%Uyps9Y zw{)o@>~sm$@q5dEuxE?8{EpgMGo&^MgLmbHY8{RnXyuRZWy!YwTr@MXf4EK{L>XY3d8SK&C?zp?7 zv(ZL@Ul^t}=zeL^S1JJRa*69S^4kt|->OCT>k!?dHP0u%H0zL6CA|aoE#0t}C%;x? zIVMdXTv_)U=z$R|mj*bBqBaqHU7CkEy5A_$G&597ej{usOamN6k*1qf$*-mn$D%(B zt&se31Ez}nLUj^;VC0t@I|bwyYLe<_m$F+^9Td7IQbRDZY}u*rzj0^6Ui_5Wa%avLVm&bOa0zh z@(Y1X@qUQ~bqR99HFxCq%AnA=4IZJDklzn{)wh4u7w@-P^q36}J~AB~OjZ3hcTrz6 z`{luGiT!FE{VWT9dGyNjK0wVJB3%K$5D)Tm68MEUj(;!c?PB1!)SM`~4)6=%5Wk1o zz%Pqh#Nbv1zbta#m0SaUOXCc^Mh2rS8B2Ww`t3P< zNx|<%(Oxz_w-om38vWEE^EEX3xeoSP8vRs|`T83DEDw7_jec$ddx=IrLbE%T3C|$6 z4uf~}KT%{1-Deb`d%h80(_E|;_UfKt7|N17L~elFdR5qKIKE+eH-){LhOzIfOY)!* z3wvfo*y|f@;)W_gvex_+O?1gu&7T62cMTWi57%a3_2z$8!Qw4jWI*B+i*vpNb z0@w>RN%b?>%Z=jdVQ(>M8v%R4rb~n0EZEE3ht&J^!CvNh3K#{eFGgMF=kgWBZY}Hu zrzj0^6Jam-Wa%av0(-&tOa0zh*b9M7@qUR#bct)iHFvPLG$;_a!6UR1*!!zbKKHTT zy5DNiV>U0CBJ)i~(^+o=*YY((ULM3MfxJ9w<&YO@=A`Nh@ zgcn>79~R-91mWd=sTRTu=AAcO9rFJ8hky0+!>v|}9vo z>q+mRdwRfhuyaJdhG7_{SqJwu9kWgUM18)<*S0L1;?1SgJNPdBRN%fY{oIKAy7VI; z?qb~6r5{mbA?_Qwre!)xxo@bu#0r&hUlQTA?N{Z#o)tJYmFM0_YZKfT?2=ekRulPxbt!RQ_F}`DYlYmG8!%Pe7pjxs z18`q3b}G0pt4XRKxGxyRHE>@sX&b?P!KO=t-ze@2?nCPR+PE)x9$`Qh=DtO-Tg!dH zDM~}!MD7bdS-Odaa9{BKQolEs`?5f$c)!Hbx`a64nmg`W8Wf1z;1OC0_x+{c-}?{# zzx%BgJ!T_>Dam~SAxxF|iWRHa!L4b_`w|pUzt0;FYGn=#0WI*LW%a&1kQFGH#Y3Dd zT|vPR8uD{83T7c4|6cIi1yQivoG7{u6bz9OzlXX|Fa$7Sa4Vu<2qJhT^HFf=Qbi~j zA_U&NY7`8fTbhOX^}cMqt%e3Or^P!jTvkDY*~xlnFc^K_aCI8|qc6AeKe^Rv(POqL zpQOQ`xxoDxuZ;$Ok~J^U;5frLczTA1Su(swkyk*58QDjlMURe8(2Gfm21!cLh@^u! z%i>G&68i4T7$d$}Sr$;rob6=EMH-M#-$UpTj)yspha}xcpOE%4+Y6GE?BoOw?jiIx zNwYW^?jv2(+q;^#tMRSQ5c<@?n~#qlzp{_IucODWpP*j%_ynE2di(?(9Y5@$?(v(w z&dI~?Vq2=6oW&X4gl#}j6!!^wiZiyS{mv;Fk`&WFL1+8I=4V7~%?2GtFb(Sgy={$t z#!Pbz7{_^hO^beN0lmED`Jh)^wKV8;HTqc|^ma7*84t=B)GnIGSJbe?E^gv3p~!e1 z<_LUyM+f$St`zhh7>6$1e(rdflT(sr+vqS!`UDTRQ70K@IUeTOHu}y-57B{0;yzBQ z@Gu^pqqovNJURymJ?Pm7Mz>QH^txKd^XTsYHv+vKx8pjdI)SgHbq+e+ilDcr9URe| z)Hesc#lziffiJu%6QCFDl2}Jp1ij3<$eM0lh!;x8Cai;{8^O9<%AdBfMX%`5kM8EzK$FG*TLxDcuW#912QLWl|o7wYCT=nBDw3;DS*!97jMbN;1ZunXba zQd6SjI_NElu#JU0wk~>$4c{dKPFAM3Ha0?$4fYy(D_^RJ-nv@gc|tgoaZYjE&jOs~ z+1l{!n?)BSg!|@mJVb{$Cs~oRSMKU&rEM7B`Fh~4?$ghhV~(NX81Cwh?isbfT?3n% zWnHJ@wXkhEq=Je!G=nIhJJ8|uTq3mS#kVqw+LIJzInFOK!re}Cc;cgH(uFC8UQDEC)Rk(|- zK&M;0-3;zpZ7-t9Kb~BSMoF4)qc_RvMIWcA_iU7sjQ+5bZKGZm;1Qu2aZ?=R3~TcZ zU1Ycm zjltS{g>aV}Fja6Ds*?xqWmJnk~t9*$TTF`{fZV zm+wL#G#&mzOgI65c`R3j|CXCuCjf?!h~Gn902m?{F}M}wyAVC_O6CLL(xr+3FoXuY zdDQ?IT(&d|waa(G*(w3R;E8zWg|89-n7gT3k~x62=M7h9z<>BFKKzBttyYU3vu*ff z2A-7oBnZ~0-+dF>m+0@?G2M;`9VY3!xZuC1aej8;v%T6bX?+h1B1j5VwU*7D>y zYLkejVi1EeCclfyf`cFk#z}m~|gW>w@^4~d4Iin3q_V~Y;R&1Jz+ za?I?KSeRBM$IQCO5F*jhU$T3tW;R{BNxiL^cj-e*0enyVDQCvMaE+%aw z$nnJBH;NpC`;Z=;wUJ}+Ji>r1Opc3Ux0W2+%qdDk+(dE=K3TenhLB_M{ZhX-mK;MM zQ@medHC}?GaLpY#E)5FAZSV-KgdG1LKl5Mw*4_)P7CmNDhp(L^$DBG$(*>H*@D! z3vUJ=!5gm5o4;`OH~-Ba-)gn!G28Ng{iNkjvYk;pBs(E~I$WRZILUtY$Iu(`kf1Jp zO7ldBY(u?4+>bHpUJN7B&(XJK`1x7+OzfEQ)RmSweVf!(F@a~QI2>xO}sV#w{N9qL4>`q(#Z z!@LifC7&13@3K%lfB-PItGB=8=XUN5* zZ3IIGn=TE0qZl%{52^QSW60ongaKKYAs5ANEkg#UC=GEF88Y}}=_VS&kiqv${oYuH z41rAXeu))!375h(cMQ2SC=j>7BeW8ReDGfQkFL)l{NNgrFqI@Xc9mZ<5#~XyOoSnz z1uV2I5$1s`C&ExU2TWIpFocHuoCJj-q~qTUvbz`*E;T2Lt^*1~WW?{GE+`BEj2PUC zP#A&;UdenYT)I>d6ov?aH?JBBgXflJp>`+?K354828YBuFI<*@!rWWc0)@fo^MBdSGM z>=~AIt+3egER*FmNCpGK^4%T}FXJo*DeXfFpkIwo&-(G{Sso8hL6~YH^uTR9fk#tI zED42)7LrI(TQ3iVBP+5ZM-bj|`8iNH^g@TUMUgR_pHYOSq#yzDBTXq3CcYhcx-uvn z*+JWJszPCcJ?uF*g~A4LBVVDg*b9P)Zaa8%F${9ZXYq*SXGxfCkCQN?<8HQ%UL~0R z7{c>e^bmRwnAjnX3SqJD`JT`6rZhVx1$);fpfK1avF5A>g~7VWP#7A61=$LrFgIYT zpfFS?kqO8*48~3Y6o#6l`XMC+7{%2?;bPJ@0t$momj=I4P#D~Y)cdtTVemY{fGiA! zi(G=18>@Eg{OU;R*>wv-#8S#6l3kpL3BL=r36ow#zS27<8mo8NVg&{)V&8vpO;JKw) zs2vJ}&s742!6EU^3zsFJF!xrqKw&WYyy5Cl`161Cdw$@0DEyI`zwg}wk?@^9I2p`A z!Rw*GZLjU<67U?;M}VnqgbD>JOMIYI8Z6|n^LL#SI@_fwa8+qAIKG=mgCi}{3N`g& z6j(?-mq;%`bke3sQDu6GTSb9=Kk)I5DRA2{U7DmqQDWj-LV<}zKaH0L^MILJKOCH& zrpd)H+(+CliA82L3JlieHc(*rLjh$Jm{ljCh?Pi#xlz2Mz?VFk&o;->IT?)lI42V) zGSVkB3m09EiHnDLP!tSlZl5?AmLLJxbZK($DDb=4l&xaK;KzBN?6T$BJEd_fa4!6I z0BbRJ1q<_^68f9*KJt@(C|ii4*zKjj%qdC_NFymQ^U2ap+)-d*EaGq*y}U=CKmO#3 z6YL?MagITe>BUAFxd;<>5-QA}j|vl1*e)T7c@6Yu zS@z4r*G1Sb3kW%5lGyJJ1i`n5{jxPKzqdQ~3z5!lJpBLJI}`XQitLY%Km>zGSOrm5 zX}|+8$J|GBk(?6c5`usi^mNxGL*{b2ClC{x~r2+GBfF!VNB@Hd_H8ltGc?X`@L7+{>`g;6!ptUoH2t!Oo$6e zM;Xq36@Sf)LKpiDM@8})rG>p$heVm8lU`$vqW%K>G2TJHn#TsGF0*<5#M65Anz?Py zqp>`b34h`n@IfsMxWv~XMH-nk_&b@lfN>HPd=x{(Gf+URkNM{!EPoyA7f?t-rQ8MF zxSCpScsR-h!%@UVP&DY5B!43s!JXCU=ar1b7H5$p)T1DhillHXDxh=nIc^;956Qeg zgrcR~=z6LNoh6kB;V3GS5g*LwxHC``FGE$zS&Q~I>e2$x1Hfem#_)|)` z$_d=~3AJ2RWlb$tJEmqbS6wr(sc6xDsKF8J8`y~u=gNXC_1Bjc=OB^4Q z!$ox{grdBR7d>m8^{OM19oXx0<4xn5t-)U8##=fhzoHv&?d5^+y787m9tejUZ^=u3 zZEn12ouWy06U_r*b>ofdceV0y^t(8hu*HoxT0|R%I7P7J*T=i=5fkR;=2jG1v>%g+)1VGMH#(Q1VL*m{G77s$)or0(*(EGeGhS zH8J%ol3!vJGY@;!L4(+cs!o&{bU4Bbez~cXGZ(Xf)Xf!j{0$gpCvZw{ED%64oy(^e z_JU1kIzOjiFSrk;_1TmBDxQZLki=mxEwX%Z!rh%(PY7n+x;!G{apIx-udK61D=~Nfz#s zaFxJasGNYJX2M1fex2zw#^A=i*DxC>zl?c7v_y-KJ+ zDrra9%N}ZwuovP0a(biTF8F6=6w(fN!Lu48>{VP7X*_jI6u=Un#5g4IN91s9)foue z>}{Ur1$6eE)(xhesVQ#pHsS7dO+%g)^GqiEiEps~+zQ+ci2^Sv>IX^E89&7>i+(8* z;G0T0Zy+o*V7DA@L{VQLJiBO4se&ur0J0&cHTxQO|RKyAFkZ00!3Ck33Jm1ert zaHFR2wF)+?&6^JFYeROs!_pr1bvhk_1Lu%UHq(R0>bAM?#U+{Pfp>d6Zl+T-Y?~nBdb|F0024P=XU253ZVa33|qu7`B zl2O=~)|XPI2hoLdfEa;&dAG}EwdOqbg=Y=>8zy|Fc8Sg^Q`7i@b-`6bD9w?R!IUe5 z*q0bEqp&Yj$FK(l`x0Yk0QQBNnEDm$ON?UXu`isM-U{lR^;-^ ztYKfZB@n77s_|8e?YGz$oFdc3xrlvR+~qlfeOt7<(_&u;WK^q6XV*IH3&&sw%*?Vo zJNAXR4W8eOVBfFyU3%RweN86(iBA!@wkSetD&Jh5;p>pdJc>hrhA=1u3%5?Bq{D)O z^Hl~ikA6$=2cRB`e@INr1hizH4TmMmgGn4qcra8>*ithd43Qz($M9f?=*agJ>L$j6 zb*H06v%!PG^pa~}cyK&w8}Nr3$R!5+GK%s6@)s;iME;PPg5EIQqx@iq>|lR9M82Z$ z`-=r4fKv6f5H*mtwM~F^hZ;nHAtYeBhK00k5n&%mR!Hz9d;R298AMOK9E}BN&zu(v z%k=+IREOq7XkQ{F^P#Q-=^17e7Dr>=CUT-k6yHg56MbOl*f#%-37lOoiKQe=`B@4a zfPb|@s{)@x`ht2T{m%3-U$E=s#I3v&gr?#h^nzLy^!6Gu{kNHUCKLX|x7J6rwAM)W z7sdS9lk+0k&rPXeXm4lI?n38hN4aZpSX@{y+9twvTX}1G5N^54;jU;8;o2<@o1;7h zglo6)4iW#7JxPQsI`O7;iiThlMYu@$M`gHL`L+ zy1WjDVF(vF1re`gmm0$L_ypeJ>?p!@I7F`(uLEb0a@XPTIz(@Z%3a>9ACi=p0yST7wi(9A*P6M73;zxTsRp_pE8JWi2*YT;X-u`#8D6~F?I$ZT&Rhu zUqQIUC}tkvs)GhW5S>Q+K@l$4bf)uj3gLqLU|OFwgbSXB8jyq$u3BurMY!M;nJ&&n zgbO~IxriJ=xZwMlc6VBY3xSOKe9_6W4&lNvT?kj#DG;~8EtC<2d)ehf9(kp&$%H@g zp}5TOFHNgB#}T@JTEp)6ER;7>CstHgSg&M{CHVl+~Q zhC~DtMKG9)@i+q%`9_L)C0XTI%IvmT(QH6jL7BdihA>bz1^61Du0ljYJ2ypS zlC}}8?ofjeEx3Gg`nHg4GTfEk4&aKJQDFHmC9th9-qe9DI8j4Hy5M0*MI#N9!K~lZnC!=Wgs4de72Hn;+1#m7` z6q@U=Ls5|GmX?&rOGm7v+bqr=u2rn^q1`uATiK$;9 zyu>JGp75%J)+q=t*mS1zbBgeS`(Rq1HNp#?hZ>NC39njgza_lj6qzp0MZya{nYoA@ zA-v%GnRa(t!V7_n`h3yZwGL*&F#!aLF#Df_9f$%H@gDZiO4mi3k5^yLVGqv6b#`5sibWbtUJ^o6b!KeIla*+7<@J}3Ta2d;B5^-!QhHW zqu_N`>-#AsTwmOU6ZI8MmE9DNLw`usnK9drQKt%N(T+LmO0Eg8AChE zvbkMm7esV&3PIO&sqx_40ef5HdCX)U|m=m3@3w`SSD#O7%;g^Bp_u2 z7&`-KFx140?gTZ|;tQ-R5Z zKk;dBE17!f%(QhBoa>YPG&5nrC3;0s$AlrK1u&E>6Snerrc9YIR8A06b0(}rhh!gv zg*~F+7HApDb`w(w>rO|DW&;aDa73;xU04`m7}~ihVqu6QNF{A!VcnqyVPOao$mxy7 z!r;7_QAj%$2DfVn76zY08c)3z#lpm4r3DLv-6tnb9Sfhdd*YOZc_tJ7#JA?Hr18bp zJj;u;VV9vKG3^4w2`u5J4p?@`aFwUpQdO-%P>o1xWVoWD(q3sx2O0L5%U$L8r~b;K z#CYxU=I6I@+%QLl%k4@j6GXYA+<`AH$xIM7x5I)n5Ts6qDR56BnQsbYxT4x_vsM{O zhAXYEYW$|aATnH0T~=wu5^wBanbqFP!vV37n~eCVP|ww(IdY4EFXy;n&WbXdk|?A@ zYq;60o{BQ7ab(!$DJ!e+q)3LHRZfT75S_5w>9FA>8#$f{0-m)NWEkucop`23hQYe9 zWEf5cv$9N*VK88Zkzu7e22VgH2rzaAkYT8asb3+(#3*K-46B3IDabI`bf)ujiVTDM zU|OFwG7O%F8jys^uv%=tCBxtpnJ&&rGOYMy<|1;041@1y+TCf%Fa$E{^F`;_ItU8K zbdh0Qr$F2Ww@^mN@IMb1GYy^jw9uv86h#S)sK~WBB;%f1-ajh1W{2?)lq;Rx8CY99V zGDUFlol0^{`#THSCvfgy8v{_AQ(X(k;UBO#Y&2OeP94Gv4Rz6QEF^Nnr{M9%!I32M za!lg9d{ipr0{#%;WXm;bG%1t4Gz^I@~)?vn3BUBlDKhy3`OO+vzQJ=3? zsWKeXMU{0_8R9m$g)%~wU-eZ4Mi-b&_!FN(w4zW03ejqMVLD?ii^=ujXlZ981Zif{ zBrax|G{nR}rIKaRBo-z)ETHn%nKVR~WFNz%Au1%_Q?Q&Elh&P%7R?5ehTw`^L)!Gp z$`qP*Zi-AA;t*0v+e}(_s6k8`f(&wcqnR`~e`XZY&ZNO@8^WZ)r;)}}uSfOD#Nnky zuMB>JoH%v8vUHH?kga(p6aK{a2E$r1>2QFL7Wo2v6lGhsj9bE02`GpHCwILDw~_;sYocbg~e@kT9Zp{QC01* z8l2jq%IPe(mK%netL)_tOGT=v*;P^Dw&Tnv9YW0xYejjv*+2oat=v&%Nf9-d*_^gY zhY_f`(q*ggC{J!AiUeLpVj(vnfRY5NjMI>@#`A}VquR~ldUndoE zsJO0}JL%*|eS|xCRQ|}4d|lkE%#7#~%^a-JoX>I0GR>T_PIErT(M6d#3kv4X&sSG# zR;o~Uk|mqzyi_;yf@cla#YEK{u}ic>YN#2k3$7X>Y>u1^rg<4e&BTBig_@x{hIc5a znHW0*P&3rT)UTjsViYrvn&HIsR#2xZ%3TzW@Pc1%D&@?@ES`09Mcf&D)X#eZ_*WCt z#*HO6K6!~V)*ot6em9}M)*0)UWQn}hsYC%JBas_fLg=4@ko-lLO`(6Q%Of}6 zA(3}Sc)~^x4)H;?poq_df3-7@xkbUIGo7DPs2SV`)B3ETX7D`fT?4Zb7D6qy-=b!4icA;hB5DSo%v?l{pl0y>OuIWRYKA~YeZJ_VTW8DQ82orK zlWz{z6Jq+Xnk(w~&#RJ)QlwCi!Nw5bkusG1CWei5 zr=vx)fsK(5PkzZYqzfA(r_*btTJTh{F|vCd777X5#>Tos4Z_AQL2%n?st%*EvBN5O zy)=bKW~9tEuLD^O!N$DJX%p$ALp>OMXkll1u(9Z}2_BkXqZLP@c^kSq;XF2Kb(zic zC!W@`*JDo#^Ooe9O!yPuvbVBGsm30&r)SpuhECMng^KGDSI$ew;^ZVj(P%Tnl^sY- z(Iidi&>AGx5l=()$l!6>gT$2eCY}G7(&c3J$dp~vPSGH5qO0NQxH?llPBLQ`N3j^? z%Gx-@DdOh1E=WwFPeoWngz(gaBovjYaJK>{N$G;b`!OWeNG=mYbHpyuIcRE-n8fA` zfrFF51TBM*SmU<|nlOz|lBi!d&1?a26-ca+=)}yOb`F`>E2dgNXay1zqnLR}tPWbI z&?9$2VlvLMUk<1|z2*FjJ*rsQJwx}9sI(XEnl4C;uxK#K3o^pL7$a{>PLGB0awH01 zeWTrQ2fJh#nb_uzaSNv5pu*mw(%^~WhMk%tg+iw??r zHN+f;_hLls6MarZ(@iIah(*C>wfYQASs{4sUW;*wki8DK$DHyKd2WYCDcvz0v6bg7 z9xPTjXo)|;T9I;CsM#RXa$e5^( z7*3XXL<|PZC>=3W#|W_i5reTaKt~KUG4(5mm>9*(BVu*XAkd^!6a`rP@pQys)0xiC zDIGDm52p25(-DK`p#~&jM64FuZ*|1r6qzp0MIABtWac7rL`Mw1pJ{ie)e%D=qds3$ zg{8yDa7>quSl1~Kx4|ux5gqa0ZAbplv%qA+pZHMWnAQ=oIz5d~iSZ%1JK;|=DJJ19 z6Wfx|7Wi(m5@MJzQ&J3-$05Z^%t`jKq*w_P$@estN{kfiPDhJogA_xIM6MxS5@HBt zXy>Mwc>=--Qc2sSSa+yF5@LuI$m!Mhy%0x}*S+vZYcF_V54;D4|HHdp%5A}iGoz69 z%oE^!4UrIoYa)%O&Wm0d@mtJ~U*NYdX1J2KUn*ET+siK`|aQ+>TdWBa}H=SWFo$iAng|92SFJqI1#I^u#1kXY|ByGMK1kP*1FJ+yqUS zrs!);Puv3LLedG9NGE3Qv~x7q6SsiTH0cC>v6p#RtPUE4VRV+#1&bw_58+H1IHyJ# zUAjcmiYl2krbGkUKub+QZ#Y0@Z?OIV{YzPPhIFwq|04gVnKX)pFr07(-4pQ3D9Q(P zB%})#)8Dgby^epGO#4io1d`rmrAWp8P(6zJWhBl}`?wW7Vizn9)hP;SFb7nSMCM#N z6}t8#*!-35#3d)F>loT8pM}PZUGo2i;GE6ON7NxIYCd&GfuErn8C$5j7*~`!nh(> z-WlT=*{2lqN-`x~y3^63UAVX{VX=+@cj4j=3X8jNu_`R~o_zH5i}Fk+{E2VY2emZo z5nez+UXZevZ-TafkrR*SB?(2jvVc_22ZManujM8N6>+f;4wi&?ygTYIQ7@uM#(5b! zmBg6oy(}zxMnq%OAmJTB3dqPm#3Swycf3*wn=W~Vvl z)y43vwE)IompTTF!Md=(7*3XPU`z~{QR-r-j*+-2z?c|21JuP(6H~tejEPaqJTO)V zty2JFu<1I49M`ice-P zB1hE4;QN_&cUpBZ1TyOLMFmgOGNaF}PtvWX9m5NaLv&quoXv7~{Q+lNo~_ASZ6+?IVmb z-qEJa_=ffGNh|V9Cj5zS-CJ4iG!_h^sK5s!Sp&yf6Bu$lH;g!+9|PmLVTAuvOn|XJ z+^MjzIy~7C5?cg|+oI5=Hn=cvby|dUaA6y7b68#N35gwMyB9A7m!Jwy6B0Xo4zC@r zLYHLL375@@Fs@ErNbKdkPMq%oRKc1MIgTn=$vWZoIYdN@B*cZ0&0)dmKsvlo6Lgse z=f3dr7K_&~F6^`Ve0YE>usdZ$Zsp;CSjbIAd{n4cmXTsE7#dTKQwj^n>)<=eg&jQd zdIbZyu-oJHnN#G#)zxmZ+iXPEiE5{(yvmjHTo|6UmRwk|OLW?qnvfW*3(JM!WH2Yo zppcjtFvGa8VhSbh>Y ziQC{7$_N*JW67@%?dfYW;ZJ;W&`K&xb!yrw7}j>@#;iWg*q6kyI_#^&ut0v2)eDo@ zm0(|}oG_$jdSQqL$vy`ALKH{7r|g!{rgrqgy3^63*}%RK43TR{6ZR!jUfQ`Sa$krW zNF{A^U)`YwabE}u$mxydzTm8xQAj`cRotv0+}G#B6K>LY>ZK_6g`Mf)zCNeNi|8GZ zI`@rjoIWg)XENbWeCs{5klDrjK8j4`5BZy#BkwqGv1Qt!j)#cX`P~R-9!^iRGINcA+J`x z4K7@*{G&y*afnj{Czzg$=5o2JoGEhQvP!eL%n-eBMTOI8Q$+2NC=z%XiG|#R z2nzW_btM&nu(I+{RnUt>alcM50nb`XF09xkI_*r63oF)z<-%|>n3H9c3o8c9I4+E< zW8j3sg^95Egn=PJy@$ZlR2D;ijUw zFXk7RO!yO@EF9N9S!h)@{0ErzrUP;kx1kE$(1G;x1Zjo>DX5Tn8}Hzq$uniaBG?4G)+w5bI8ha{;1eyP zl}d`W@^Jt$&Q2kUq7SLUWvw6L6u~NFufyiW@@xaMQy|{uGK+>~rw}}%&1p|HJB8Va zcqd*3u|q0kyVd9Od5lvbn{7Pu`BGFNBi; z9D^M&llQT+XDx=f4Q`=~sE|Kcw)*zt3rr^biH{(x$sveV@$w%L52P74lkk_t%@Fzm zCr*|)laQAXXQ;e&;tW9~*~buP2>!_TlpH4popq<9MY92&A%-H?kS>WbggUfyQkuiFgP7YM#=L*$9JTbrHOus+LtvFPkf_alCaUwvSK-oXKDTt zvx_`)zG%2r33D9stc+`R&@%;|ZJ}o!M>SN=49==O^h^nIf?7aOeA*dioor%cO2lcW zXy`am^sJ-xO!+t*8KYmV}&pLI~066D0-v+i`XXcv5LOYy8D z%3biegNo-a_^iU`spXH_ugx==@F%|6KfHz6m-$d#IBSdO)#9@=nf6Cd7V1OcScAWi z^YRiBxo}9y4WS&zRU)ZD4oA3&(eNxJV1zo>FQAZwO1TTTaW%Ev@Nkq1hNFm!V41We z`5Vy)?yN>XuheF77D+-q3L>dU3df=XIwzmw#_|4;%=<$qTFQ;Cr-^lENhLx!ii%{! z2lF}Z3>208;ZP}OHCrvkW>2v>e`HC1$;f<;n_4z$e9ib%O1a7j-1rH#TvcUFEmu3H zW-?b@Gq#GWteI3*Q9E{eaeh9>)zd>M>5OZ0D60rnZ)z9eH@Ov!iNd zv(w}DU`c!|5(!7;LT(bOiv{>7S2ZURMG}7Wr9!Ss68H$hi6)}FAfu?3koojjSVj`O zh^XYaVK%$d!P`?*E4v&Hv&(CQTG?htR;+u@akVl$Yc15uV3#_EjKR9F$QVwRab!#k zm{DqFsE(1$Dae=@I|J0pP!m(Xf{ck#%sety2dz^eW3cH==jWDMS#cjs>$9g;Ry+?i zAc?D$X|erQtqe|)>Ec{eD}zsFE+R+N%HaE%c6VB}G6XW}^F;++I=~Lcbg7kfodR(i z+(H>qD}R6O{B=L}HJR`yK06o`haI$rhI4sdpJo6|!dVsoLnxaX045i`&n zLb8tmz!1!l?m82k`vJoQvmdQ6;DTBOHd>&b~*dB+Id*RJ$< z-Y|4eQ=Z9$Kk+U2z?K#qg+vt18vcdTGyL~dUI=@`TrKZK(GZG;A(MqvT0&A;lnCKq z$t>ldXiO?0&2RJvJJVWvYOi^l6gaLf2Uk2x;>vjmS)81Vf{_3(BMv|2c!)87F5>EC znd!}9+?y=(#?0N~EMmSQoEz`J91*|rb6eZVU14+MEgdx2?#5etG}tcSEd?6vb>l60 z8mxd>q#^R;X)to*Eh!r8Lp~o)iI9YV*k`vXnB2hJ6{6sAI-G{lV4qL0+P$gft`Iz; z*&%e42D@wm@?n*_K{VKF6A?-^cZF#4dfYA}XfSVadhE)3oSa@k51zG_G+41qbh4S6 zfEcU`OM~HLFcZt5fS4FCqi8Tx#~=xX1`}gv01bwknEDkOOpIdYX|OtIoq`5~O=mhk zr)V&^52p25qru>Lr~yfs2CK#PTN(^bk?G=Gq`}~mnTyB~8VtUlX?Lfk!4Sx(&ljCz z>%b=*(?x@IodR(i+(H?l!7tr+-z^6gm`wN+pC$Y`9!qEq2dgvIvY1>Sj+W-`JU`8F z7$Kx5!%A2ScqmzEFbQV~8Ab>Z%G6934ACLk$6#TI>d5z$?IwnWwR6#O*hmNbJKkMnFWm{?gck2?(o zBT_h|W;+(@qkgFYzQky=Q!!!Ph-FDBEaFYWpjuJ`;Kvp$jr8Cx9c)-xWELl`Z8NX2 zNBNfu8@790UYwtpk2WxXmm59>%hYjTCds@UlQ=IQl}5k?J2-Bbp#0N1B?UHY#v28_ zTKP7TOJFjbEE~4ETrS>FrLfQAu{c~tvSGpLOqC6LJc8iC8HqcT*VyUA!)Y8Fb~^V* z#V*mQXKHL1tP9JA;bbr`%OD#j2Fxfn4An7!0@yGZJ0sYzQWH}@Kk?b{G3^0`));Y)PxjLch6O>; zgJC761wfQ67$&hS0mFho(O)w#?D0^!D@%oyc#eQ6N_P{Z!rF;wxvWrOB_<*lkS;0= zp$j=l%2ZgO0I(e-tR80&5B3Oj;EjgCPW4{Ph(Ors5e&h=0LSoRo;dmV0<#b+4qMZDLACFiLnhHzQj0xsP#+-pM~j|XQTF-Qt*x4JAmN)h+E zJq{1f7}AA%!vU-zAF40BL$FEMro z;9jVSsb9gp#3*K73ak!Vr@*~n)0xiCE!?ZP52p25!@b~nr~yeB_o~JATigpyk?G=G z#J%8?nTyB~+zY;+X?Lf^y%5N#&ljCj>&PY?(}jC=osx0fyYkuakL@RhI66K)Xbbe_ z+|)kJh!=tt9p&};NM43y5if~f3F3vCDUJ*WgD50Z6(dB1WFG^1A(A8CQ(&7I=+&K$ z7R?6hg@A}$L)uuc61ULKO;G_1u>+~3ZQQFn)F9#ufdM(a(a;whHZuxoR{(>nH3a>F zA0myXo=Saolo|Pc4S?5|e>9;n&t$@%qyX@2e|DFjt0fI!yhJ76=oh&$d{l0p76K9( z@KM?8mphf}SL>uKklCsTio(*=N=bqbE#;1Wwi&SQP=gpS#0KQ_Ml)dW z*~}=UodJWlHG~0!D}b=b;89 zVG67k+ixi_I7Oz5bCCjrPi8J6S17RJ`r)jc_tJ7#JAur z69KDyF}q@5)lDb@$1Vs=7I~9|dK5$&1XczqI~15IP-)(S)+n$d7q+H@0t`0Y z5SaL=v_N1m_2k5#~8}NZGUgI^!0sN%A+M5!_jgexCF460$gpfSpQ3 zQaBbB&^h@WH;(s*WZoY_(Nb=7y}zzr!Kt&P5+NK#MKa=p`5bo!ic0=)sFbsst(Ic5 zr`Vi7vLwG`WIo4DEt@pHX8b9oT;&9A{DfMrs-`cZEA-aq4-4yA;)W!pz7DU;g;NYu@~uJIM5Vqqo6Tx-Q(~)?k3(!R z;~!Uy})c;xmFj$72Mo!CiI6N|Qb8ck}l&!(0-zvM?7S zRvZ6v`&Xb9JYqMYF+kA@m{FkS=DC)%-4}WC?zHDEEV8Pb~V7d;k5c_ zOvTdY#lkW@DvIjRoCqnR=dkcrne1Xww(b=))ZhH&Xj{w{tezpvRyTsw?@%^OTuxe; zExiT>U#HG&7w+7CTXmkvgg^1^@z56bc(y+zhG$Df7IT)RyHlYdoWn}#(t#;7ItMGm|XaB1x7ZXUd~$9l;!^2rN& zc`x3QXT2^b-n359SZ$)L*KWaEQmof3;Efj1#vu+KR#ta&n0I4MNOSg(!uI7QL8v<_yoO-b3266gJSU?EhxnjcP(%TQe-WTV0btXa&d({<3+{tyeb!hncphp%5@x+>vHh0yf>UI= zI2Tzj_+;iHa)kAQ?`PWGX<07>GV1e1=iEA52FG-EUHHR}7vnD?id43ij_CBqQk0xe9I43oH)kYT8t!b|9)3{^Sq`sQdVC24Cm^d87TH$6{AGG1h4j`sjlImVH zFsT7zg(3UW0f-$oytN02!7Zf#h`k=XB@c)xk*1xJJRlZ*c%!seD<6mUDyzQ{RG-A^ zZ^&hLJDi3BVsKK10bfp!cKJ1uw}UE=_;&FgZfobkbHH=8}k5I{`md5!~O zc-C3~Vz5he{+Sve2J6BCViv7t5D*gsW)vWX>KIC)0Agb73;@JX6H~teh>20mJRnvF zty2JEu<1sTlp(*=liox;B0$p|1m(0B9?rUH`* zf8vvbmRTdUscAcCI5%hcX@unylcL>S^ZLZm3x zO^gU@=c47ZfrB9?A{US@9IV5$sp4QAQ*Ijv>kc&v2P?4w=_sRdF!*d{6w;1^!P^>w zgTWP%#y7{o#80IM2P@Nba^lo+@c$h#sd09m$%H@gjd*+ovB$BWD2P3dE(LL7IU=b4 zr9+n;KaCrge%2coS6+TY0=C z1&GbcKUzc^hd4|bD~NeFE@LPl#&-k0bb}U#t1xnAT?v5QFET1|(rXtQOmE z0Wmm5ri*hC5Q9%|>BIM0n(T zihdJA#=6tdqS>Iv5GavrNEbDRc!qXviXvi&DM%%4Q)Ats22o=O7|7|3rpDmNnNdhP zH3k=K2sH-(L>f;$7!?r{=am*}3_gIIICW~g?w;C_7w4Hw_!FNR#}^TM99b6;dmOp> zdNGsPgf&u}9Y&0wIE>+_URGn1nuyp^fwy!pVw)Rp?J;6-OBrOugz2cAk~||8t$3rr zS1TU}_$ne|LhF+d5o1V*fv$mBCcsG<#)!ekrpkyZ2JM)L7}tVdgBZn#ai8P*Qewn- z$Z+9~Gh%T4_$G}+k$^Ln7jhFKDC7^-l~e@6l0Q_(RRz6B6p_e{&Kn2|4S1dxZbVUEAUwNhPO0)541X8F zaZISLl(V2<{``FWTPTI(DOIRDZIL;gBQl3hD0NdNc-C-TObE>pyF^Q*#)!eX;Hs%a zkfo~`WW>aP8O4a9ItEl^gb@>?n0ZF54qB&R#9-5z!ObZ~+yb#?jS++Ap#~&jMywXw zZy7N-Mdk*{MMexhnYoA@VZ`A3nRa(tMhtA@vJ#^tgd<48O~b$L3?RM%2TcBu z9OjfsySIts1;H<(kcspZHL?C~m?ayr^1{5Dv*vUXu3{Rq+^q zT|HMp+SDa5PEKIl%7A8vBV#+(uGZL%w{&o1(T=zFII@z)7YkM)6_ZrR)r1=TlHVJ^ zYn_ethmdkJDyt6qLv;Ya?Hottcge3zmm^wZMQXfXYmMDz+{RQnvYC|b7)QpnxUpi{ zpq1(Hix*s9N*oz?2QJ)kjttR4&U0jV)>?36uuF8Bni@w2>%wwmI2p|0GRTpM0W*pt zLv;+y$OuO!MltgoSsk=a!I8nHGlQE`92urXOzX48k-_s&1ClUDR*UVo92uM<)5W>S zk-;Z37m*_z8GJv}?oP{*A&^m@FFGmLab!5AizDkg1>!cig)+jC_s-ZncxZvigg^1& zgC!~W&{pE&KMWX1GifG~FC(8IQ7?e2WMMOjcH37VOa4G3iV`|z3~PoArBMbsP)_#3I#yG_u{9%u|^u8Sf>yU1Y3EF(U^bbh)CbBJ$jG6FB- znP7m926beF0K>lYz-1lpPaQ5_dBlqUTbO4u;ZJ<~etcr~J?r9Qo%hJiH+Mv?~Pmz$Q#Bq|$%Q1=b@=<97AZQ22QS{RhNixD)4oZ?K z`!y(S1-RW*Q8J~a9Ye{umOrE<8PC*m9wh@8ZGn=(F4384YACs-B$x^^53b5jJzdivZZI@TYm zh6@nHq`LYYgbbvc493UAl`~_IZh}mlun`cMcqr2NW)zvauXJdXS)QLdMBY4U@3{6M za{Oe+q5VacJifL|i=3PmnGRicsIgD^rvcK|5?LS~Z)p)AJMfk^0WxpKTk_Nx&wa5< zlxFwP5>X_Y?AUI`TT;}R^7|wbS%6s0&_ovacEBvsAZkn@bgIdY0gQHx8iUyB4<|r2 zn_;AKJdp)FYb~fT*d;nCO^q6Zb-`8BL>6!|fE5{}#u{)ngc_?Dm5L;R8iTPjf*LC| zF-S+D#?W_JpvLN;bqZ<>Hl6AGoTA3yKA6^LjT+;-#*AB%95q&p(PwMFqsAE23LrraM~nPoAtYsJzC%G4arP-6F*&U?fIfJ?pBWJqQ<&Tfw&D!WJaj*Ex$JP z?MSj?Izep{80Yr9KfSEDE{d9Tq}b>40jNq^WUS1WiO3jNOL&)_6YHQZqcDcJjufG= zmjKB~EF{P=UiODWMx zcWH~kc_x~;LcNPpXTq2Mes_tOXENbW{I`AaQyGV{uO=Q}o150nzHk6%JmrFXw1EnAtsFPZq5Nx)02B6*C_d3r zQ1BMKB~O3}u~9oEc>=6kA&@EGRw`rVABD!+IK(M}m%GCV5aU_{QyIey*f0VNL?Bh& zFom2QCBV29#u8v$UrH$`@Q~rc9Zx|4B%n(-91bZHEbW(kMU?k~bzuoG%T6;$fQbP! zDg^~p$6z)fz+mi*AizpZO#NND;XnY%l!s7-3H@88D9v}MPzUfzePEVU6yk$wK@kNI zo^t5`0oZh=^K*&-gZp4wpEUvuo+oJntQOmk2{67zm@dxE6co6lnTyB~-7t=~bnWiE zx?v@dQJ=3?2{0VfMSyh%o_&Lp5dwVSlRbrwq%sb*$9{8jmY-hgYotQh;h@l0$9DDD zmw~h_^i@K+RG_c!R9VEnQ6!S)rzxcb3u04*zSz)_Mz+a(nd6K>zQZ)qXfW{|W~Of` zlzvaU7T9d|86yP7^(c`x^++_Eu+Qw^`X$NVh(>T{HTro)=U{ObNkTmeBB@9U$D#r{C!gcS@&1s^`$H&N%8kZJ z7?douv!oIs97RPk;)D4dcLs_|{&1+2vzo1zVzZ~%jF%=*Ry~+nHfem#_)|)`$_d=~ z3AJ2RWlb$tJEmqbS6wr(sc6xDsKF8J8`z21sE#Q3q0ODrzQle5{t%tl# zxC$*{Zt*OME9WI-adLDP$>9fCL{a6WMI7zDI=@^W^Wv^6VJ{R*KrBur0R_2sa&d|_ z#LRKStTqd>xHXokfkimR!g0fFW~UXhJZFv_Y*T9fZmPOlCc1a5S)q0E}Y5nk}iO{JW<*u^y1 z%@uY0t(VqpZw3J`*mUMvatiQ*`(Rq1HNXp=hZ>NC6GN!Q_FKRUPLb*2Tm-z}lbMUi z5x@(+pJ{ie1-uZ*sLvOjPU~1E9Mc7O^_`-`ZEy=^1n{nV^7w-9`kGAm6Q3O%9iJVv znhQdkwU))?`f#)~7v}Zpg}OABWdd0;zXs-%te}^~uOw?Qgh7N}>ESMk2+2N%??NO; zzNdjxLZV*%>1fd`=z2*&M6MxCke9?Qv~vTzBoRrclDUcWSd0G`D@W1{5+rsYm9$NI zA>I;5|G@g1Y3Vw-`N=Nz!GDjyT zPF?K#c*7I;${=~Q7Eyccb@U2uN#-xU<@!x3`VG(haF{yzez*PZ>=S~TSB!4&> zo-H-_H4Myv%sPAk>P#qD8?Wr-d$78#l!EY4?SK7^XiYbj%``R21M`e33*y(nb zxhyHDeO*;HC=4$1l$DiLB?W`atIDe@th9(W4sF2Ta;wGd z_81C-U2bP(g~KoyY`3|sZg;9MxU$-8#;Wj+s(s7M4?)U@+9g z)UUu`ViYqEgVjOn6fhVJ1k?FB1%ttTFs;uT3i%x7_93Qh}+;6$_NZzk$3;D0}4zg{E3eexE3&2 zo0_(YgL8hGpJp;l0$Uv!c3ZtR2e6@J$*>a4ij)jP<%BXdBg0O&lXp>S%#dLh!n0vg zhT`4C$gu8ov}iWSuveM!l50p88FsmyqCkczWdSe*5~QVVlVRPV29aSA{}7n+Pov4O z+02{0bcMEzkYSg{jCj!)GR)pWEy%F4Gd*NjaJd9Ky(3a5!_R&D{Ne4V20o&NIiHI{ z-dHr0H7tB4oS$LBC=lXjqfVszB}0%M(hF-QX;4!mjGF9Mm!{TG((5$itzFXV!&?fZ zm;9bO>Gj}5K@y+e4FU<@AX?nHtaj-3x{o)@w;$QqHk=a)icpGmsl=O-|-skoi zMtYH1@Okji;Ww#BD&)rT(S}%rD-Q?6LT)nRqe4Abi{`L8XSngoaoP``%jduu8DzXF zj#S9igz8b$FC!5uRI9`9mI}E_oR_X9B%!E`NG%l{H_T&0W`xDV2FZS1g4gZ!rbv24 z!7T_jBV@l?MwXnG{lc@>g7ku2qM#-<(hJswCB1Mmm}O;>^nw91jPxqiF}Oh?y;|~! z#FoF*RIM_vpNqE08=;V1ViYq^deuSe6r>kyIy1OAMS8(~Fs;uT=>^Y24M@VIS1q>R zl3s9%Oc&=O=>?z6Ttu#rUd8t_?e4Us7Xlge`Jz*19n^$lx=63CQy^}GTPP!>_l}4A zAM|EllL>#~lis7^qJh>_zx(O5JzZ{>Mn}|=%Npe#FalU9c$kl}dqBjt(!#M|vV>~xp7{Q&%NBxm- zBR4%3<++oZVo|%l!8JP85G@WNc~m~mJ)lhHbdJ&Hvm#dRHhZ+W6md@U@bh9}SfZhY9IJP@=7xZg<)zc>j;Vv`%2^hV*VK>~_aAPa?^}Cy%`25OlCKLX|zpn?j>XyJR|8?T{Q~Kl|nQt*eB2C zqsUYyhP{ZZ3G#Jl65_?C^IkwFnM~Dp)l`<%&Ux>PC*HlPu;!|xd|&!Pq0Lp5zJEXd z)>}JvnR<*Ka`f;mr)(ZQyvM~u|I))ZgL}s*#3q4 z-fIeB!c? z=G^k?r;}G)6r1<{{FCiB-gwhPJAeOh_EmRne*E!Mr>q{heeFGKX5DbykV~JlKWg1t zd+oEcrXIWM?eD+5t@o%U6E{?!ux!Tvwx2uTg^jDmeD?JRzkKt}Ro=h$pSD{*apu#H z&N=6}_s{Qp!Or>951Vu98`td!j=E^zRm*R66gBp%h+Oc@Wba`cxBMQtuwP}bc@Nxo zXyb#y?O*;d>4k6iJ^0b)#zPNy^_B@M>!hCwZZ8xb7#sd}?+<&oeObKki5ouMzVXRX zqt3qJC(8>*4$i;e?yJB1dHu$723)h_rmJsTd(H4;&i{D!^1Oe&bkc-3KKtgi@9*^A z@Y1^bzkS4i^_5E|MmMdTG^OV1;Dxh(3Z3(xV?K1B`#{C?r^Y|%T(joI*dtY^$9~{GjolzWk;6 z;FB)fG2tcghSh`TK6%NG_ujki)KgCk-gfnW-n{s*2Yy?B@BcQ=bp85K_w^5~mEL*! zy<4w-YRX-;pE%E7x45M8n>ojr4_tZaZFj|{oG~sk?Th>y?jZ*gMi~d9SH2zIVY--w3NVeY*U~t=1prKfmY$cVXVYOZQy3>-VRAU-*0X z-+TVn_m{zYe_y|MvSxq4wSD-ac{XM-2lTzq)z* z#?3{QH+(wX`}`Vt)T|{(y*{|=h*wrhI~pIn=!wFc-f?WaYSkmXKODJg-M?;sd)XNO z`pX^~a9L>M(Ho+T_dopExJ_$sT;o`GZbQ*E`9lx7JAc*Wkq?}>>j3BIJ05%M!|V5c z;&Y97F?MFb>3as8an{q-rrzES1&wDa3KR)&PgI8R0Mr7#gFV22)@3Hsxc=G)_-$6J3eQ?S0JIfBZeNpw3uS|Y-*N=M! zdhe}zam=!3QSbL- zTZbO~+WMlNW4~H}+k=bLFaTmJ8-@ zy07u)Js*syGWYKu*>&TNMLidVE6tCunG{+2`c(_MuR3(^13jJVuIsb=@=^T{s6J`& zc*pU3YASckKif3>{mExMSK9kU+jm8#K3jU1^f{;J9W&oOa#ZEni+bNP^3dIV?k$+` z^!Rs{%`jOWJ*40(Q*pm5tye$y<$~AqM{Rv|_LD<@88mreZTCMf*%sb#|Eg{LB|Qe4 zD$O&--cUT^+Wy~dJK#^3?YMH{4XcYx{}?!~`&IudS!tVe;JViz;Z_d%Wzn1keKz#* zpD@J#)cf2O5%-rb>^!n?^Vp$N`v3Rvwfv-~T)p1>_OpvFx4-;1@2Qg>Ub%d!{fpkO zmLGiLlf5s#E3|a*oFh)&*7MABXI}D5zChepO9R zE*mp#)fv0LtQ;P3&5{3J{c2%9(||~5-Gy%r{cG%RXSsUx{o=E~bQ{#<{^HzO|2T4b zxaVCL-}=nv|M;KtE*!AuzZ;zumsCDB;iIG0Ha&Xwm9-Ci6+36=bA!${9oTn${+#ve z?kJd&_u!dBU)r^3(w3_ZI^g0{{!GW7-V7I>^~*~q@B4M$Zr2mIK{`>rI3$N|V==)Fnwow^~9!omkisq`RVzQ3FrUQ z{{4UYJuvv`2aj7fwPDrU&onJvGwrz-=ACuvqJ{a@!%w})GQ8jAn-;kaUpjKv>dJrq zU(KSA4=TIU@xq~vOJDA`Z|{&Tw+)(m`l5nO|ExcuY{ACO&tJQAXZf@{4lu8oziG$0 zi==<-{_3#%8s?rP|M|{IXH3~~aCcYvgMVF8>sY((rrr;a=)1fieCAuXjQVwH{rPjx zpZ0101A5)ocTw-dsuu1%v3g0juS(YSzVggKUHSoTRvT|I&{R;TYWdYdE;69ZLd81 zXs;VT@y-0@@%yiPio0ehqo(H>a`3R|D2<-}}wJmo`7P+F$z2HN#x*uRP*+ zXYjHfeZHG}_}XxIX^#V!@BHBH9_K&x{+`=vr~N`le=xlruqk-?$)EnRZp~Uh|H%da zecr!l&~yI0&wu*hqL*fDK7al0I}RQ(aNq)d`oUjzpL6v&-DkMwIG2t&@!;SaHPfHI zr18k7$34~WfucykH~)C>{U45ctw)Ft{qjud9cSKBT(>Q6?R}5jefh;--E(n&=iawY zD&GG2=mDG7KKI_P72O8+|NMd{h0{3Ku9`=moS1j-;$H7ZzF)s`rhL+0yKQ*x=ze8+ zH|>ybUi$3vlP`Gi9(2-T^P1YJNACV^-j%oA>*)PX?W(69-nH-9;-`N2Y-@hW#BIZS zJaymhiyuFt$Gd;~_|4e-(wlcpy6)=hgsXig*2ZFx66^3|rFf4%hChN2aZtb6)^%10Z% z`thvkAKrS9YuCnci;L!L*znwfXFq(Q*N~@l4M1!(UtS zmo4c3^3E@~zWarh7ajcTg7Di-Wgk9z(}eIl8y1xeyt3Do`Hk;i_R1BXIhUI`GoVzq|Y|yMEd{xN`d0#eG+Pn^(DyjSm#3u>HdszukY~*Y}qV zMt5&qzwet*dLMoMs2S_lAG596^jvJyjOl_{`=4t@KDu@LVRy`*Ir0rRf4rst6;n>N zFModLFWr0Z<&QdPz-42~I?$^Cq0#_lJ*uao%^k-!!}1m2aJPy6Np$uwZpla9VY@ z(`sKYe5m`eBVL?&d2!i=+wNX~hK!z8pLcPOHwQjC`GMCjoL)4%-}C{m-Zp89u&mcr z{U1Ki zP9Al$Ytx@DTX4h9hAEfz*l@-xC$1iP`iG?uCQPj=OPn(*+k)Up?f}b?1vk zfel|>Id0mipFA3P?A<Y6Re!KbR!`(|tj&J{mg4ZJLjC8XFA}G8uz9}&ph+$k*ojqNw+UgxVn1F zYe&9)~SI=}R092k;l0BpjOmfwE=xbFoUg7a2v zasT^k*WBwayrKG}gDXu}EWG{Xlm4>cpl_by4xISHnggfb``|+_T>ez~y7$-qj~`dH z`j}@n|LvPG2mE;Dpkp`oIO~9d>7HYE|M!Wt3$K3tfdvPBaZO!O{8b=83fj=cWp;@~LvYawafCh3GxzwQ0trU}*;H+Bnta^$SZD<%d9O;~mH$iogg z^q*hvd;he?OKTTBKO}l~cqzZ@pnHzkxcTF|$JQ>HwzA&`JAN4V-L#59{JisnbH*I@ z?_~2Amko&_Mw|*4(UIyru0C*a^NM0ZMgNCp`lHS zZ(Xzf``9Db-syY0s$ajG*7Ym+!u8AP>%QJ94Bk}m*LUw+y8FQehy4AL19m?C#JOcl z`ZV72_1D+;pE}dG;(s4pV_opd50m|8p10|Vr@g!0SW$cV^HbIxc-84|{1ANSnUbZ8 z`+O}<{o?T9TOCVJYg~5Nqpz{d&~Pg?r&!fr3#GXKY4%?IByYW^1Q z;K6_Y=VKo{^xw#YWBWbRc>Qztm)tUV@ZjyM=ihnX(ueayXB_$8syU&P^2L{&V>S(c zFmLfGZ*IBxA3s;$Slesn;;+VaJ8x^nLmxZFo%Z6TcRe-W%2oTmsTi@%{NcNM)_vHo z-^6lx$jeVJtvVz&{lRGO&mLKG!^Xcq*H6A_{wFXmV1|F^VZVPf4%}s=Ibw z_;O>C8maR8W`D)L^Rkt5Ly8mfQ-p(7|qwc}&KmGFc5oc{Y_x@uSesb-S zp2h#@-uO_>g1keX-1|w%#UK3g{Yz6%du(XceSiLH=8*&D{Lg;7G{k2{Z8C7{Om;+e*1XgElVD#yl?mmhgQ9C2&#qw9N%2b}utx+51p5rVy?XV`O^yLe zW?X&u`y2Wk^x-ql*9Bf)P`bXT{ATg$m-|GouZx_qtIv?0!zMS)I`W?P`z|`$G>E%! zMZpPgJ!p@dWxa9D%Px}1*HTffX@$D0yx&8%LfBB&?&n%d@ zbN8A(TlVf4`sOTuV?)*DpWa$A^6}*#wH^c9e_`KUJ-ct({KWff!+XyvJ^QUbJLaAK zxW&=;tTpd#pVm=Vt^S%FAK63B*cRX_MJG*cEac%I1XUG5JxsBe3E^&S#JhAxR$2VWad4mr;b;^;S zA9C~PyB-OhQSipHWe?{~s2RF+{EJ6zUa{<7YeEP2J?HZy2OmAY?$PJ}pS?E$hw^Rz z#>XzZEEQoQW#1Y563UV#`x?UxhGC{LwnCOHX;HEy!nZ7Pjpb}gPM(`XQ|sglnazR7U>T?F3*e(bBwlir+r^sAuaed~hlW4R5!7kR*wI9YOS+{+g`Z5FSJbOekcpC>h zcyS>-%ljGp%)~&@+r|J*r}VQ*9`4 zzJazeL--*!2(2-+XDa9N%unZj*ZRum*S`H7>g7z@A0$sSWyqG7m&?lgo0aOmuITFh z;-CyZ3`3xchb~Agjx{Z4(_Dhwwu016n+F{$?g-1Vmyn@f{_b(I;aWf)tK>QORY$ed z@iPXFwzuQsG)+*aUNl6OR&rcSDP_0<>jR%KmI?LU3ssZZO;T;O=q7ktkTvz-1CY0J#}(raOE)M^W6P|T!K064JJ|r zDlWR2uB?^;B@nA`A6~1(4moxPY3oE~MSPzR8{Q^1_MCkpWXgQuQHq$}h-pP`)pZYT zaYd;$)IQzfi_LSz*cTzvk@`>U(v=?;s(g83QZ-E1$F0yf%{mn*%?uO0gObcYPHV;h zf`8m||H~{p=N&NS%4toxxloe~+V3r%iYImih?qvyn*|?ED7ZA^*4zJ3df?+s?~Pm5 zY5WQm4-3X883OL~wAb->?}~UmQ@+Au=VL$oWpQN@ob+vJ`h~_bc&DVu*w|S^Y7o57xxW`28noZ-BZfwc^<(6s)oSm&**9cUe zcrQjd_?WoOd<*yPTP;SD?;H>lu0uBm>g1!c)D0kJV}jujmIC1>`nkyZGmL_}y$+#a zy0(&Dp4&oR9!t~x`NBZ$@ihkYRy%q-gL|LL4pn`+^t~w|8D^uGct$AFbPq%*O z-C3kkAsdS6hU=lO7L`WrDEjL;)BCJR42UN=z`U*wAM{8O-i=6TTx%2m#5p}sX^`Fn&f_<`(UZ4>cw*@qbiY?rzeVY z(hi4I+~>LY9b_GqA1$?`=156N?5LWx`{lj>HMYD4lhXrX9QujYZns2ZGVN{-_e6<- zhW&4K+dS*(i>{J8VnYQQ;-{HX&xMR`JEA}Damb$2 zgf6K|UGeI`_t#B5Y$cc0a`<+aKNk>rG!2T1uT=th>q^46G-qCUZlt_x>UN#KlEZw` zwb2^Wgo&8>(W=C0u$?|kM;Rj=&g=QNinNAwTMXUdxTn(3+X5dtHZW9MoKuiUijue^ z!}Xe}e3wGBp(Y>W$ZEm4TYtG14`c_W%Zgoj_Ui84aQ}lZf+o($=hl@OzNW5h*%SWq z2QGl%?7{NmP2AGI~f?Xnnl9b4?5xsOU16!n$o8%9+PoQU(f z)#lSX*sm+2yyza`Y}XnseSLI?NLK_Vm#+0X107<^<@dSD`P|xpx1oFqI2B#j&GvHh>)5>)aBckIv!|9<_m8zvmK%O{AF?R>$SA+bKUIH z*XKT**elbHx#z}gm%J1j-f>Ul)0xz|N&4=nfYD@l=G!~RBO~suFAaTN8Xq~|-J3%+EWRLM%PK%S= zTx!Jz%X-D*r>@iV{Jr z%#ncUD$q`_u^huvtN~ShR$W}0v{8r58`004TQdp|*h-uLy*x1;rmMcYBuQXP_7Ns) z%RZm6#aDcGZCZCy=aPl{d9Y^=u=kl88(yOo%8^B4CDkJh}I=Jb0d^h@| ztSEEr=t4sB4e5u6ZI}>HbdAHzZRlUN+fE7ee8d)9@$T+XuYMlG;8bGYB&gTAv;Oh7 z4+_tY#Q2LQrXwx|e3o=JF!`(a30;Cz_p-DA^HJ8&rQ3U-Z!?VQ3p(7}a^NidgqJ@LU*BDStbD zy9=#7>2z}6>o-rzW!)C;c&q+&hoC)oeeFXNS07FL(U|%(_QPo%kN1C$@T*;#o@S+A zUm4MmiybUg4%$0M^IFqiJIKt{m@CGeDy3M{_K4kOXHob1gV?Q)1MhZSwJVis6uIS* zmV)6A6V>q1vXBG`1j{dg45@dvR|R~DZ*HI+Q|f4cVVxnEdP<9xRy2%$@70*rUHijo zwtf!EPl9QeT<05%UX2m(RDKgC*zUu6fVvc{?qJ(tS)?1*XmwL%=9x>z4%#Y&MP0yJ zS(m%JDSe_;tIt)%tkjC(Z`$cQN9*pnqKqFUBs3Qni=W|cya+i@JASN>d8^z;vOBD7myitk~{1p{XEAS4a$Duq@$%RS*7HCaQv!>cnaUk zg6kR$H;P!*%*zdT#6#uwKYp*9qUw`6NPQa~SLhpT+yp&5t9v4sPG?rCb!)^>H9XYS z)2@fXxi9`pm`|6xnp)F#vPeZeS$?iI zuQD`P{PF0^$DIwx%S(D{ipG|w-v}$bRGTVGoH5aB^|^ZR)PY0$6bz)5y-ymSO}ljX zfkINu-FqF$8SGPU5@Ao9Xuc0cAC~!?G1>co8QOnuFm6&}-TuM18xHaJQITI4LvCO# zbk;vLH8E&Dtz-POJyTXCr|9J9>S}#~FGp)o(-^y))kQ(7CVIBcccS79314PMuD)EV z3A6N^_j`W7WsbpQfwd{89@@t#lRZf5SKOw{)2TJd#d$c)$S%{nYyZsh0=hA`?V;4w ztX@{7I(fcTnwm$WRr@$UXr>&_XPt<*l{k^oA(G$M8+ON)vpT7+z@hMhqg>*anB4K> zu_2BFw;WVW^5WF)CGW3A9vOkhEogkdummr1IuUxMV6W*X6C~<#;V{PtmFi-PmX7h# z1sCc@_okpTHVzkScB#>4ELR+S#c_;rsp_>|@3KHcg__2h>gqE3^*0W?Lhfh|i~nd2 zY+pY<=Y8B}4y`{!8&NDtS7VpOhQzq0vpuaul-??L(~f3|V!c?$dE26u)3F$o;ahkF zGeEyR45fTa@kS8UyJCmFFBlq3d^b%QL;J2R-34#uZCEE8V7GH@&2IbCaaCtOkXKIc zUX+f??sGCV>1B229c&ucA7X!LC9vhDXCQx)I2%YjouX06$TVN{JQGOZa6ZF?ZfFY-aeX+RNNRi#IId=~%z~oK!k8ti{cfH_ZP?Wuwj^SZ?$J|O4_vbm8Aw_Nsb}4eJ{X58x zmM+2Eu_K2hI4)+N=0VdulH2y=^?^IPC2u*{*IZ(0ic2yt#sp+~tz2T={-Y%DuFoe& zE?H!R19H3;4vu$T?$zLmMq>+i9 zN*LtuZ&Hv_9aDMJ*k7?-Q}9My@7&Jt&VZVhg$mG-^|Gkkt+rwDk&gat7pUD$XfkR_ zhnh6I8mu9f$=0@Civw4;e*$S(xh9UgyhteAi&kd)CUGITVb?T6Oxe8U%a+4~bd42` z>jOgCw|Mli1ASv>wtrgt3&E**tnbFm@zu|rh3ya4+aFxRauz-~dv65#Y@j{Ozr*C7 z>kwMLL$$2lx&NirEC$k4v7qS+dB9%C^^n1l#$B0y zY6z+!$EQKBnq~sNvbC@#oocp`W@qFk~x@)BLccgBw8 z@VDX*^^7||&?OsgJpnOw%&lW)n6#4FqSFvqnM2J_wjM~31>C`b%mRqbf@75~{r{x~51sVhd4{Fs+wmzTT51RrFrQ11%}qowdIy zZkPwU&6du|PQ5<%+M(Pk?qac_e(5d;2l(Sw+s=Trvc^8f%LNg#TV4&a$-M}Q9gL1Z zbAPP53qilF7A!7Doz1s#Pp4z9QcY))MCdiY;?;2RVzYZ_QN_vQ!@;XJZr)w2dFo_* zd1_aRMiiF^XllUcUMc^3@yPi1QuCqG=tHHa`@Yh@vF4Rn<<(~Vu#lX4MuF$XrMEF? z7yESo=o=TxV^(@(sH={%>h8E&{&`Yoh2i+|_eULKxnjd)tf{^QnWYIW@3Bt_q|uy6 zKQCZSbFzsub!)>8@AuSW;m!>?AGHGN3R3q93&4_JX_aW0f*NZU==22(Zi#HU$oJ)i z==`A~t7zvVEpo!!L(V(xx>*z9cS)VS-&WfDIsLK-%}eUH1MnSJ!N(Da*LXk=5i5tgdEqsvkJ$z1aSYMzpFXpFMH@+jhEa z)02@V?+;uN4H3QY2*VWhx(0sfdPxuVHe^7714VaWnc6OUD1HDdJ%kS372lmHFmu~> zv<1=?Yua4=$dcvTol|-Ul2ce^XjVbE)`4 z3&xD-7X||Xl6ibhZ|q{zgE&tWmkb8Bj z%kkR{xYgf+FA5?KjB!@1%Vp1R5;l!)}hdQCs&hR(`eS zvA1Q&;d&AVJz#1m-+NBH-mRh*PRIXLv5v`WPw-99o4oT94@yAv=Z+~4cqVN{9_xSk zIQHOQEYYSSVlk8lJ82>YJ7F$ zR^QI?Xy1Ef7hJs!yz>+|)g&2t`}Vv{WNh>p2}gJTHM8%PMc7%te1`z~ww0Ao6@Tk2 zzGv&l*FO%$HfSARxn220=kn1NW44Tuuc2ieYB466i46;5SKSLyZPRB-RX2n4(ws@b!~nrvVL1Oj8~NZmUy-2M>cJ*ZPX)ny8>aA7Lm}w zuzB=Dlpdr}-til~68DR`ve3FhSPxssu=r%e6Z6JoM?u>iri?QSCjG~xxrCS3%SZR^ zw#i&A6nf!Tja(pEFjdS#m27>taaksA@gibTZeS$hV+Okiu=jz=1{=)5>vfbSP>z2|7 z1@w-m$5a>cPBa@w)12Mfa)3v)HDgfq8)HS*lguV}HHD5CRr?{Y&9+m1BhG0vYf1l<@#)2sEO`hVbot}~wHT8x(Q!^-p~NPwsGf&`ApOU& zf*sbSkHk$PbW*d=I>$QkWK+G|WphxAJH{^#(dTf;7KS+Gf6%N`fXalm?qa>@`{j(< zFLz6llar@F!+&L*kllJ95OLylM7D{Fj8dA)S-LOZ=P)sYy+M(Y-xKqP%6s8_55m`u zG+i=__+-&|wA2^w09*RH0+SxC4hvh2f$5zTe5@eFHaI?br19rKA4ZS$Z*_03lb7>sZW6yH z=9~9YIUuItrz-^yR%ap~KU_~5toIL5&%JMLdm-VfxvRZj>Dv8q=Ad0Si)1nud@}lF z2Jaj{dQ`!cYo#_))0UR)@Tfd%O{0_0N*dqgyh8t{;k%#b4R$BYh~2xLfDlC0N^ak> z@~Eai?C|8vijXwAnIi+it?$MoDkan6lvWJv&Ox)NHBzfp_UTapYXyf%T zqIrj4adGg@y-|*p94vXI`8~58p+ZpW_?Mr)jNFt7TpSI)$B^z@`HX4kk)_h$__haM z;eIUngNS|w*r289%kMIo5;e*~7I1mfS=D)uF3F+8Lj_+1YBbotHM@OH@xOUxYVy;X zim+zn%Hq{siuIt6Abmk$UH@H3jycf!uJ3bOTplXi+#cWk4D(7iqv@oF_RP0ki!y>2 zo!i^19tN9dFtE<^Eq|_-*v{bRuFq7jx4RGKUp0HE%%S)u?0jDU=j(=moc3|07R)Y= zV^dsuRaSgu&dWT9r`M=fJ*xd6*eSF0eCG58pK5uoW+r4q$lA&2=?1M2Z#(rsuD$&o zlC3o2Qm(ye?agY5PY{kg-DcF2QYOz_Vrc8F!s}O3x4D^4X&y< zSLSt0W5P&|iid7otI;QIO5<(bL*eEv(I6Vtgh;TqSwzIK*uRhLI##*hoB|voB`Jrf z#N(^w$G=G~M>CyOEyh+qWxIJU%}$}HxM4K7S#g{74p7V$HMFs9P~k39y(;@ukyE=T zx_uopzka%hP}+ArAfdg<(}XUa&M9hdPXT}Yf`47Kl(E^3g}g!|cT*?7*L4UdJ++Wh z2XR@=XO{cBKWh4MM@njicU_f`VCe6N`D*#M;!#27b1{iF=#*`%mV$?htJ|rv6w=xi zwg@^PXW`9q4z)o{!O0SiNbb{`turz@3&9EStboKRDe)1+Zko`EaJ31m8rD;P$EV~S zWZBmsIqP;>O0nujlPhOByG1hkbm|L_Z|?EJsXCEsrGw4Z2MXw}U!;lx`KW`RCa@NH z=QMZEf|{&a#po=bYC64q%QoSX@;38y1@fx~f4F3r; znB8abT;_`njJ=Yk`Dv7q{_M3RShA5f@=BC6Kiee}Wi|C?*Ael~xH17jSs`@kY{}=k zp|V5)$Hc?Ak{r$8n@ac8WV;_)spY>`d0>B}Qu|EU3F;N9PsIUEbsiyq@3_2s)wTEcQHfmVj$OT3&1lo#Qr$ z8ANmSUf=uR2ir;x#=OvVyfOKW4boFrD!B!A5N!9k_T|k0{inm_Us%Q1yiZ89>hFAZ zoBPQJdR{B>t1x?G%iMX?_vQ7>C(hkH8SR!LNjt|eQ9hbJj{7w%f^)$xPof8L6q~|3xu!Zpo8=NeS-a>WT zWPUqM$P<;mog8D`u}{LcvAt$$6Iz}#n3+5F_@PAkx}clJ?;y^T-ai8CT}vYDQPfrts^j zs(RCxD`SL{EP>>$BKN6W|CWM)qv zzw&jwdvcQJLlj?j*tMp2E<;PNdW^FD2ZXnBh{!2FR*CMte84bqPHOp4n0+5>NA{_^ z^T(J!ez)d-VTI!HYjV^ath*9m#=n%?Iej4g==Wz3zuY<8ZZ%`2AoylYE+t?MY zXtrK-E#biogfS+T=B_P!>#RRUQ-`X)UiryUv0O!sFZZD%cLuNXSUWsBf7Y!2J4V~K znBEXnP!w}mVmX`srQ9^Lp-@&`<-$YA64oW)Y$?o@AGGa+xK&-%+RB`_gUpih)!d1C zd8Xt*Fx>)6-IJ8O+f7=wrB$!AK)V~ATXJ_dBj6^lqDC=`h@4xrpA1WnKW30O8R2)# zv9J){9o1wN#pU9=kosV5EMn39wDFUhBD3${#rzT4x$bN#r$HB&I2=A+Gu1OcnRn^s z4)(>JS`F`zeqpXbmiVEy!w>&~2wcMM@+j-&ESr&>WguKe8< zW6rjYOGQTQzU?I#W6}KW92eeJ&`T=h^j3#5hj>NsGuTpW=H%#HEO4AoSxV-X>S5KgqZ3SQIkd`3 z>wrqQCjKZs_0BsFz2zFynpDsBfjw1m=X=g&?R&{|Yha&d+D+ruQ8}vWiMLlcokR<7 z(VfV*OT6x@df7ET`gu!a-3KRKt9O!6&y=8G1^e)6D>OarLzdq5sA-N0|7G~0+n{}8QLmC{=vb~leW*RSFM~6x~HxxwRgi;w}!BHLb`Zu*xt@#B5B>l*i15aQFCLHnr?jU{6w9u4qebF z{JRQ%?PJ}iy)XC&d67HWBnS35B?(nNJY7l?f3Pmi@Ui*f=zFTyE*1D^^v5{+-*F1q zZZ02U<|dvcEz;mwjrV zL|tSHgYp*hd8wRvBt(37ef&gg!1Bn5CJW6)t@ptLtSyq-Li6vPY@472PR;IQk9+IlINRs4bN{mi(F2EeU5X0gJ)X7`ls>UDuus+_ng-QB zbr|b^p7}4TZq3)b zb){Oo!p+z#kHz{I^}&)JS|hOR!n4^)Akn!iwpF`1w)^_?6`622y0i6^ojW;xpm^<* z_k-(JtIP92s<(YOMBdF0Yu(RsWio0fgL2+!nk893jN0zf zLgf{wYcO63->MQOWF;zm((|Z&)RmhOGPEa$M%X0c0+zMS?g%))`2@+maVctKVT=o% z%pY?p>+C&do?e#h6De($iovJd_p9`2r3|D)8_w56^{93*)_i4)DoO2VZ{emB92ADQ zqU@*qT)i~wJHk%z*&c#@69To_S3nP03f+|A+|sjL$h%kcTl0~d;TpnqWg+e(!Zp%9 zweQ5}1YPEgjJ5^|>cy;d{e3+&9kwmMO=9w^Mm>5mve^SFqYt}G0C_xvx_t4$gsur626~~4>9le9k`(Xm) z?sSize!Db3PuJ425Fbt7A1rmc{>@B*7gtzshRJoP+>bUp8tLM&Ll%lSYGFi5aZ5(4p*c;fv zDsA0T0@<2YvG>9KBaMu#);EGKD~7#@Ss1n%V*TlKxA;Ds8@**JE8n-S#dmzSaFT}9 z7QvcRc5T=t&4DkW38rGDT_#eUiLdlw)AqCvQgdkK8x}ju!lEu*@j8}HH|W@Bu*JeU zGweQf9;4(%{+ru^4Wt^G80jn_V8OSi_nM=1C3FXw*iuTNZb--O3ZB<0XG1>Lwfnjv z4;SYlwVhK=aliR;+L4=19TOS){H?KX=DUHV^jj$sdM~;J7i(?u>9Hls{$0?+4GBiU zcZYhMky)*rU+PUr zgsr_R!@m9~rLJK;9Pu@X`)xES0eB-Zx;)c#%kfN-fr=0{3-Br17*#Fx{{LxP}v&x zDzRvdf|uKO``y^xq_lt52;4ZQn-W;7YR9^$$r!gjUg>=K!^9WrY&q`bJ7W0*H7N!u)MqcBhM!tU%hdBE%(d>-d{|tpteh?k@~3p= zyRc{ZGk>>qV79blT1=&zPuvj_cKfZ!wKLr6bmo@NQwN~}T+s&ix(@mjJJlkKIu!Hw zC3OpAJB)v#^{_Fe8|qp}IceT1vc-?;2=dYDVA;abWZ__Er3sv~k$R}GP(6A0P@c|I z_7YpvX}!0g2I{_(rG6J4W1rtVsOfk}RJ*Fg+Ry!3<12r?>-_@5UP85l=hRN`0EMdv zHyrQzXzaeOvpz06{0)&)$#33O{E?CQD8nePssg0%{bZfEDue0~6=ZAXy*~f$n@L7_ ziB^l6@Bc0^EQ_9g_aPty;rIz0Jaus5Y4uAr$k{PXY2^OD_ZSX;N4`qGJUEb3i_zDds_5Y{9kY;T*M^$ImFx+ekM)?d+uEzeYD}%q*~JM37Z7y!kqrAq>;0{5D^Ciesn0ifd0F0_yd`v03Rx-H$kEPZ58Dy!z-T)4 zsuL8r)8vuwU*YOt-TXew${GKG3GpKC{->y#);%x}{g) zl-P5@#=*z>0OygWkaTf1u^Wx|k8sgSFt49%GsYxq@?AzxWD>Ozbfb%wA1msc17}L9ZUXY<+vEKTI%au%UDcY|mu+ z@zqH9TAr;N?Zd>_K*^Fq$!l}y}O3GnmLqIAQI2^a&%{DkN;6O%P(Cp$c2 zvr#)6KGX+Xm&h}sV*T>uf?7l6@Lw!n9jWNLRcAUw1jNL6<~~=@WQac2P@B6kIgrpE z`ZqzFLp35f0gp&Cqe|6n=^0rl1eT`o+4&%@`xr1PUrabr$yz0K;JZ0dM~ zi8p_8(>Tz2)Gk@M!sxO|qvgrJUwv3xJIZHXm{2XjKRh$pUZ{nn^Qbs| zEOR*P`=Tbxw%O%_-_-0f@?Be87GN24r>+&SJHCVQA+dcS9IxFuEOc#+P_n2Ny5R9} zcXuss+W5fC_QG>9+iRHQY545HOo?*lIZWW&4(YBLlS^?6Jr1q*wA<$HdFil(3p9UV zduYa1%q_L0x=F!_|GsBS^U1{4%h!geZiFvzA{xs4&8(d#9OL2Y!3mQ|)my^Fs!Y6h zM_Cm-055~{-mYa|k_@NeEq%*0FJU;KoY;}p6ln-yDLTg{@3tckyeAoLkg`vEe{uf9 z>#pYo_^u8Vke2WOA;4b@AItqVa<|NSzl7zf2h|WWn!v#sPnkAopjghwVXGRJ?nP~T zyXbSO^*k)e$}tvqyY6*Vr3D`bc~8AW+oUz@?J8vMoA?$i>0mvMF`c(?-D%}Da;WVA zO=;>0B#Xu+{Tvjt!mIc6bBY6L+%`q2>^^Un0@`*~Fwz-_Rn+>YqMPZ%ET~k9)B@A4 zafGWUg~NnJ!&I&p4}^hw_%60O*A}%YeFG`D@;=V6$ejq{4MTT7(~+8_c6%7)px_eY z-17=NyY^S>y#}`9)Q&DvhT)eA0*#n8SYB&c(J5E=3LIv*J=+=sgbXR}Z5? zjBQ1=WMv%>A9$;nu|q0!DC5PTDzXGt7dvC;x7w)}B_mS3^5i1-h(d6^EN>n|CI4D* zLu^^^z`y|iWgE#@qv!NkrOG1FxQaUwbo-p>Xp)i&mBRZg{GG3jTE#APEl4THLER2( zYt(9KY6|zi;JJOT@zs+sU*~I{f%QXCBJ4`dwDZhYO0HkAc?^csJIuP?si3ZHz zG_UTnf&1?JnUVAFwpS$5o=PmaXl;UajS9Z>DN)H-%SkY97h6_MxlPbdclKV)tlJ~m zcm>}d&&{S?+wv(t$P9WZsqC@a+_ZTcV^VX0ZRv8vt*jSQQ#=I-r89?T(Yo`r2?4S^ z6X#zZb)5Q$w1x~9ojgD6?%^U=s;J!=b!filbCaCZ)Vo_rZ7bQbrgY!S?5)Q4j}30q zD9Jv=*Pox21=Z_T?}pKycr@qam9yt#U5HsjoC&S5pXPAU&!bb%<^lok`5KXoW4LbHXN91`I z$eoVL?PpkP5kpf-W{$?G*kX5@VEILF%ROIdr*8NiGggUz)EI3mq!X!`Yo55?+nb@z z<sD$JM}Fl`B?!i79j&Scdk%lXOj=F{A2^{?E_FU~z?o>^WxARsQNLyF(vks9%l` z30%{TBh5J%lVQ-?k*p18Igx^lO;*sDvxvHPl~&LdzH1{aQ9+rp$=_ye-g&XDonwV$-}lN; zp4^l6#O83~=TEuYsld>Xke|Kw;|r5+m%Ch>5T%dfU$~%)qkV8bp>L9u8T$iuPK=28XwIHSsh*Ico*7)rEG1J**PyG-8!4FW-4EF7a~j%k3#0gIRW-qHhYN zJm2mxt)l+G@Tjh=nXjnigF$z8@U~g3!NYIr)Dik2YC4e(mnt#WRHXRPJ5dnh%)gFS z^Cmxe)4!A2=;=$8jdQ`l*lyvq_%IKA?{lcFzy80Ew zJoKrTttelol0TMphI{Ow;}s+OCr8p{M;*uQd>k@g+oP||GC`tyL`>iP)pjz-6Dw*h zSrL6OMB7!uT--VAz2`RALA%lXt$!IlZ#VF&-svmX|1LOlBz$*PivFF3l?!_t(|%^! zt>=PhKoTD~y@RgYxDEn=K*omV24(x)V{ksBEF5pccn^R;xZgkJTL<^;W;8rN8t(4_ zhy910zJbBS)@2YVupzDkU>hH}KkoA!dO=tp6h<9v5)_C<1b{8!7)%&g(+7)1tILvq zy%`mR@rMQ=0-*kZSU3g-_19(sgDo%!Z$tnT3C7}T151N(?nGm=Ao*hhVz(AaC$}QCl7Fe z1tbE^l8q_gOpKyZRWCJ96`UV`LZyH=D|{X@UymeTZ9x543@YH4j^A*TlZVH&*PaFh z!u@_dImte-PB}UM%`V-@1RXEuM9;BaUO)FxM&XAH0)Y^nkddU1FnB~KgM@AHTw8WkO zQigyLV}5X&MjTjz>;jEadbI;YcT=4kPezb*pelmI5~~8_^(Wrfh}Gc*^#|W=I0?1M zD`;_`27z$DUrXq=4cBb=XOZ^6z(fA?E<^QENEC+9Gy&{5E~4ZtV3rf>qI5utLj#J673HCd z%1We)N#H>&4Ll4*8CBJdQ3d7@F+XWyl8+2IMQx%l5|9zgZ}JR^^Xf=UA*=9TqB%0+ zAV33HL{VN&bE-c#}pQtWW9) zSRdaJGAl<92@iz^z%X#Ilb*S`F<2}Bg@O8tGl9WYa5O3qfkk1$e#&Y1e6nQE=!5X~ zLE@ZD`v&677xE$xH!4V3oqRtJm7%i;cTh72**9~FR-mRARhKs`JZJiIoi zD5`@+ls#1xA>?Izg5dZf`pR+&O8C!k5G%taD5!(+3Cf!ja8=<-sBBJ9QU{C3DR@HE zAY`rMs#3-$=qsx#ZAwrfCP02jz&9_aps)NxD-dGyiX_4!N6KI*MvP)a#BoiMK@oWl z4>IrI08|hO0gn|x0H?$Mt`S9iBfkN4O5)kXYF;Ree-IK1G=@V&Fky-kGybA!+{h|! zxHsR#eLtl!GMXcS6u_-P9)ScgBN7+>iJEZN*itB>H(?%&=&~*Qj;QA2S{*9Vat+Y$?GRYq66VUFci=Xr4EG-3h=}R zLCL+m1O1XgLIb>mpx$t|-#nYj#iM zgT~;#{DBPv!er9p=>x^czym#@=->8RVWZz9t|RY&41Rn`4HEi6h?7A8pK^2~rQ=hG za|56EcSAh`~8|Y$-c-=Mk++&{I_X;c$PZ0 z!B7A}QDCt;Ku+Ybis}F{5o2*^Bd-pS5?Q1IAyQe9JW`PmsX`H{qz(`fS#f1tB%XxG zB2@^H5G9I8TvJ5yAAfk3$5ukrrph7t_n@BbfP z&IA9%P%^-G=|5|M<+a;m5U z1VkQ*Yl=udWYG|HBJmKkp&u18fN{vy<;YZ^KZX)+nU}EWMp8Pla18X1p+qtV{uoNX z`%Epcu0}LC@CF&az<;Nqq+1ht@Lx5Q5T0;PDEj|_9VKIYNB&C;B{>C%lD_gLTLot* z$tfu7{g8k&l;jkY}**iq6`{UHfwD9I_P8tNoM2Nr>#|DCxwTbRZNPgn?rJKe%D^ zORPRgH3i6&RjB7lm9W{x8{w zKi^mK@`6JN2j3}33oN3jyx&0i&%V+hbBRnY{+LUD%q22$_%A$wrx$HpHct-%;eNk9 zkRkF9=<|P(#YE&KvbTz}mPb>=a=L{a%HV^s#f6m}xpjZ@eqVr!ngEwq(*Z3b>Ozazw4})U-{=>UT zOa@SlA2<*jhJ=H?Fera;Aj%6H0>!{_ZWW-O`1`N;`?1Es&;YPC)EkO~!h^w@X82@X zYhrFfFi^$8J|!liD2Mw4c20nE#lWI5#WD_YA$ijs(oGjvNXP4m zjfVIjup0;JH?FD3N`PT-FK7@F3zm>&0)t6CpuBNHIGIXpnfy`=`7x%ABgMpwzq@6z z`6dJDcrvjpX$6KDCO_}_LmZHq{AivCOjVWiG{6CIVr3Nfk~SYr!=HpchWE*V#ChHj zQG?+ANOf(xc=S)a8;a4}^r9#)HIWY|`7r-eCx!muYC7&>d-$N3usIC~g!}zk`{LR( z75{D879MnotC9GLL3WshI4OvSH-KR$z%<#xYhWS}5`f_aLPU1kI3@h+TeKVUODIed zQ6Pv!!m-2v`5Auvp?ILdFn+4vv=!H7UG67GcsqXNL_APgE62nYK^{SX1(0JGp;1kNu7I1mxw zjbm2?5)Q`tK(Sy?XaLv)4n`upuy7a?G*B85NZ?*vZVc(hFBpcvz&)|ZFmMP0>w^ly z;?o1*a2VJNg#kmsxS0wA2V&u9CMKIOG{O^#M23N}xZVk4;75WG7&uHA>;Vmg3 z0I-|}sk+~*0J0Lmt3-x@5#9kP3>>ym6u28jBvbt59pe9_n=e2Ze`N#TcM^XRk&A+2 zRn#DIkPY>R?BF=rts#mMN=iylQk7V!H}OIvIcaXh;<~uGG^sEEePoY=@Cd?^?z&Q- z95EAKMhM8O!pwz}Fuf>x3_m8|t zQD{9RA|e}WfJG>VN>x=(PLAx=;E9Sj3`9EkNq(GI{_L3vV@7#_nNm$85hF1#siT_{ z@G1bQBji>rF_LtBXmcjQEi#H;Lp_vL@JsQs65xZxyTlYPMvZ*({N(Poh>9BN;M0cY zKx~=vf-w#UfD}OOrRa>J8blF41Inh4cPM;Y7Vt z_WytMO2IkD0KOs64H?(qsRp1DdANTBiDZreu|$3$C|eZH&Ab$Ge}I28B_+W13K5|J zrIP^8L}iT(j{z+Y3fu_AgEBE6CHQV+CBtc;{*8t=Yv8|8QOP75Kwtv4P-v@U+CMoO zLF9nP0U!@3OmHAbsEL4=g#Sq(i{A*}9Jz6^liU^{A=k!rUL2+akF84T1f^DuM_95< zgbT~WOY|E(C$oS^Ku3YDn>voC=}mDI*J*!lx{y$pP!tFP{UhKe@tsp%M8+W^F#$k1 zVkN&btZ?!RR8GJ_VjZ{_4kQpzjx2#FRfOROaw)0;!U!PQPb>`Li2T|UTt+%Wb0{qc zg!}y(yST}*D;VJchXw@x=M50j)lnGG2e24!DGld9XTz1KE*6gQ$GHWCg}{+WIPO~M zCNpAl27C_VfIu`(k;XZH3r6_w4Fvnbk;pLoqY~WCfyI8}Uo-$3fWpE(ePlOs%LF6* z#VOauC^TD~!a>+D2Q*u#q8gmcy(PKINj}Rc*i99p3W04b+W-bLk&-F(H2hSjD6Ocd zrlvyLn6fUKlf zwK;)QGx>`pMN;~NAy@l|$WQUCDoP&8UK=ltgf+zOQs}P$`cqWk<)sQCS9o!&F~q_E zP!of|6-FRTZhUOEghMkv6Egb-9&;4g|veevPQxe}<_4wslB?hWWn?Kk?i} zq0!-BlYp5-cmfD`!zTx65|Zg{1gIqD1%Q&kj1(#u#bTnO8o>JmD<7a;0xl9OBcLLX zL;yr$66Lxrh2}+)Ns?kk)>#4!5-Y)jAfcyZlZS{4K(hq+BRw9;Z43Zcgz}VXB$;|e z>J8Z_lHz`<4^rq=qyZWGsK)E zh$0juQ;tahMMwdljo1L0p6Z3iD4>2y_q-JTQOI5Zg&s^9z+)G&P5fdx@caZ^BDO;s zU$PgkrUIk_SoE*xbKZ<0pHyirz)qqvHXMIPyN9|I55>nw7OxZ z0dW9209iIW))P@vR+3lPaL-G?4+;WPl7o^jDpGPN0oN$ zf&k}i0Vs?=6iL$c0B|Bb6yRhHNZ3>-?xm9oQ!ek}kdz{~hswsr?9a3pip*+ia&i!o zlS&dUQsj}7Q&sWU$b-irN=-)X_X7yPE4~zkDdGj&cyR#s{g?~pwUGdP{%;ViJW)LqG)}9{~c0`G9%7sr8>S{)VDL z#+-zSPppknNs^NT#)^W=aZ~;03st1aOzaLBlW$OD05mv^qP!Amjp>I8Osof(&%_bH z!l6iFhsiV`N-fSq1=xh9pnpm>C(K)7Re&}F3^QTE5)*OL6-ZE1Q={nr#&Q=hMJd!> zFBmYoz}%!rhIs+Wz@+?F6b8d@yLt_2Kp@=j*VB+~Lt*fOV*bPG0@HpyE3h^G=n`)K z*bM3m55yw$!J7Vr|2!4^biMtd2qaEf_|>r_IWN4wV+!~qkOc|YH(2!d!Gsh?INd-Dl3V`dyhb49kS9)C zAmjFbVi+lwSO5?uwoNgPzx_@Ou>df0e@Umf{Uw)I+DzUwAQ0~N>nTchLre+6B2 z_WSJhU;nlC+Iz>O5$UBuRZO+e+dD56Xyik#dtf0X6t)$l2}v5DGMe%9wHw&t1f!^# zm?);PBy$kX1*yzDGYCu%F)et$Lt`5`914}O21QdmMLDU-T|V;acfNVIY$r*?m^mPIIkNpqkf_5%amGDfkXJro#}Q4y{PB+-P@tL69N6gHI;jCICP1b zz1Y*qbFI~J{5$6!#Cp5SQAfotN1+ZIQfn5J=m+~QKJ4~%gpZzb0$al<3?qG@zEz0h zWUuAJd|++QsVSK8tuCo9m;EG4g^bD=Nh!7I*MlfiIdDJwu-RRY>Y;CATBJ50VL(VF z$r3G#y*h_^wg^DklzhZV;N0 z+L-jo7rmemTI-p>35S|ghNz|-H*0ahQaH(RfPsk&b8(U@Ck`gtOn6U)y)E+Q- z=$m@Y{BIp(C29`q^?b;hD!AehYl(td=-XL>aEn8cnDW-C!mTT}*=^f5PB5&S#OzaZ zy`2K%1FK`V9^L0S>XQw|ERu!5__DDLy>juL3%we7i3=d;4q+qWCJ-kMu0ReL+EPgf zw8JIAltl`rF%{^BBp-rc0JdTl0#D3F^9%}+P6vQg%E$SOhEm94kQBah+=X9^{Au~Y z-6?Dr4ciVy(IM~1d`&b z<;Ry3R8k=TeOM9WvC^pmkY`fyApJ|lHaiCoe(cSA9Y=k#0q!Zx+tFR`g!<}^oh6(( z5nMlSTH%)5up3}ty^aqzvF;OR`Z*$`vwp{IwA)d~y*>0h6K5uT^@Vd!5i>tEImtTu z(0b3TyYwe>_eQjeCU=aV}95DJqDpvf1{7vqn$rIe^NH zG!uQdGYb=tMUn(Lui7P4w zE6$)ONLcZ!LIP3~UX{wAL@7=KD22ooOOY-k2zSJWg?UoN_&evw)&oC^A=Po&0t8m9 z=#aERs|0(fn-Lk7QkI;A6n|n1ETuB(`ypY()Fiaj*J6djMnNL!_qrKa<^~!omPpw$ zrbzMy%}FDG_=rm$)#KHvesn_(iJRJ=sH6>FPR*k(N-7}MSJIdfr&XpUcA3fsZL2w@ zBx>dQ``>%*9>-CiY>B$bN)$L^##MkR9QYpYECXO$?(S+04zD*|y@gxfm7>nH5(Gg% z(#O(=7_92|)lRpL+P7w1N^B>d_)+Y#JKXB^)tBaJN>$ z%DhN9W}BJ>&nc{FWP75{pf%W(%?X2M7+a;P={k`p!`JZ#5^XlV^tV*N#)iX`G;H+U zh##-c{0M@ISv2mpyvKVL5Ian&^Kp4C?stTf)qT$s_tys6qf}D*AZff2H6B_dy z^Mz%+A((ucbcyO~Vc4u$-=$blO%tmApxg78qw&>l*os?GZ@jg-*6k%;JfMfM9Z=*WMeIG zrn&5BHrkcO(XCac%E}82m7#cSm;==SjDRdN8z*n+08~h9 zzzzWZiCh4FH&g(=8im0MHouK#=rktOPEhXHPB#9+up8xb)e0N)8+DD%)Y_VA0v(Jg znc+jq81kV0rA(k!F%z>#K&K`~L&V3M@nALyXh|$h>qx2xCM`XY-da>#>E^4n_dp3@ zF{FZI9Z*i1MJudll%n)XNi$H%2=rFu5P8P{GKM?BQGh*BUYJJpG2_f3??f z)F&G;*}@dF-X05PTdKV_Scz7n%V($^Ums`#PM^5po+B@A$|lCOUTZb#(U_sVqYPhV z?ydKFQD*=w{5;LRpdRK!9h_`muDVAh%;)o#&wVGFeQ~u}wM)5x+(ZJHiI?`9z;2Pp zfcGf!lWO)Ae7=i;+hG>x4Z#u7atdnc(PPu>tJVWyv#-{ym+ID&veRZ?HHxY=+rdj?_5pfaDzh&iSK_F7+04GU5Cj!#cazQ? zCCO+)rkQ;fI4_Ucmni@8n0iuUPc+b{{iwf^Cdfmf07C2?wJw`zlqh;#sG} z6*K$(=okOwxv#j!anvW9#N3!__U*jA_b-65Xx>gV6lH=j6(lM|TOSMdqUIggpvz+~ zYAS&>Ftg6`2rzc8w7m$d0NZ&1_9AF{%y0BO8gkNJ)XE!EZr5G}eTl^T ztg(JL7vQ|M7vKEFcmML(KF3j?Y^XhugxV`?DkdTKNNagTp9c9DHWT$C*+trkg;Jqj z(7{6Xr9xmv%(fGK2il2Ywdj{Dg}u^tVkIsW0vnV4-DM|wUO5QtA%&OKPV|a}xMJ;p zqdzXvPK=6`f@i18Wv~+~eznN90qnG$SSZvgMHYN-jy=d&x7yb7AfU&kvJ+t%T{b(h zS}X_bI0VwQ+pv4m>_iKkOgo#1ewvLJzC4&H|MJ+0Fe%iCTl6=!n+g_+Z4f4Lfo+Ue zs-4&@=EH)Hz)Y(vjv}^K^orSuf7t)czxmN?97lb!$qNfo##o-6ToU{jK~;o(h_Ybk z4L@uDv0xkm*+9~KS&T#A4_L!v*f<0X$97(TaR}-i^Bd)!W*maX#+2JN4nYZHri(TX z0Y0%bVI0DYr6G)a>O=x;1EfNZVpr^xeB-k7tkz|_2O*iu+#vNcj9_eb5 zWNk#COd>|mG>OFslDts{VbUVT&@)=kr0)!gDXa$D%2y$+Q9!RWF>wik^h;&HGlKV~ z%w`pb^`7V6@$KK=<2dS*4Fv394Fv?3jb#DbU_z|ol`v4g-)f(WdWd;Acm#QI+*Cr# z`)E;>q*W%yf>2EDGbN$;Ogcf!wWwSsC4+)V*~-m&y-XoSAd&RQp1}cfXn$ul894z3 zYvmEXqkzE|ree)ZgeQW5nVARAviI;M2x zuE&H!M}w_UO*N*u5)f(T2?JxAgoOC|RpS>miAC9-ccGj8Dr{jJYWex0*b1^(pp>tiyyF%zmt%8VPQA5SEtJoI0s29e; zMY@b%Hp655E$kcD2kxI8rQwLFWT|!0()x7OE6yA4M6j#Vq*UMZqo`?pbp*Fr$>TVv zHSKW|a(tN!ii3tEmIOPxhO}NQeEGYZ{{G`P?R6aW$;KD9F_PiS4r=b$ZgI04BT4)L zjJ5QWLbSJKkk}8YA`*6ZU|v1b080F+K+kNfGc3+9PAGxCQjSW6RDVLz;aLP}s!i%F zaR`EC5<-D9RZJ2O&0&feWg0sw7Gu2%tqQW{7%7Duf(eLY36i?dblu~n@>30jJ#F74 zMF$UwjTTxqccn2*Lz%${s5$j!)hm+0O=6l-7f2}bHImPibRe3Pj)yU1C~_D_lE)Mp zpd>N(@$1jb>~S3R$(BTR&i!)F4_i@Zpd(9nT-jsguv1bg`bB@W<-3h`%e}p?{`8yq zdfnTOnl}htDHlq$WYke>)nAULTy+(n-y5e+-l}I3Qm}^c#BUDwxWWP=%sV zbJh9zx*b3Qd1{n-JM=(iE|scm+zhVbcp&Q0SMCK7+)BJ2GQ~ti^Yb&D>Y5iTJs1RO zRAIVTsXnLgg_M{@S?sK4pqz9RY-g4MQc|&|!EBP7-z*t3qb-t&Q&@3s>d{G|Mha** zAAQm0*0C(lWU(v)Xm^bDkbf3Yk?BT�*3b^-ZO+%%_y3X&v9iz!!&6?HPs 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≧I!G2!4o)Zby3 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 z zs(q=Sz;NCy5!%ShdAIN%>BbucA93yM92RWK^#z3|U!V7ZuLLp&CsCj4{yHXun{H=s z&4S^Ngu5j$Riz~O#CVCqx)f@IHU!m>Wjo-%$17k;Civ* z$Wkws-G?^TwNKSGMAmDnZ&+}D6^9qw=4>N?d(Qd|SKPrd1q5x5CgR#!9zH08IdBl5 zNf}%_^ARHaW&`cZ!+WTuty{-)AWqrbIk$CXIM-J-MO=&#zJ z5|o(WJ*#$1OqYlnwzob7BRSbW%i@GhJJHQ6UE*|$yaRxw9XCl07|SZg5J*i2 z>r>dQKat^lL<=T%{!rEZ!QXmqUZc$D)+;W89-m<&JPv9OwZx^ZhEJ4g9DTZmXi@O5xcC4Ny zRi&P!dVY}ur{%L*QdN&e9L6!^^VnghB*jb@>a*lxOuxc{VEcVMS={`S|L#A^)MvBn z?9l@~{MAM!{t@Is`CJ#f$$UPgFLg)xZ~^~MZbY$v4YaN6TM-v;6bN?OyL{$DRLhB(-v$Cpa8@c|>51bR}kv zXOH^+oHnT4h@JlC#Ubj?N1`Z&BPV;jfbS>xfZ`ym$$e;%L6aEnmpOece31jco|C6J zoGfu@lrIRnkHc3eeIT*}9ya*kWe#vF&VQc6i7|)1c>esU52d5!eIFWpfvl9%!l;=3 z`sUX`%R_*X$S9KfQg98Qk9`;*6eBGns8F9?R>fi{!ejVl;OZ_i^6bmO%N#dV05as5 z67)Ls;n{*rx_m?`zC6l(yjkmg7&t3Fq_f3Lgr@M%&YvVhRUg#XxJLBhq!e!gipnRA z*dsR=#XwU&i@u&u(;>WPa31s@6z6S|WPn4D%A0I>QRG?rgCu21X{f0j`7F@ z7vw?9g@?ek5Z@f9Su&Lr@W|I!&x17rLk&GD@;KuP9NlC|FqV%PpiX?ndoy?MStJ{= zB0bU>w7bM>7WYHMq%-KLi-?gP!&s3diz<2q-#$r|o~P5ax*3q@%cl+o=S4b#dk@af zF$03)9>YD%T2i5LPLdUMZzub{LseMbeP)Ce222W(Y)Euat@51-`PK4el(lfZ<%_IL#(J>G)_W_f zw+Sr_n}nF=7EucMo2;$h#3=asrCC`e*-&Gx@v+AzgC~cu%Q-kbd@?vXJ~}-*czW~~ zhcAOHuZ|DCJve%b%ab7f<>8;bI(m6{GB|nlqV~$m!_!wUk52|i$H#{+2QQu<9iP^6 zn7fytyymYwIehW*@G&YFWIjB8^(=^Z{^IoL`SD2*ck=6_FHbkt|KQ~0)w9FF@$=*3 zS5Kb~zBv5q=s0-2mf`R?tisE~FOQB7pA5cy{?dFYc-egW_~2RCNE`k9^y`<;e;vH= z%Zz=NH)ad3k}u!=I}Sae*W?aYQ=X#&X!`A)ng-h!4y>&sh@aC zMdf0y3sbaERCIdkDqyR56=R)sFp(U`fFN$zIDroWd%hPr3G;o=aN#ukfubQDE(Q%v zeBa73SC5^A)WXKe&{GTTH$Yf&!+;oU;`vbU*7WjhJ|!=@bc%AFC9B+gnkM}*?>-oblKccHmbLs|J;_4O8hD%xBXR^k!(SboJ9@~`e z$G!3%PRRY8-g%&oLJg{^s(M0t%fBVOB%T&vE)C?R0lZAdRxQbxKssAvV|h&QgG{je z?5NhfNG7wSW-Mt8AZz#Gq6;16;E_Fnha24M^|GL$c>Ilq&?Uqpx)x8MH$s7R`h-5p zI=Oui{#gTw;^8KIwtMg4=WA_f8ZbN|1qOZ8)Vf<|G@gyKS`;l52Hs7Z)LX%X;(11( z3*knvYiZD+RJWF`Hpm4K_(2J#Gq!tgmv?I#T;>+d=|1}EIn&(|sJ#a#e)Exe1i6`> z5U{ZxEAQPMz)kG+c5kyXm!EDVQeF|nb|i1Zy$tWY?!$fd+YD&`(trDhd;jO(ymJTt zHVcja&L*L;xD)r^`#{0*hu?~mmyv_cnm~|%&>c^aIfJ~jfNO{z5tYK(hUXC?oM!ZIf%6XG!^7n1@pD+#NMz)1GxgkDnGCB$4pzU2g4R-$D^StP?U z!Yh_qIdK)sshogHNT!@f%FCkGg-{?tGVo_=v|=YOZ?b|WDPe+u23NH#Q;Jxa6nQC9 zgZLzcjHez)ZwjeS zM8MNhoD&V497hOnA|bgkze52>Gzi2oQKOIs16LVfCX&uLv5b?)I6+L41jdVAgv_Nu z*s?BVVev{$u5z0|1!;jK1rc=-iivBKogj&YCipF+B?w9}3BpD`f?rNBfu~*@eRTcU%rugh%k#g5XEv1{C1KI1f*mG;XtH85nh(jkGJ?Ze8wURE3053 zg_TYiv4oLFL=Z$62}D2k_y%WQJivkmALAqpKFWv?eAvnqd;|#-`tcT>zR%2^7hiVS zTP|_ECV>cU+ zG)Q+vs)+c&%Nj;9NBI;pM@w2PS=i(U7m%#j}c&`=>{)-jeS=` zJLDcUyfhz+xT!%;e&B#ZH^U#|ctLgAG||o=Jcmd}T=acDd5Gi2NB5bxEcXUN3F$0A zYw>3YkHumf7X{f!E;o327<#m`Dj=Jn6g{^c=zv`Rr~lXA`;Y&%J9qGJGduq`0(O3` z3ji^Y-y8h?K=%FjqxbPb7l0#VXowfO(#8MB+`Gldk#1{3W=6w|j5G`b%wf1lzr*gG znN?XC<=(e*s+}&E?ey+CZM%G`%H8{%jC59HW>i+RGb6GiBI~j%>u7`!PY8)OcmiIK z-~|K{JOC0P9tI)J14w{`gfs_uK=Z&85-%g6Z~eFRM@H7g?jH8Pce^rf|NXkwx4tD_ zM`;50G~@L9Su}oj5hkPPTsf$zBtoR3N#8SN<_Ck3@YmMFGfbdDQ!czpBsrGmB7^Dq zqyjf_Jr4vEcWP-yEgaaxaSb-OGi&o*3nyV_rH8dJvDok$QT>}!acvOuhl4nQn-BIF z?vU7J7BP0L8k}21nSDGw8O6@!G-W9dPtxg(znr>PXI2tc8=g4vWNFHZ=ZXeuWZ%!? zg~J9nA8C?ALmq)rqqC1vR?1;^!E19gn3j?l4W?igu%9avJAPvl6)gTy%r8>*;+)qB zdSgE39bdu&p`CbAS4eo1nSY5h#R=$%**{ORkp}$0_S3$_In<)O~jvvRuH6 zH3W_J{c%*VGK{05RKav-9JB1vog`#qjhvO_#o!_wjac5yZQwhc6qlNee3gu2*1OexZt!tb%%TX{bW@&QC}G>r=suArvp9(P&8@b_AcCX zdl%g)SKRDuUaDO5z>2ixZJZaKtSo(h;S489EaoZPnXv1$ zU_El2MZ6YSj!vR;`w<_ySH`%0|&;I_RR_F$dlo5 zoH-ApWL&Uu;#hCjz&Oe)gWSEanA2f6aVun!TI=K51UN1BI{Q7f?3J}?$ZAcxBC;P% zKRWaGG#@*aGR?vdZV9 zG-E|d=WI3r2*xI?ATjJlJmXh!x?+bIxpN1*(bo3xmQl@;ITX9synPUaL28HEaHuuMSS_pB35AOVu+{z z!#vKM8#(VcQa{VzCr?292E3oSMJNs4Z0bDDL)O>wAvR(*x;%1NOI|?v>r)wL$-Dq*9lOJ4(tHx}X&V{hJwsl@g&X_cS#ENG zH+g!q3E$%6<-rIaTr4hk*tk?^}fh`U1WEbd!Z2HbGa(4>L zFY;1dUgV{YN`&n!^A~xkvWti(fh(tD7ku+u#1We!+=T>JY=Pq?E3!F!X|Z~lvn6g` zUgGA{FlW_3JiE38^Ta*Y%oDfPq$554eyM}P|02%{+%dA(`L=!T7LkasSs73Hw)rgN zeF#@Gz9BjblY&T>Y*OIpW>+VC;U@GpdkA-S_VS!h{^xw%x>#&Vg|H?R@O`0;rg459 zr9*QZrW;xG@J%`ba50mH(h^L*-}z1Fw?JnQ03UcHzdM?Tlk;gF&ysQ0yWDI({_@KI z3JHWE(T1O&i!dX)@OT79#gCwZfP*}_XAzGjvyn{TU1$IG^;jVAh_)EFwUTpL$cu7o zEIj6&N*fOxynnuuWsL@&sZ6c5?LKE>W!yPpwv8i|Imgo_~h9l1(#d(c#V4S zAvg;Li-*YW)>d$~-dI}%m%-V3aJA6))*5Rr0)Uts$C4atlBORw!V~y*EV5WJ62jC% zRtUP}EG%FP0PcAZR%H<=R(O7Vk~=9jE6JepC>}*g@u(@D(T`_M5fwxDPS)WFv@kmx ze+J-91HYd=`l8o3VsBVltQ80f-xqty{@hXA5>4AUL=uU z48dr{uA){ta#nRE-$$w9X*dz`ZRQEq_YEa5NNQlWp-5~(^|Ius$t9;~C`M@k*CH*^ z`lCh@b!QsH_a#kD6pqj-Hn#O&$;#AfSU66~1xF3pJB z+zwhq9)W-Q1jFJ@UMhobWo%#LG>JyKAe8OXU$%b!hqmX~M1sNTc71cveZ28UDxI~u zOt#-!Z)`gc8o{8PgCtEhR@O34WwX1v@oS{;>wa&o6p!=XIpfE$KX3SG(B0g4jMpER zUo?Ggsb@N!?cfk7=Dwml;b>k0HI>14x+Bx_pfA4N*{4=?u*z})eA#)u`-aErKQP0_ z4}A7}!G7z>RS3UkZ+kv5dYy)octo71adHf+izty@>@12i-97z>KKjWm-c_0Q*VbfD zTocd8Wt6y-x|GF!H13?wuHdZoI6lAOC2TKmc!k8N>K#ddq89X>-TltX{>#1h&tG@? z`>@!n%QTx5ZBu#UB_HmOYYomsBx9JyqtPV7ca(-`xAnU+IU&S0PhJSI)AO@>PQE_Gk?FG=#x-_we$Yv{rS3Eq7RwjfCBUg& zyGwJXjz?6k#%0*8-Y);p{o(99>um?vR0egk?UX@po?U`0XPaTY%$6{@wmb;c>A5_P zn(V7gnfc?TXO9JL`Rw692DVszR{0hy>a%?R$4T!=Wonj({VsW|Rb(b#R{joFetHTwWg%DUPSSH?E zjnj>7nDb*+XkXKToJh^$r!nTHw&YPlPf(ZG648o1)Ae9DQSC%g4+1|3{Dr|_?|1qK zhdcX+oqfQ_fGuBuv4Dhr3%NKgNaD9p-sBfh3ju%LKrvXSvH}1SA;K>_?JekQ!>4mM)ux+gaGM0>RHcJGA zxX}n%n#T5|CBtp9BfX{KPs6K7>XuP-J&L0D8BtuyD6SBN>Fx;Tm?Hxlca{eH+Hv<8 zUBK;22qc06tt?S`qeI|u5+@~Yc(BEfQX-}urt^f$PGmqE=DIM;kF{W;K3)8fHNe4M zntl*iRq)vY!ORajfG%D-M~ri!joYONz^8Fx*@hZO?QsbD99pgt)hpO_c4EaP_59eGJMZfmDE)KXs@6O*{(sx(*&K(=< z%0A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 u~b&+B)M2f;k~&D5`f`n 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�-D$jGs8jOfT4>++$wP(9b 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

)9=jSR+@hrsoF^9-^{T2+litKMJD7_= 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%0DN$)$W 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 l^j5DAvveSM+wBVvv5T}_*V% + + +``` + +The full list of digests for every file can be found below. + +### Digests + +``` +sha384-gRTR/fmk+6+ygbihH/fJvHgmffnOrd/eO7DW5zgu1uN9GBohtDx+OBs0DI0ejigB /es/languages/bash.js +sha384-Pg7b9hYE6kefjcNqAabhv8jOLCVoZubUaM4bZFjUJd0CaaQ14ksDI0GVllMtAF4S /es/languages/bash.min.js +sha384-xhohaHGp8S443Qn4JZUYAcKqIIl0bQkFA79EUxpbX8GWb5oufdvvSI9ipl/Dasev /es/languages/c.js +sha384-xaTVEdq02jgKStoYDcZD8NhTN1XV/TWpIu4OM53MtMiLl08+e9YJNENo+R/6Nwp0 /es/languages/c.min.js +sha384-rFCBWxbZHxZD51qKR2cdayIcKUSHS3p1PWPIs1kjgsP7lu9ZP32ah/2DoQUm/rTg /es/languages/cpp.js +sha384-+1Koxl0St78gEZW5CpFK+dbLp7yNsfwLzzQUsSGimV4k/RVJUz6YvqtsqtdbJyKf /es/languages/cpp.min.js +sha384-0s8f7nphuRu8IIkFNCeOVZhvbjt7YKZEHl38OjfkCkdtnwIUvwRNbxxUHkCdcYjm /es/languages/csharp.js +sha384-xLfGW0hIBHie9xNFuVroNihI0BdEO8FKxOeCdyJBrO1eM7s5BsQ8F3fLtFydQZ+Z /es/languages/csharp.min.js +sha384-Gmvct15f4Mo9AXQG5bk5w78N1YjBLXXU3KIV7no+mOVnApXlwfw1dwjfueAwljIV /es/languages/css.js +sha384-1D7DbOic0Z5nM2ldSO9O/EsBfsg/5x7X7So1qnMgscI2ucDevptcg7cTvrD9rL0D /es/languages/css.min.js +sha384-CxgzMCYCdPS3oPSgukCqpDiqHKDKcrLdlyMqy9UF73u63+XVRlI32OproboitNa6 /es/languages/diff.js +sha384-joI34L4jMJOgkz6zOb3sqraHH5tmocRfXvs9HkdHfUpD3ceSxAqKlubpBT/4Q/sV /es/languages/diff.min.js +sha384-y5tpDG/EgM93k2unGm4XFn8l9V12Ru1tnk2TxhduZWqrEqAK86BQlDLuVAILe3OB /es/languages/go.js +sha384-/UGh0AcfdC41Di2LsNVYCPOJ24RfaUWWXniaZoGuM52DaQR7fwStKAHJumI+u5yY /es/languages/go.min.js +sha384-opjEyp4yq3g7Bxr5w5ZcG0+fTUsnOc798DWlLPzWPFIV+qGmKGkzzZIAr3822+oQ /es/languages/graphql.js +sha384-ycqZEp/d+8Lmf+CQrUvmfgcQkd5TJPU36i1WFGNiK18rlap/VJSTcPfSj/ft5Faf /es/languages/graphql.min.js +sha384-vZWLk+C+23/W/GAmv4PXkZSZo82LXul6DdSgWcMzutPxGltitIk38HyLrxRVsFvm /es/languages/ini.js +sha384-CVynu7LzwkkAUiajSi0jprssYhgg9Vi1WSd8iR84Vmi6JdRGq3DT4vvEfjzoxxOK /es/languages/ini.min.js +sha384-lk+aAr+DNq8Rz3hXPSZ7ga38GS+tQfXDvexuUnyDCSju1t1SAsLipVIFGlRtcUjE /es/languages/java.js +sha384-5GpB6kfA2w03pZhAUmmNSYvR5pLvne/Rzqc22BmHv+t9ES7ifMX/ZE7x5TBeqW4d /es/languages/java.min.js +sha384-g7t9fKR5Tvod4iWv7BQXN+/JMn5GT9sD6FG3h7Fgl+KCv5k4NnnCzEqUe7BMJ9Mv /es/languages/javascript.js +sha384-f7huPivS1dV2T5V+g0aJpgsY7WBHWCsioIq30tpNoXGizD65fWJYGuXXVPNI52VB /es/languages/javascript.min.js +sha384-8CRS96Xb/ZkZlQU+5ffA03XTN6/xY40QAnsXKB0Y+ow1vza1LAkRNPSrZqGSNo53 /es/languages/json.js +sha384-UHzaYxI/rAo84TEK3WlG15gVfPk49XKax76Ccn9qPWYbUxePCEHxjGkV+xp9HcS/ /es/languages/json.min.js +sha384-74O59Gvm0duu3aXH7S8RHhqn8YvAF1JlgCdNDq5MaClY/f/0bMs4zryv55Whwp2c /es/languages/kotlin.js +sha384-+aJFpyNBGTRiXRDN6BLrctauQBKExwSosxOiHLUYReXKTsckW/RgMavqX6W+zTBL /es/languages/kotlin.min.js +sha384-LRBDaxnf3ea3MTosn2yHFNe+ECfow/i4s71k6UdzkNOS1QvgHkcqRBTkDZC5aEoP /es/languages/less.js +sha384-EJ7n9HlCUKgtcBomJlrocJe2M2WegUc2r/TqymQdykuxcLeA25bQ5665qN58BWki /es/languages/less.min.js +sha384-5TnIBSbRIGDilxscXgaTNLZ8PZ9u7TEBPzF8b9z+wrbTN3e89MbD9zSSuDVdbDFj /es/languages/lua.js +sha384-HCBq0pjgKyOc3FNX31to33MxfNYza3HCbHLfWwdsnkH5r/VmmXTlRrvWSHTJyYvA /es/languages/lua.min.js +sha384-gXOyhc1mLm8alPswShRUsxnBadQf2AOcdpmFVqkKSZBNS07kTOHb3DDepD3Rf9eH /es/languages/makefile.js +sha384-iagI2W32nmVJq2EVd59zlgz2bFjR/MC0JRsbcFaeZL2gmvHzzOeyRTpTKGBSKd7q /es/languages/makefile.min.js +sha384-+KkqXkoHKtuOmUzhZ0BjyV0qjljnS+z6i4fELMEg5brFPtmDIog4zZMhylaBTsVi /es/languages/markdown.js +sha384-E7UvgBH6skA1FIOcn3B2c68GtJzrmZlOOC5p/fsxwihTZG/bBedJZu5PC1+kGX7q /es/languages/markdown.min.js +sha384-JoTXwNHosdzUqxg9EepqeL0yHV98o2Fy7EwTtN9awR+5d8T1EQRXmpdHjpRjxkUM /es/languages/objectivec.js +sha384-IA3s+KMOVf9zn8hH1+u4PCkGcunD2O3mNj4y10RDG/Wq7Gs7QWgiH6o01bjXeU1b /es/languages/objectivec.min.js +sha384-uat5CiOqKMoJM3KrhuhZShpWQriLSdeaJ4oT6XQFBg3YWhVDiofp4wa0SnBcV8LQ /es/languages/perl.js +sha384-doJqxKOhDf9Q9JYEBQXrTguSjzwPrbLiXJP2kdBkF+BYRNP55btwz9iH4b95mUTH /es/languages/perl.min.js +sha384-4OPZSHQbxzPqFMOXnndxQ6TZTI/B+J4W9aqTCHxAx/dsPS6GG25kT7wdsf66jJ1M /es/languages/php.js +sha384-VxmvZ2mUpp1EzFijS40RFvIc7vbv/d5PhMxVFG/3HMpVKD4sVvhdV9LThrJDiw9e /es/languages/php.min.js +sha384-Qin+c4lNK1aBTVV9uViy9uCeqaw3milnNPTq/TTWClWsc7ZBMi3kDc4d702bPhbf /es/languages/php-template.js +sha384-/Btu11Y1N5hp8EDB6nZJCif5GWMrSC/bYMh0Re/SH64ZoH2qZRHUtqv1SFRPbNdM /es/languages/php-template.min.js +sha384-i6sPjmXfHWLljAXTYYk0vBOwgsUnUKnKXKH41qzc9OMhaf5AFZqXH7azX4SYdUiR /es/languages/plaintext.js +sha384-OOrQLW97d+/1orj9gjftwbbQyV8LNAcgagqVKBhUYA08Hdi5w0p6VoB3yt2k7gnG /es/languages/plaintext.min.js +sha384-Cmq5lORXzyHraasLNqmfchH07JRXyEmjDF+j6tSggoXjYHwtgX/ySW6kkRytM5uu /es/languages/python.js +sha384-ZV5sgX70bBgLkDR5Mtox5UsbJedBc39hRKPdvTw6miK4lSkE/wv94cLY2iyZb/sB /es/languages/python.min.js +sha384-9jy7CI5TLYs91VYlZ4S0czQFpDsMzc9jakiJ5RqCFZugGpdPglP94JPAyEhMBwJp /es/languages/python-repl.js +sha384-CO+NiDedness48VlHW0FCIw9rQt8szFZ0IOXYiQo3LEAHLytXxM5NlKnmNYBUACQ /es/languages/python-repl.min.js +sha384-vAVurAb8AMWBKPHNWPze2lJa7m/as9wrF1wzH1FQKrJNNqiemBLJi3y6aGdyu5Zt /es/languages/r.js +sha384-WkipJgUBRzr12T7CtL8kF6QTuPHAl8f7Sx1YnmOm3KiVA/k3eDXfifuSvUW9M5nu /es/languages/r.min.js +sha384-JOe8PF7ynaYxu7HI5O0NuVfXMMXYSJlCJqP4TYVNNq0eDKgm/N2dqcmqvp9QfIDu /es/languages/ruby.js +sha384-DpXpbYSP6sX4tcP61ZRjSMsnmF8V3c/hQILWjrGWI2g3lresYaqbxVxs+tioFMJn /es/languages/ruby.min.js +sha384-JFRCn12yvr0NDhxPY8oZDk/G2Tjm7bGmqXy28Y0bq4J7D8mKha6jQJOXMB5wtTVr /es/languages/rust.js +sha384-JbkB8w/DGGyx29PIwSq8c/ZeiJB9T/X4mVAZFEyBiNlEAas98Q2NxpBPUlNIlE71 /es/languages/rust.min.js +sha384-R67rULqIohpEyV6aFbjxRv7xhK8v/KteX4cvOFmPcnZ2MTf65Zua+2DzB9MqqXuO /es/languages/scss.js +sha384-WMy5VYgOMFAnHhPJXVDCQ/Y/QPlUrBqNVPtFH6/gGg2F4uaAowyQ0y/9zWEeGpJe /es/languages/scss.min.js +sha384-1mmBZmAs44b6FtD9wpMiLJa8bLZgZv9xoAhngN6B5Q22y9CtcsU2lat0zlRtyVgy /es/languages/shell.js +sha384-u9PV7oWG/lZlm+GnftX7kn0w4b8rRfFxSv5SmJJPHWKGI03rz6VLqgZdQ1B5ez6b /es/languages/shell.min.js +sha384-s1ZfN6xtlNKAZux8QYAG7upUsit3RwK5XDoCAN3g6Kj33RrIqbmkuGjdNF9RvzPM /es/languages/sql.js +sha384-y25cn06synxhYnlKVprZdpakuFWVrm2jvn8pqiF4L85a05CI/6bNeT2+qXbUYIyW /es/languages/sql.min.js +sha384-sfRYvVvcwsysqkDUscQ/SqsFOSvNGkGX5vm/yKMHdTwTd7A++Pqx1QpJK0bGebPD /es/languages/swift.js +sha384-9NAaCxdhTO7TX6fYeUHyt+NC3ledirZOADyWdinDCTN1taeqj8sLLYqjE8YMf4Na /es/languages/swift.min.js +sha384-Z61gsCS2W7Q+3fT1fdya/Sz4wlmsotT9iEGzgIlNqP0soaKH1NzysutxWp08Hh3E /es/languages/typescript.js +sha384-Tv4mr9B7b+x2IynRXW/xcAxUj1+AoN9zyp0n9BWE1Nle3Zfm/zUeEztNLhIRjgE7 /es/languages/typescript.min.js +sha384-ZXhYu2xIPf1aci2kiX/n0hceCz4WwbJJs3QRE6ZwDXGzHRFWrsaYiQhBQSZ3Sx9K /es/languages/vbnet.js +sha384-ztGjA/YtvuFeKJwRqtrvV+3no91MVzQIzG5kQhHiIndfxmQOAum+vaaaDfA8Mg8U /es/languages/vbnet.min.js +sha384-82eHXc3kQTsEJ65AcO2c8eVqB9ynJzosSiMwdPYwt5oNRVsMKuxWoWkO5KFekVYB /es/languages/wasm.js +sha384-YBbT3eXpwj5Ddx0MS774iycYICw4gZ1Rs1ExYGIdcYC4EJhaWsfd9uNlaJZBuDaa /es/languages/wasm.min.js +sha384-9ECFzM+oWDye4s/MFx3QUXGo4mW43+SyLpWUDeQtWup6GZJ+KHFxVS89PmZt/fzl /es/languages/xml.js +sha384-PQrsaWeWrBiE1CFRw8K335CaJuQRTjDGm73vn8bXvlwaw6RyqWObdvMTBS8B75NN /es/languages/xml.min.js +sha384-7HTgKp/l2rzlyrh5vUfbfZVy+Wx1lKO4iGmfqvakienApv21u55lo+Vi+iVg4jY0 /es/languages/yaml.js +sha384-4smueUtgWTorlNLbaQIawnVCcIAuw82NetPOGWN5PbZT/pMr0rjvZXj0EUzJV1nr /es/languages/yaml.min.js +sha384-Jrkpn2hK0TY04skYBXB9fj7mMpKYy7g726cPwXGXf6mdBXnFlTDXFduxikMCRXT7 /languages/bash.js +sha384-BbT8tZtvkh8HPXIvL5RtzuljBwI3gR5KIdYxZyYSyI5C/+KNAGdzAiexvmxuroag /languages/bash.min.js +sha384-lAz0Eyld5DmFJB7cxaZonrkUJzGefh+K3niV5d7+vzzS7/P7FEeCJeLNXzMjeo+N /languages/c.js +sha384-tMmX0hBMZeMrZhX6dUNxA94/DNJLl70ao6qu2N9+b/6Ep9Y2e1pBzVjxtLygIB+d /languages/c.min.js +sha384-Z5Ja/rxBluJ4iPYwJYn2numfw2XFmlp3qLL1aJ1SZqyTjKWwMh9yWfpNCOqf3vAm /languages/cpp.js +sha384-B711MHXDqRvH/pKkxJk84RyRt9g0qyAJFsu2XukZKoCdnEiBmA6Aq9fO23ZCS7qk /languages/cpp.min.js +sha384-NTF0oluJbKDCxwGTujk+IsRQRbf+waUyDilA5GhOA+VSoxhyApQpmDWMjxfFO3dt /languages/csharp.js +sha384-Z+o7SU/ldIEIdOIqpMV+9s2n8EE1rZTFSRv5Sd7rlaSoPTpyflmmZ/oRb6ycw/2s /languages/csharp.min.js +sha384-bsb3QmLtUiyaiHwtrL4YoAVI9yLsjyqxgoAsk4Zd+ass9rSK1WWRiCDSu/hm8QRp /languages/css.js +sha384-0XGvxIU7Oq1DQMMBr1ORiozzBq3KpZPE/74mJysWRBAop1dZ9Ioq/qRWe8u30Ded /languages/css.min.js +sha384-UZBiDq19/Pu+BEZTOdnKdnew0sCWKFa2EmtRr9O+ZndYF1NgJOlya5bua3Wf++BW /languages/diff.js +sha384-04MxX6iQ0WrwX6Df4GJWGCXwfr5hVS5CQ0r9CS7aunho7Fkj/AAWbEPU8a6G+4LA /languages/diff.min.js +sha384-uh0SMHiaDpf+y9t0NE6+t9c3aMlzs8mHPxmkEU3fY12P481V2wNrKoxPMlKVG61k /languages/go.js +sha384-HdearVH8cyfzwBIQOjL/6dSEmZxQ5rJRezN7spps8E7iu+R6utS8c2ab0AgBNFfH /languages/go.min.js +sha384-IOWs5jCSdfqtJw3g+55axGoOxl+91x7BjVqyS+nhmIO3riBINecgkX3IyhdIjNQB /languages/graphql.js +sha384-M04f/a+xFV20/v8ZQLe5lPeqUKrH0A0h6HUSWFRvq4RE4xlU1yaJIE5XqNSuR2Ke /languages/graphql.min.js +sha384-izwcylRNWmKKRcyCyrYZyNQekUCyR7Fh1x8nYWNCRJoRDU5JXv6TcqlP4C+4MfIf /languages/ini.js +sha384-NrmnsdarwteQHPGjt70kaQTi1KE0XfOJNX9/VJSg6wWwU6U2nPzjl3iWkgU1cvyx /languages/ini.min.js +sha384-Dprg6CdFFkimxaHg7qM7njVaWLMlOLqughixPERBDbm0cHdX6rKujTnJReof8O6m /languages/java.js +sha384-e+59xEZvRMXSRGD31B3HOBGAGqhhs+bbkxCqPuJDkSX5QGneIGTIfwdYJckTN3AO /languages/java.min.js +sha384-yxv7Fv9ToggiLsR67t98hV5ZRup6XX6xL1Rkbi/cGV5J8y7fosCi9POqlBkiBWFg /languages/javascript.js +sha384-tPOrIubtDHoQU7Rqw0o88ilthGO0/4xEZGB47XrQKWhrc1/SchwsDx+AP74u4nk0 /languages/javascript.min.js +sha384-pUlqdjoNePvHvdi7GVKJJnh/P2T3EvXXodl5j0JtTkbNC4DRH7gwGbcHFa84bFOP /languages/json.js +sha384-3C+cPClJZgjKFYAb0bh35D7im2jasLzgk9eRix3t1c5pk1+x6b+bHghWcdrKwIo3 /languages/json.min.js +sha384-vIyPs+G4S+ut5NV5tBIN5/E17wBiWbTTkFPPFbBC+r/FZOD95/fbcSzzeo00bE3x /languages/kotlin.js +sha384-7abn027YsNDPFilpW9aLlNUanPrq7Ht81zKQL9MKQq6/nkKrLczChRK5OA8GSKep /languages/kotlin.min.js +sha384-KSqRjSg7Nn1FuuRUtjB7br82XVgWtqos5H9BlvRY1j5YQr2lftIUSg5deukqK89p /languages/less.js +sha384-M7Wfa4KRyfGnn1i52Nqpr5zWcrmVaO0luxCB+2Txz1eI2FRQfpDcNimn1f86K2Cp /languages/less.min.js +sha384-IQZHDTDQQ0zpXf1FfEYOFIfjZrBbLbNXYCn4zukU6u9mLf6JI36vvIRaV6/d175T /languages/lua.js +sha384-dbTI+BVfiAlIfjWMYrH83f/x/GYSKbujaX4g4F7q5YxbGtlS7qTLcwBQQvDdsGf6 /languages/lua.min.js +sha384-NpIMNHXY0x67yhJSnXiHh9V28uT0Bfz2cKxc30p9vURMu5IAcDhJT1TpaqUE1x0B /languages/makefile.js +sha384-DjL90zP08vzabGXs0CglFocqoxPXnzAcKhobGV+CQDA5FHGW7xCnxjylOhna+HB+ /languages/makefile.min.js +sha384-Sk9XW/OOutdl6KS1M9Wson0imuqr0LkpoTRDHi5QFH4MWe0aViI5d86BOVkh8Ds0 /languages/markdown.js +sha384-Rv26WbhHH4MDPzeExq4ECmZUYF942tlfVhqA91Drw1P+Ey55KjihLF9RJENxjWr1 /languages/markdown.min.js +sha384-hpU4KjKsUFgTYugJheYLkhFIEvecxLYra9Fg0ptjxqCxlUyMCJirJD/2IQDjZihD /languages/objectivec.js +sha384-azcLq84HapvEpXsDDJ2m1n7KovejGjCdGV4Ilw9xlcb6Yg2EyGNVr5dHZyoLdVDw /languages/objectivec.min.js +sha384-qLoCYnNDldQrhnuTfd5BAc54A/ulhuQYKYDYiU+iJRa87k5owWYLvnL0ttLWmFKQ /languages/perl.js +sha384-PK5CVcMiWQ08dZFregTL56n1urRNEsSuWT6oiH1sFm/2ac/epI35hC5lx+YzjH5U /languages/perl.min.js +sha384-0XBmTxpMLuDjB2zdfbi3Lv4Yokm2e1YFGZ9mCmI5887Kpi23jMF5N7rPrf0GdoU/ /languages/php.js +sha384-Bv/Sxv6HlOzYOdV1iQpJTG3xiqGWIIMq9xsFfEX8ss7oNWMgKqOa/J2WSFG2m7Jd /languages/php.min.js +sha384-DQroZ14Erpo7ay5JoNeZEUe41UI7w0Jra2nABCsZVG/EJVO5Zfb2sS1fEt/YGGPe /languages/php-template.js +sha384-LIzUVMUAZRreWHTENKQ/wXuNK17VO4xPf+kR1a0aBKvM3S7vsedCcFJZC7N7vdDt /languages/php-template.min.js +sha384-MZKv9uidO1+VnHz8xWxPv6ACuLO5t823eanvTcKYnmi/ocdVYD8zKZNTxmF0nKEM /languages/plaintext.js +sha384-Z9EdtPaC8UiXHEq1WuQTdvqT+FwjLwaVTIwTCZW/dGfiU9nbF8Shvltrhqtw83Qb /languages/plaintext.min.js +sha384-ueSSFZFqg7cVD0dpEqIk9EefJiJUYan0PH6I8u/p+bNLLx7dMs4J2keMaFXqCN8P /languages/python.js +sha384-eXRt+aAa2ig1yFVDQCLis8k9s/1dikTcigj+/R07yNdIxc8BAG/b1uHDyEW3of17 /languages/python.min.js +sha384-Zr5t2YaLU0giGFY/MuBA8UrK47JGpd9DuryiosYFRSQ6EJfTIF9mt8IJp/4/hpOU /languages/python-repl.js +sha384-n3iFvvEGhuJlnYpLj6JaCg7WiOhd8kQfKTZBDnpJwFZ0puRMhoq9JWtKDRw5Snyq /languages/python-repl.min.js +sha384-Wnn+wk2C8+hIgCNyvLC1dFTsN01c/yrpVqpKDNYF1M0Rg5kYCCmO8o8lS/yY3w2D /languages/r.js +sha384-poz1JEq/ihCmK+1p8IXPoluMlou+rnb+4Q3DenGB+mkNBB/JZkT0c/TERX8D+RUX /languages/r.min.js +sha384-6rhZe8x0LGCtYYrvHFTyO9QfZq2jHdoFsruI9B+lvUD0+Gc2Bn4JW0+cEC94ly3c /languages/ruby.js +sha384-Rlnlnjp0sedK9HVa29DtCyVFVEDRZyeTMQ6+aOKUaXptJmpVGTEmCk6ziXfmku6l /languages/ruby.min.js +sha384-4hMItQrXDnquJWRbDiZ+cP4udu1pcJlCVFg3Ytv9OgWNbpIwzizsWbIwzA1BAJrI /languages/rust.js +sha384-kENps59cKQW5DV3vOEzpSp6tfGzWGpPYKz748i4gGziVSjieRtupNNu/WEwG3s8n /languages/rust.min.js +sha384-e5MJZgawCv4c+BexmFUMVQU6dLcIOXdieG/a1FPCIgnlGfBIEUUcFMMo+UrKMOtN /languages/scss.js +sha384-BYdYy4D3IX6eNNlKqsviUjxC6EqavvNwCVDMzmie3QXyArWdCQf+VvvFo4ciaNaW /languages/scss.min.js +sha384-BanM6jNzM3hgNw0Vu3gSe58a3MK3PSlMUzh5s8QaaDzIvTWgB0jNetV3rNxteKHy /languages/shell.js +sha384-mSZF08WaP0Llc4GMwE0KA2V9yfZQimO5PvfcXf2AATDdqri3Q7IdV7pfbhVPJCHV /languages/shell.min.js +sha384-2sXmcW3eKeNDWiLtuq9NgFJC4NsLBN/fDTzZevmcgBrSERv6iO/k+c7r9T09Fb8J /languages/sql.js +sha384-jrnLoVn13sB+/dTfoAYVPhg0tYGQzzuzSGP3WTk8OvKAY0hDejpUXFYYI3bohAyW /languages/sql.min.js +sha384-+juhAXbxlgltos7eNuzta0Y7hfKqGQftMcEEStYqBJftSEdIiLd/FaviI8hs4d86 /languages/swift.js +sha384-CCauhmYx0fwWViYO6uiTII5shLTfiY/OzxKmLRTeCp8Ok81I2nXZS2Gb9lJVOSPC /languages/swift.min.js +sha384-8v3YMaXFO9cmTNxsHWqwn9wJsV1jVO7rwx4huxqlEQpT/P2tuDbtm+Hs0EdYqu0a /languages/typescript.js +sha384-df1w1nJ43GNwmgbSCrT8YFIYyqFAm+lzj+b6ofuziX8Cfdg9QHFwbORDgAaj//wi /languages/typescript.min.js +sha384-PWtej+1fbEACjPO/+i55ybZvKUn+nUtSRAkFKLQx6O4zrFbiIUlmnErVVh6oZAxa /languages/vbnet.js +sha384-9jaz2rSOFx5kYjZB+Loaf0a4ipf9Yvk08+8QskyozD+yaHdA14SgQKv0C52/UooX /languages/vbnet.min.js +sha384-TCN/hvup/XKpDtGmR/RyK6NSG247wkNROUpO2sAoJuwpMvcr4KP9HA+K5L2rvOKg /languages/wasm.js +sha384-J3pUKFGnHJH0czAle+lKF96F/08caYKJfTEzlt5dGbGTR9M4BwOeOqAgvSzsjOsP /languages/wasm.min.js +sha384-Pgzg6a405W6U1xFjjSs5i8d7V81Tmt/TYn8HFOa+u1psDc8cbs8nC7BuyNXbWWRK /languages/xml.js +sha384-FQjSArDMJE4WMAJGcCNAV+IXIOljcIxM3UFAD2vxjedWmBnnDaAyqRG7AQHf/uM/ /languages/xml.min.js +sha384-6GXi9L5BnOWPU6bzwYL78Zscp23qyDdMLZpZvp4mLzvF2qt0eY/DfsPHiFVXq4hv /languages/yaml.js +sha384-A/iMReLA0Bo3tLydBIoOQXQzYnrwL90jkHYUubrtERUGCbIuU7U0EHge0Xd2s5sr /languages/yaml.min.js +sha384-5ka3JsbfeTzh/0oDZbLvQwZvfZF6OxAjEYtEbOSTzc/Hr3cowRFHlvRVl9BEVkFr /highlight.js +sha384-DfuUw42ioE+mBJmUkFRnFbaafZ8+pICt6pnhycbXgWm4QiFC0B22CJt6WcvWs/40 /highlight.min.js +``` + diff --git a/backend/static/highlight(1)/LICENSE b/backend/static/highlight(1)/LICENSE new file mode 100644 index 0000000..2250cc7 --- /dev/null +++ b/backend/static/highlight(1)/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2006, Ivan Sagalaev. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/backend/static/highlight(1)/README.md b/backend/static/highlight(1)/README.md new file mode 100644 index 0000000..30d84b9 --- /dev/null +++ b/backend/static/highlight(1)/README.md @@ -0,0 +1,45 @@ +# Highlight.js CDN Assets + +[![install size](https://packagephobia.now.sh/badge?p=highlight.js)](https://packagephobia.now.sh/result?p=highlight.js) + +**This package contains only the CDN build assets of highlight.js.** + +This may be what you want if you'd like to install the pre-built distributable highlight.js client-side assets via NPM. If you're wanting to use highlight.js mainly on the server-side you likely want the [highlight.js][1] package instead. + +To access these files via CDN:
+https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@latest/build/ + +**If you just want a single .js file with the common languages built-in: +** + +--- + +## Highlight.js + +Highlight.js is a syntax highlighter written in JavaScript. It works in +the browser as well as on the server. It works with pretty much any +markup, doesn’t depend on any framework, and has automatic language +detection. + +If you'd like to read the full README:
+ + +## License + +Highlight.js is released under the BSD License. See [LICENSE][7] file +for details. + +## Links + +The official site for the library is at . + +The Github project may be found at: + +Further in-depth documentation for the API and other topics is at +. + +A list of the Core Team and contributors can be found in the [CONTRIBUTORS.md][8] file. + +[1]: https://www.npmjs.com/package/highlight.js +[7]: https://github.com/highlightjs/highlight.js/blob/main/LICENSE +[8]: https://github.com/highlightjs/highlight.js/blob/main/CONTRIBUTORS.md diff --git a/backend/static/highlight(1)/es/core.js b/backend/static/highlight(1)/es/core.js new file mode 100644 index 0000000..f8a828d --- /dev/null +++ b/backend/static/highlight(1)/es/core.js @@ -0,0 +1,2600 @@ +/*! + Highlight.js v11.11.1 (git: 08cb242e7d) + (c) 2006-2025 Josh Goebel and other contributors + License: BSD-3-Clause + */ +/* eslint-disable no-multi-assign */ + +function deepFreeze(obj) { + if (obj instanceof Map) { + obj.clear = + obj.delete = + obj.set = + function () { + throw new Error('map is read-only'); + }; + } else if (obj instanceof Set) { + obj.add = + obj.clear = + obj.delete = + function () { + throw new Error('set is read-only'); + }; + } + + // Freeze self + Object.freeze(obj); + + Object.getOwnPropertyNames(obj).forEach((name) => { + const prop = obj[name]; + const type = typeof prop; + + // Freeze prop if it is an object or function and also not already frozen + if ((type === 'object' || type === 'function') && !Object.isFrozen(prop)) { + deepFreeze(prop); + } + }); + + return obj; +} + +/** @typedef {import('highlight.js').CallbackResponse} CallbackResponse */ +/** @typedef {import('highlight.js').CompiledMode} CompiledMode */ +/** @implements CallbackResponse */ + +class Response { + /** + * @param {CompiledMode} mode + */ + constructor(mode) { + // eslint-disable-next-line no-undefined + if (mode.data === undefined) mode.data = {}; + + this.data = mode.data; + this.isMatchIgnored = false; + } + + ignoreMatch() { + this.isMatchIgnored = true; + } +} + +/** + * @param {string} value + * @returns {string} + */ +function escapeHTML(value) { + return value + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +/** + * performs a shallow merge of multiple objects into one + * + * @template T + * @param {T} original + * @param {Record[]} objects + * @returns {T} a single new object + */ +function inherit$1(original, ...objects) { + /** @type Record */ + const result = Object.create(null); + + for (const key in original) { + result[key] = original[key]; + } + objects.forEach(function(obj) { + for (const key in obj) { + result[key] = obj[key]; + } + }); + return /** @type {T} */ (result); +} + +/** + * @typedef {object} Renderer + * @property {(text: string) => void} addText + * @property {(node: Node) => void} openNode + * @property {(node: Node) => void} closeNode + * @property {() => string} value + */ + +/** @typedef {{scope?: string, language?: string, sublanguage?: boolean}} Node */ +/** @typedef {{walk: (r: Renderer) => void}} Tree */ +/** */ + +const SPAN_CLOSE = ''; + +/** + * Determines if a node needs to be wrapped in + * + * @param {Node} node */ +const emitsWrappingTags = (node) => { + // rarely we can have a sublanguage where language is undefined + // TODO: track down why + return !!node.scope; +}; + +/** + * + * @param {string} name + * @param {{prefix:string}} options + */ +const scopeToCSSClass = (name, { prefix }) => { + // sub-language + if (name.startsWith("language:")) { + return name.replace("language:", "language-"); + } + // tiered scope: comment.line + if (name.includes(".")) { + const pieces = name.split("."); + return [ + `${prefix}${pieces.shift()}`, + ...(pieces.map((x, i) => `${x}${"_".repeat(i + 1)}`)) + ].join(" "); + } + // simple scope + return `${prefix}${name}`; +}; + +/** @type {Renderer} */ +class HTMLRenderer { + /** + * Creates a new HTMLRenderer + * + * @param {Tree} parseTree - the parse tree (must support `walk` API) + * @param {{classPrefix: string}} options + */ + constructor(parseTree, options) { + this.buffer = ""; + this.classPrefix = options.classPrefix; + parseTree.walk(this); + } + + /** + * Adds texts to the output stream + * + * @param {string} text */ + addText(text) { + this.buffer += escapeHTML(text); + } + + /** + * Adds a node open to the output stream (if needed) + * + * @param {Node} node */ + openNode(node) { + if (!emitsWrappingTags(node)) return; + + const className = scopeToCSSClass(node.scope, + { prefix: this.classPrefix }); + this.span(className); + } + + /** + * Adds a node close to the output stream (if needed) + * + * @param {Node} node */ + closeNode(node) { + if (!emitsWrappingTags(node)) return; + + this.buffer += SPAN_CLOSE; + } + + /** + * returns the accumulated buffer + */ + value() { + return this.buffer; + } + + // helpers + + /** + * Builds a span element + * + * @param {string} className */ + span(className) { + this.buffer += ``; + } +} + +/** @typedef {{scope?: string, language?: string, children: Node[]} | string} Node */ +/** @typedef {{scope?: string, language?: string, children: Node[]} } DataNode */ +/** @typedef {import('highlight.js').Emitter} Emitter */ +/** */ + +/** @returns {DataNode} */ +const newNode = (opts = {}) => { + /** @type DataNode */ + const result = { children: [] }; + Object.assign(result, opts); + return result; +}; + +class TokenTree { + constructor() { + /** @type DataNode */ + this.rootNode = newNode(); + this.stack = [this.rootNode]; + } + + get top() { + return this.stack[this.stack.length - 1]; + } + + get root() { return this.rootNode; } + + /** @param {Node} node */ + add(node) { + this.top.children.push(node); + } + + /** @param {string} scope */ + openNode(scope) { + /** @type Node */ + const node = newNode({ scope }); + this.add(node); + this.stack.push(node); + } + + closeNode() { + if (this.stack.length > 1) { + return this.stack.pop(); + } + // eslint-disable-next-line no-undefined + return undefined; + } + + closeAllNodes() { + while (this.closeNode()); + } + + toJSON() { + return JSON.stringify(this.rootNode, null, 4); + } + + /** + * @typedef { import("./html_renderer").Renderer } Renderer + * @param {Renderer} builder + */ + walk(builder) { + // this does not + return this.constructor._walk(builder, this.rootNode); + // this works + // return TokenTree._walk(builder, this.rootNode); + } + + /** + * @param {Renderer} builder + * @param {Node} node + */ + static _walk(builder, node) { + if (typeof node === "string") { + builder.addText(node); + } else if (node.children) { + builder.openNode(node); + node.children.forEach((child) => this._walk(builder, child)); + builder.closeNode(node); + } + return builder; + } + + /** + * @param {Node} node + */ + static _collapse(node) { + if (typeof node === "string") return; + if (!node.children) return; + + if (node.children.every(el => typeof el === "string")) { + // node.text = node.children.join(""); + // delete node.children; + node.children = [node.children.join("")]; + } else { + node.children.forEach((child) => { + TokenTree._collapse(child); + }); + } + } +} + +/** + Currently this is all private API, but this is the minimal API necessary + that an Emitter must implement to fully support the parser. + + Minimal interface: + + - addText(text) + - __addSublanguage(emitter, subLanguageName) + - startScope(scope) + - endScope() + - finalize() + - toHTML() + +*/ + +/** + * @implements {Emitter} + */ +class TokenTreeEmitter extends TokenTree { + /** + * @param {*} options + */ + constructor(options) { + super(); + this.options = options; + } + + /** + * @param {string} text + */ + addText(text) { + if (text === "") { return; } + + this.add(text); + } + + /** @param {string} scope */ + startScope(scope) { + this.openNode(scope); + } + + endScope() { + this.closeNode(); + } + + /** + * @param {Emitter & {root: DataNode}} emitter + * @param {string} name + */ + __addSublanguage(emitter, name) { + /** @type DataNode */ + const node = emitter.root; + if (name) node.scope = `language:${name}`; + + this.add(node); + } + + toHTML() { + const renderer = new HTMLRenderer(this, this.options); + return renderer.value(); + } + + finalize() { + this.closeAllNodes(); + return true; + } +} + +/** + * @param {string} value + * @returns {RegExp} + * */ + +/** + * @param {RegExp | string } re + * @returns {string} + */ +function source(re) { + if (!re) return null; + if (typeof re === "string") return re; + + return re.source; +} + +/** + * @param {RegExp | string } re + * @returns {string} + */ +function lookahead(re) { + return concat('(?=', re, ')'); +} + +/** + * @param {RegExp | string } re + * @returns {string} + */ +function anyNumberOfTimes(re) { + return concat('(?:', re, ')*'); +} + +/** + * @param {RegExp | string } re + * @returns {string} + */ +function optional(re) { + return concat('(?:', re, ')?'); +} + +/** + * @param {...(RegExp | string) } args + * @returns {string} + */ +function concat(...args) { + const joined = args.map((x) => source(x)).join(""); + return joined; +} + +/** + * @param { Array } args + * @returns {object} + */ +function stripOptionsFromArgs(args) { + const opts = args[args.length - 1]; + + if (typeof opts === 'object' && opts.constructor === Object) { + args.splice(args.length - 1, 1); + return opts; + } else { + return {}; + } +} + +/** @typedef { {capture?: boolean} } RegexEitherOptions */ + +/** + * Any of the passed expresssions may match + * + * Creates a huge this | this | that | that match + * @param {(RegExp | string)[] | [...(RegExp | string)[], RegexEitherOptions]} args + * @returns {string} + */ +function either(...args) { + /** @type { object & {capture?: boolean} } */ + const opts = stripOptionsFromArgs(args); + const joined = '(' + + (opts.capture ? "" : "?:") + + args.map((x) => source(x)).join("|") + ")"; + return joined; +} + +/** + * @param {RegExp | string} re + * @returns {number} + */ +function countMatchGroups(re) { + return (new RegExp(re.toString() + '|')).exec('').length - 1; +} + +/** + * Does lexeme start with a regular expression match at the beginning + * @param {RegExp} re + * @param {string} lexeme + */ +function startsWith(re, lexeme) { + const match = re && re.exec(lexeme); + return match && match.index === 0; +} + +// BACKREF_RE matches an open parenthesis or backreference. To avoid +// an incorrect parse, it additionally matches the following: +// - [...] elements, where the meaning of parentheses and escapes change +// - other escape sequences, so we do not misparse escape sequences as +// interesting elements +// - non-matching or lookahead parentheses, which do not capture. These +// follow the '(' with a '?'. +const BACKREF_RE = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./; + +// **INTERNAL** Not intended for outside usage +// join logically computes regexps.join(separator), but fixes the +// backreferences so they continue to match. +// it also places each individual regular expression into it's own +// match group, keeping track of the sequencing of those match groups +// is currently an exercise for the caller. :-) +/** + * @param {(string | RegExp)[]} regexps + * @param {{joinWith: string}} opts + * @returns {string} + */ +function _rewriteBackreferences(regexps, { joinWith }) { + let numCaptures = 0; + + return regexps.map((regex) => { + numCaptures += 1; + const offset = numCaptures; + let re = source(regex); + let out = ''; + + while (re.length > 0) { + const match = BACKREF_RE.exec(re); + if (!match) { + out += re; + break; + } + out += re.substring(0, match.index); + re = re.substring(match.index + match[0].length); + if (match[0][0] === '\\' && match[1]) { + // Adjust the backreference. + out += '\\' + String(Number(match[1]) + offset); + } else { + out += match[0]; + if (match[0] === '(') { + numCaptures++; + } + } + } + return out; + }).map(re => `(${re})`).join(joinWith); +} + +/** @typedef {import('highlight.js').Mode} Mode */ +/** @typedef {import('highlight.js').ModeCallback} ModeCallback */ + +// Common regexps +const MATCH_NOTHING_RE = /\b\B/; +const IDENT_RE = '[a-zA-Z]\\w*'; +const UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\w*'; +const NUMBER_RE = '\\b\\d+(\\.\\d+)?'; +const C_NUMBER_RE = '(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)'; // 0x..., 0..., decimal, float +const BINARY_NUMBER_RE = '\\b(0b[01]+)'; // 0b... +const RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~'; + +/** +* @param { Partial & {binary?: string | RegExp} } opts +*/ +const SHEBANG = (opts = {}) => { + const beginShebang = /^#![ ]*\//; + if (opts.binary) { + opts.begin = concat( + beginShebang, + /.*\b/, + opts.binary, + /\b.*/); + } + return inherit$1({ + scope: 'meta', + begin: beginShebang, + end: /$/, + relevance: 0, + /** @type {ModeCallback} */ + "on:begin": (m, resp) => { + if (m.index !== 0) resp.ignoreMatch(); + } + }, opts); +}; + +// Common modes +const BACKSLASH_ESCAPE = { + begin: '\\\\[\\s\\S]', relevance: 0 +}; +const APOS_STRING_MODE = { + scope: 'string', + begin: '\'', + end: '\'', + illegal: '\\n', + contains: [BACKSLASH_ESCAPE] +}; +const QUOTE_STRING_MODE = { + scope: 'string', + begin: '"', + end: '"', + illegal: '\\n', + contains: [BACKSLASH_ESCAPE] +}; +const PHRASAL_WORDS_MODE = { + begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +}; +/** + * Creates a comment mode + * + * @param {string | RegExp} begin + * @param {string | RegExp} end + * @param {Mode | {}} [modeOptions] + * @returns {Partial} + */ +const COMMENT = function(begin, end, modeOptions = {}) { + const mode = inherit$1( + { + scope: 'comment', + begin, + end, + contains: [] + }, + modeOptions + ); + mode.contains.push({ + scope: 'doctag', + // hack to avoid the space from being included. the space is necessary to + // match here to prevent the plain text rule below from gobbling up doctags + begin: '[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)', + end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/, + excludeBegin: true, + relevance: 0 + }); + const ENGLISH_WORD = either( + // list of common 1 and 2 letter words in English + "I", + "a", + "is", + "so", + "us", + "to", + "at", + "if", + "in", + "it", + "on", + // note: this is not an exhaustive list of contractions, just popular ones + /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, // contractions - can't we'd they're let's, etc + /[A-Za-z]+[-][a-z]+/, // `no-way`, etc. + /[A-Za-z][a-z]{2,}/ // allow capitalized words at beginning of sentences + ); + // looking like plain text, more likely to be a comment + mode.contains.push( + { + // TODO: how to include ", (, ) without breaking grammars that use these for + // comment delimiters? + // begin: /[ ]+([()"]?([A-Za-z'-]{3,}|is|a|I|so|us|[tT][oO]|at|if|in|it|on)[.]?[()":]?([.][ ]|[ ]|\))){3}/ + // --- + + // this tries to find sequences of 3 english words in a row (without any + // "programming" type syntax) this gives us a strong signal that we've + // TRULY found a comment - vs perhaps scanning with the wrong language. + // It's possible to find something that LOOKS like the start of the + // comment - but then if there is no readable text - good chance it is a + // false match and not a comment. + // + // for a visual example please see: + // https://github.com/highlightjs/highlight.js/issues/2827 + + begin: concat( + /[ ]+/, // necessary to prevent us gobbling up doctags like /* @author Bob Mcgill */ + '(', + ENGLISH_WORD, + /[.]?[:]?([.][ ]|[ ])/, + '){3}') // look for 3 words in a row + } + ); + return mode; +}; +const C_LINE_COMMENT_MODE = COMMENT('//', '$'); +const C_BLOCK_COMMENT_MODE = COMMENT('/\\*', '\\*/'); +const HASH_COMMENT_MODE = COMMENT('#', '$'); +const NUMBER_MODE = { + scope: 'number', + begin: NUMBER_RE, + relevance: 0 +}; +const C_NUMBER_MODE = { + scope: 'number', + begin: C_NUMBER_RE, + relevance: 0 +}; +const BINARY_NUMBER_MODE = { + scope: 'number', + begin: BINARY_NUMBER_RE, + relevance: 0 +}; +const REGEXP_MODE = { + scope: "regexp", + begin: /\/(?=[^/\n]*\/)/, + end: /\/[gimuy]*/, + contains: [ + BACKSLASH_ESCAPE, + { + begin: /\[/, + end: /\]/, + relevance: 0, + contains: [BACKSLASH_ESCAPE] + } + ] +}; +const TITLE_MODE = { + scope: 'title', + begin: IDENT_RE, + relevance: 0 +}; +const UNDERSCORE_TITLE_MODE = { + scope: 'title', + begin: UNDERSCORE_IDENT_RE, + relevance: 0 +}; +const METHOD_GUARD = { + // excludes method names from keyword processing + begin: '\\.\\s*' + UNDERSCORE_IDENT_RE, + relevance: 0 +}; + +/** + * Adds end same as begin mechanics to a mode + * + * Your mode must include at least a single () match group as that first match + * group is what is used for comparison + * @param {Partial} mode + */ +const END_SAME_AS_BEGIN = function(mode) { + return Object.assign(mode, + { + /** @type {ModeCallback} */ + 'on:begin': (m, resp) => { resp.data._beginMatch = m[1]; }, + /** @type {ModeCallback} */ + 'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); } + }); +}; + +var MODES = /*#__PURE__*/Object.freeze({ + __proto__: null, + APOS_STRING_MODE: APOS_STRING_MODE, + BACKSLASH_ESCAPE: BACKSLASH_ESCAPE, + BINARY_NUMBER_MODE: BINARY_NUMBER_MODE, + BINARY_NUMBER_RE: BINARY_NUMBER_RE, + COMMENT: COMMENT, + C_BLOCK_COMMENT_MODE: C_BLOCK_COMMENT_MODE, + C_LINE_COMMENT_MODE: C_LINE_COMMENT_MODE, + C_NUMBER_MODE: C_NUMBER_MODE, + C_NUMBER_RE: C_NUMBER_RE, + END_SAME_AS_BEGIN: END_SAME_AS_BEGIN, + HASH_COMMENT_MODE: HASH_COMMENT_MODE, + IDENT_RE: IDENT_RE, + MATCH_NOTHING_RE: MATCH_NOTHING_RE, + METHOD_GUARD: METHOD_GUARD, + NUMBER_MODE: NUMBER_MODE, + NUMBER_RE: NUMBER_RE, + PHRASAL_WORDS_MODE: PHRASAL_WORDS_MODE, + QUOTE_STRING_MODE: QUOTE_STRING_MODE, + REGEXP_MODE: REGEXP_MODE, + RE_STARTERS_RE: RE_STARTERS_RE, + SHEBANG: SHEBANG, + TITLE_MODE: TITLE_MODE, + UNDERSCORE_IDENT_RE: UNDERSCORE_IDENT_RE, + UNDERSCORE_TITLE_MODE: UNDERSCORE_TITLE_MODE +}); + +/** +@typedef {import('highlight.js').CallbackResponse} CallbackResponse +@typedef {import('highlight.js').CompilerExt} CompilerExt +*/ + +// Grammar extensions / plugins +// See: https://github.com/highlightjs/highlight.js/issues/2833 + +// Grammar extensions allow "syntactic sugar" to be added to the grammar modes +// without requiring any underlying changes to the compiler internals. + +// `compileMatch` being the perfect small example of now allowing a grammar +// author to write `match` when they desire to match a single expression rather +// than being forced to use `begin`. The extension then just moves `match` into +// `begin` when it runs. Ie, no features have been added, but we've just made +// the experience of writing (and reading grammars) a little bit nicer. + +// ------ + +// TODO: We need negative look-behind support to do this properly +/** + * Skip a match if it has a preceding dot + * + * This is used for `beginKeywords` to prevent matching expressions such as + * `bob.keyword.do()`. The mode compiler automatically wires this up as a + * special _internal_ 'on:begin' callback for modes with `beginKeywords` + * @param {RegExpMatchArray} match + * @param {CallbackResponse} response + */ +function skipIfHasPrecedingDot(match, response) { + const before = match.input[match.index - 1]; + if (before === ".") { + response.ignoreMatch(); + } +} + +/** + * + * @type {CompilerExt} + */ +function scopeClassName(mode, _parent) { + // eslint-disable-next-line no-undefined + if (mode.className !== undefined) { + mode.scope = mode.className; + delete mode.className; + } +} + +/** + * `beginKeywords` syntactic sugar + * @type {CompilerExt} + */ +function beginKeywords(mode, parent) { + if (!parent) return; + if (!mode.beginKeywords) return; + + // for languages with keywords that include non-word characters checking for + // a word boundary is not sufficient, so instead we check for a word boundary + // or whitespace - this does no harm in any case since our keyword engine + // doesn't allow spaces in keywords anyways and we still check for the boundary + // first + mode.begin = '\\b(' + mode.beginKeywords.split(' ').join('|') + ')(?!\\.)(?=\\b|\\s)'; + mode.__beforeBegin = skipIfHasPrecedingDot; + mode.keywords = mode.keywords || mode.beginKeywords; + delete mode.beginKeywords; + + // prevents double relevance, the keywords themselves provide + // relevance, the mode doesn't need to double it + // eslint-disable-next-line no-undefined + if (mode.relevance === undefined) mode.relevance = 0; +} + +/** + * Allow `illegal` to contain an array of illegal values + * @type {CompilerExt} + */ +function compileIllegal(mode, _parent) { + if (!Array.isArray(mode.illegal)) return; + + mode.illegal = either(...mode.illegal); +} + +/** + * `match` to match a single expression for readability + * @type {CompilerExt} + */ +function compileMatch(mode, _parent) { + if (!mode.match) return; + if (mode.begin || mode.end) throw new Error("begin & end are not supported with match"); + + mode.begin = mode.match; + delete mode.match; +} + +/** + * provides the default 1 relevance to all modes + * @type {CompilerExt} + */ +function compileRelevance(mode, _parent) { + // eslint-disable-next-line no-undefined + if (mode.relevance === undefined) mode.relevance = 1; +} + +// allow beforeMatch to act as a "qualifier" for the match +// the full match begin must be [beforeMatch][begin] +const beforeMatchExt = (mode, parent) => { + if (!mode.beforeMatch) return; + // starts conflicts with endsParent which we need to make sure the child + // rule is not matched multiple times + if (mode.starts) throw new Error("beforeMatch cannot be used with starts"); + + const originalMode = Object.assign({}, mode); + Object.keys(mode).forEach((key) => { delete mode[key]; }); + + mode.keywords = originalMode.keywords; + mode.begin = concat(originalMode.beforeMatch, lookahead(originalMode.begin)); + mode.starts = { + relevance: 0, + contains: [ + Object.assign(originalMode, { endsParent: true }) + ] + }; + mode.relevance = 0; + + delete originalMode.beforeMatch; +}; + +// keywords that should have no default relevance value +const COMMON_KEYWORDS = [ + 'of', + 'and', + 'for', + 'in', + 'not', + 'or', + 'if', + 'then', + 'parent', // common variable name + 'list', // common variable name + 'value' // common variable name +]; + +const DEFAULT_KEYWORD_SCOPE = "keyword"; + +/** + * Given raw keywords from a language definition, compile them. + * + * @param {string | Record | Array} rawKeywords + * @param {boolean} caseInsensitive + */ +function compileKeywords(rawKeywords, caseInsensitive, scopeName = DEFAULT_KEYWORD_SCOPE) { + /** @type {import("highlight.js/private").KeywordDict} */ + const compiledKeywords = Object.create(null); + + // input can be a string of keywords, an array of keywords, or a object with + // named keys representing scopeName (which can then point to a string or array) + if (typeof rawKeywords === 'string') { + compileList(scopeName, rawKeywords.split(" ")); + } else if (Array.isArray(rawKeywords)) { + compileList(scopeName, rawKeywords); + } else { + Object.keys(rawKeywords).forEach(function(scopeName) { + // collapse all our objects back into the parent object + Object.assign( + compiledKeywords, + compileKeywords(rawKeywords[scopeName], caseInsensitive, scopeName) + ); + }); + } + return compiledKeywords; + + // --- + + /** + * Compiles an individual list of keywords + * + * Ex: "for if when while|5" + * + * @param {string} scopeName + * @param {Array} keywordList + */ + function compileList(scopeName, keywordList) { + if (caseInsensitive) { + keywordList = keywordList.map(x => x.toLowerCase()); + } + keywordList.forEach(function(keyword) { + const pair = keyword.split('|'); + compiledKeywords[pair[0]] = [scopeName, scoreForKeyword(pair[0], pair[1])]; + }); + } +} + +/** + * Returns the proper score for a given keyword + * + * Also takes into account comment keywords, which will be scored 0 UNLESS + * another score has been manually assigned. + * @param {string} keyword + * @param {string} [providedScore] + */ +function scoreForKeyword(keyword, providedScore) { + // manual scores always win over common keywords + // so you can force a score of 1 if you really insist + if (providedScore) { + return Number(providedScore); + } + + return commonKeyword(keyword) ? 0 : 1; +} + +/** + * Determines if a given keyword is common or not + * + * @param {string} keyword */ +function commonKeyword(keyword) { + return COMMON_KEYWORDS.includes(keyword.toLowerCase()); +} + +/* + +For the reasoning behind this please see: +https://github.com/highlightjs/highlight.js/issues/2880#issuecomment-747275419 + +*/ + +/** + * @type {Record} + */ +const seenDeprecations = {}; + +/** + * @param {string} message + */ +const error = (message) => { + console.error(message); +}; + +/** + * @param {string} message + * @param {any} args + */ +const warn = (message, ...args) => { + console.log(`WARN: ${message}`, ...args); +}; + +/** + * @param {string} version + * @param {string} message + */ +const deprecated = (version, message) => { + if (seenDeprecations[`${version}/${message}`]) return; + + console.log(`Deprecated as of ${version}. ${message}`); + seenDeprecations[`${version}/${message}`] = true; +}; + +/* eslint-disable no-throw-literal */ + +/** +@typedef {import('highlight.js').CompiledMode} CompiledMode +*/ + +const MultiClassError = new Error(); + +/** + * Renumbers labeled scope names to account for additional inner match + * groups that otherwise would break everything. + * + * Lets say we 3 match scopes: + * + * { 1 => ..., 2 => ..., 3 => ... } + * + * So what we need is a clean match like this: + * + * (a)(b)(c) => [ "a", "b", "c" ] + * + * But this falls apart with inner match groups: + * + * (a)(((b)))(c) => ["a", "b", "b", "b", "c" ] + * + * Our scopes are now "out of alignment" and we're repeating `b` 3 times. + * What needs to happen is the numbers are remapped: + * + * { 1 => ..., 2 => ..., 5 => ... } + * + * We also need to know that the ONLY groups that should be output + * are 1, 2, and 5. This function handles this behavior. + * + * @param {CompiledMode} mode + * @param {Array} regexes + * @param {{key: "beginScope"|"endScope"}} opts + */ +function remapScopeNames(mode, regexes, { key }) { + let offset = 0; + const scopeNames = mode[key]; + /** @type Record */ + const emit = {}; + /** @type Record */ + const positions = {}; + + for (let i = 1; i <= regexes.length; i++) { + positions[i + offset] = scopeNames[i]; + emit[i + offset] = true; + offset += countMatchGroups(regexes[i - 1]); + } + // we use _emit to keep track of which match groups are "top-level" to avoid double + // output from inside match groups + mode[key] = positions; + mode[key]._emit = emit; + mode[key]._multi = true; +} + +/** + * @param {CompiledMode} mode + */ +function beginMultiClass(mode) { + if (!Array.isArray(mode.begin)) return; + + if (mode.skip || mode.excludeBegin || mode.returnBegin) { + error("skip, excludeBegin, returnBegin not compatible with beginScope: {}"); + throw MultiClassError; + } + + if (typeof mode.beginScope !== "object" || mode.beginScope === null) { + error("beginScope must be object"); + throw MultiClassError; + } + + remapScopeNames(mode, mode.begin, { key: "beginScope" }); + mode.begin = _rewriteBackreferences(mode.begin, { joinWith: "" }); +} + +/** + * @param {CompiledMode} mode + */ +function endMultiClass(mode) { + if (!Array.isArray(mode.end)) return; + + if (mode.skip || mode.excludeEnd || mode.returnEnd) { + error("skip, excludeEnd, returnEnd not compatible with endScope: {}"); + throw MultiClassError; + } + + if (typeof mode.endScope !== "object" || mode.endScope === null) { + error("endScope must be object"); + throw MultiClassError; + } + + remapScopeNames(mode, mode.end, { key: "endScope" }); + mode.end = _rewriteBackreferences(mode.end, { joinWith: "" }); +} + +/** + * this exists only to allow `scope: {}` to be used beside `match:` + * Otherwise `beginScope` would necessary and that would look weird + + { + match: [ /def/, /\w+/ ] + scope: { 1: "keyword" , 2: "title" } + } + + * @param {CompiledMode} mode + */ +function scopeSugar(mode) { + if (mode.scope && typeof mode.scope === "object" && mode.scope !== null) { + mode.beginScope = mode.scope; + delete mode.scope; + } +} + +/** + * @param {CompiledMode} mode + */ +function MultiClass(mode) { + scopeSugar(mode); + + if (typeof mode.beginScope === "string") { + mode.beginScope = { _wrap: mode.beginScope }; + } + if (typeof mode.endScope === "string") { + mode.endScope = { _wrap: mode.endScope }; + } + + beginMultiClass(mode); + endMultiClass(mode); +} + +/** +@typedef {import('highlight.js').Mode} Mode +@typedef {import('highlight.js').CompiledMode} CompiledMode +@typedef {import('highlight.js').Language} Language +@typedef {import('highlight.js').HLJSPlugin} HLJSPlugin +@typedef {import('highlight.js').CompiledLanguage} CompiledLanguage +*/ + +// compilation + +/** + * Compiles a language definition result + * + * Given the raw result of a language definition (Language), compiles this so + * that it is ready for highlighting code. + * @param {Language} language + * @returns {CompiledLanguage} + */ +function compileLanguage(language) { + /** + * Builds a regex with the case sensitivity of the current language + * + * @param {RegExp | string} value + * @param {boolean} [global] + */ + function langRe(value, global) { + return new RegExp( + source(value), + 'm' + + (language.case_insensitive ? 'i' : '') + + (language.unicodeRegex ? 'u' : '') + + (global ? 'g' : '') + ); + } + + /** + Stores multiple regular expressions and allows you to quickly search for + them all in a string simultaneously - returning the first match. It does + this by creating a huge (a|b|c) regex - each individual item wrapped with () + and joined by `|` - using match groups to track position. When a match is + found checking which position in the array has content allows us to figure + out which of the original regexes / match groups triggered the match. + + The match object itself (the result of `Regex.exec`) is returned but also + enhanced by merging in any meta-data that was registered with the regex. + This is how we keep track of which mode matched, and what type of rule + (`illegal`, `begin`, end, etc). + */ + class MultiRegex { + constructor() { + this.matchIndexes = {}; + // @ts-ignore + this.regexes = []; + this.matchAt = 1; + this.position = 0; + } + + // @ts-ignore + addRule(re, opts) { + opts.position = this.position++; + // @ts-ignore + this.matchIndexes[this.matchAt] = opts; + this.regexes.push([opts, re]); + this.matchAt += countMatchGroups(re) + 1; + } + + compile() { + if (this.regexes.length === 0) { + // avoids the need to check length every time exec is called + // @ts-ignore + this.exec = () => null; + } + const terminators = this.regexes.map(el => el[1]); + this.matcherRe = langRe(_rewriteBackreferences(terminators, { joinWith: '|' }), true); + this.lastIndex = 0; + } + + /** @param {string} s */ + exec(s) { + this.matcherRe.lastIndex = this.lastIndex; + const match = this.matcherRe.exec(s); + if (!match) { return null; } + + // eslint-disable-next-line no-undefined + const i = match.findIndex((el, i) => i > 0 && el !== undefined); + // @ts-ignore + const matchData = this.matchIndexes[i]; + // trim off any earlier non-relevant match groups (ie, the other regex + // match groups that make up the multi-matcher) + match.splice(0, i); + + return Object.assign(match, matchData); + } + } + + /* + Created to solve the key deficiently with MultiRegex - there is no way to + test for multiple matches at a single location. Why would we need to do + that? In the future a more dynamic engine will allow certain matches to be + ignored. An example: if we matched say the 3rd regex in a large group but + decided to ignore it - we'd need to started testing again at the 4th + regex... but MultiRegex itself gives us no real way to do that. + + So what this class creates MultiRegexs on the fly for whatever search + position they are needed. + + NOTE: These additional MultiRegex objects are created dynamically. For most + grammars most of the time we will never actually need anything more than the + first MultiRegex - so this shouldn't have too much overhead. + + Say this is our search group, and we match regex3, but wish to ignore it. + + regex1 | regex2 | regex3 | regex4 | regex5 ' ie, startAt = 0 + + What we need is a new MultiRegex that only includes the remaining + possibilities: + + regex4 | regex5 ' ie, startAt = 3 + + This class wraps all that complexity up in a simple API... `startAt` decides + where in the array of expressions to start doing the matching. It + auto-increments, so if a match is found at position 2, then startAt will be + set to 3. If the end is reached startAt will return to 0. + + MOST of the time the parser will be setting startAt manually to 0. + */ + class ResumableMultiRegex { + constructor() { + // @ts-ignore + this.rules = []; + // @ts-ignore + this.multiRegexes = []; + this.count = 0; + + this.lastIndex = 0; + this.regexIndex = 0; + } + + // @ts-ignore + getMatcher(index) { + if (this.multiRegexes[index]) return this.multiRegexes[index]; + + const matcher = new MultiRegex(); + this.rules.slice(index).forEach(([re, opts]) => matcher.addRule(re, opts)); + matcher.compile(); + this.multiRegexes[index] = matcher; + return matcher; + } + + resumingScanAtSamePosition() { + return this.regexIndex !== 0; + } + + considerAll() { + this.regexIndex = 0; + } + + // @ts-ignore + addRule(re, opts) { + this.rules.push([re, opts]); + if (opts.type === "begin") this.count++; + } + + /** @param {string} s */ + exec(s) { + const m = this.getMatcher(this.regexIndex); + m.lastIndex = this.lastIndex; + let result = m.exec(s); + + // The following is because we have no easy way to say "resume scanning at the + // existing position but also skip the current rule ONLY". What happens is + // all prior rules are also skipped which can result in matching the wrong + // thing. Example of matching "booger": + + // our matcher is [string, "booger", number] + // + // ....booger.... + + // if "booger" is ignored then we'd really need a regex to scan from the + // SAME position for only: [string, number] but ignoring "booger" (if it + // was the first match), a simple resume would scan ahead who knows how + // far looking only for "number", ignoring potential string matches (or + // future "booger" matches that might be valid.) + + // So what we do: We execute two matchers, one resuming at the same + // position, but the second full matcher starting at the position after: + + // /--- resume first regex match here (for [number]) + // |/---- full match here for [string, "booger", number] + // vv + // ....booger.... + + // Which ever results in a match first is then used. So this 3-4 step + // process essentially allows us to say "match at this position, excluding + // a prior rule that was ignored". + // + // 1. Match "booger" first, ignore. Also proves that [string] does non match. + // 2. Resume matching for [number] + // 3. Match at index + 1 for [string, "booger", number] + // 4. If #2 and #3 result in matches, which came first? + if (this.resumingScanAtSamePosition()) { + if (result && result.index === this.lastIndex) ; else { // use the second matcher result + const m2 = this.getMatcher(0); + m2.lastIndex = this.lastIndex + 1; + result = m2.exec(s); + } + } + + if (result) { + this.regexIndex += result.position + 1; + if (this.regexIndex === this.count) { + // wrap-around to considering all matches again + this.considerAll(); + } + } + + return result; + } + } + + /** + * Given a mode, builds a huge ResumableMultiRegex that can be used to walk + * the content and find matches. + * + * @param {CompiledMode} mode + * @returns {ResumableMultiRegex} + */ + function buildModeRegex(mode) { + const mm = new ResumableMultiRegex(); + + mode.contains.forEach(term => mm.addRule(term.begin, { rule: term, type: "begin" })); + + if (mode.terminatorEnd) { + mm.addRule(mode.terminatorEnd, { type: "end" }); + } + if (mode.illegal) { + mm.addRule(mode.illegal, { type: "illegal" }); + } + + return mm; + } + + /** skip vs abort vs ignore + * + * @skip - The mode is still entered and exited normally (and contains rules apply), + * but all content is held and added to the parent buffer rather than being + * output when the mode ends. Mostly used with `sublanguage` to build up + * a single large buffer than can be parsed by sublanguage. + * + * - The mode begin ands ends normally. + * - Content matched is added to the parent mode buffer. + * - The parser cursor is moved forward normally. + * + * @abort - A hack placeholder until we have ignore. Aborts the mode (as if it + * never matched) but DOES NOT continue to match subsequent `contains` + * modes. Abort is bad/suboptimal because it can result in modes + * farther down not getting applied because an earlier rule eats the + * content but then aborts. + * + * - The mode does not begin. + * - Content matched by `begin` is added to the mode buffer. + * - The parser cursor is moved forward accordingly. + * + * @ignore - Ignores the mode (as if it never matched) and continues to match any + * subsequent `contains` modes. Ignore isn't technically possible with + * the current parser implementation. + * + * - The mode does not begin. + * - Content matched by `begin` is ignored. + * - The parser cursor is not moved forward. + */ + + /** + * Compiles an individual mode + * + * This can raise an error if the mode contains certain detectable known logic + * issues. + * @param {Mode} mode + * @param {CompiledMode | null} [parent] + * @returns {CompiledMode | never} + */ + function compileMode(mode, parent) { + const cmode = /** @type CompiledMode */ (mode); + if (mode.isCompiled) return cmode; + + [ + scopeClassName, + // do this early so compiler extensions generally don't have to worry about + // the distinction between match/begin + compileMatch, + MultiClass, + beforeMatchExt + ].forEach(ext => ext(mode, parent)); + + language.compilerExtensions.forEach(ext => ext(mode, parent)); + + // __beforeBegin is considered private API, internal use only + mode.__beforeBegin = null; + + [ + beginKeywords, + // do this later so compiler extensions that come earlier have access to the + // raw array if they wanted to perhaps manipulate it, etc. + compileIllegal, + // default to 1 relevance if not specified + compileRelevance + ].forEach(ext => ext(mode, parent)); + + mode.isCompiled = true; + + let keywordPattern = null; + if (typeof mode.keywords === "object" && mode.keywords.$pattern) { + // we need a copy because keywords might be compiled multiple times + // so we can't go deleting $pattern from the original on the first + // pass + mode.keywords = Object.assign({}, mode.keywords); + keywordPattern = mode.keywords.$pattern; + delete mode.keywords.$pattern; + } + keywordPattern = keywordPattern || /\w+/; + + if (mode.keywords) { + mode.keywords = compileKeywords(mode.keywords, language.case_insensitive); + } + + cmode.keywordPatternRe = langRe(keywordPattern, true); + + if (parent) { + if (!mode.begin) mode.begin = /\B|\b/; + cmode.beginRe = langRe(cmode.begin); + if (!mode.end && !mode.endsWithParent) mode.end = /\B|\b/; + if (mode.end) cmode.endRe = langRe(cmode.end); + cmode.terminatorEnd = source(cmode.end) || ''; + if (mode.endsWithParent && parent.terminatorEnd) { + cmode.terminatorEnd += (mode.end ? '|' : '') + parent.terminatorEnd; + } + } + if (mode.illegal) cmode.illegalRe = langRe(/** @type {RegExp | string} */ (mode.illegal)); + if (!mode.contains) mode.contains = []; + + mode.contains = [].concat(...mode.contains.map(function(c) { + return expandOrCloneMode(c === 'self' ? mode : c); + })); + mode.contains.forEach(function(c) { compileMode(/** @type Mode */ (c), cmode); }); + + if (mode.starts) { + compileMode(mode.starts, parent); + } + + cmode.matcher = buildModeRegex(cmode); + return cmode; + } + + if (!language.compilerExtensions) language.compilerExtensions = []; + + // self is not valid at the top-level + if (language.contains && language.contains.includes('self')) { + throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation."); + } + + // we need a null object, which inherit will guarantee + language.classNameAliases = inherit$1(language.classNameAliases || {}); + + return compileMode(/** @type Mode */ (language)); +} + +/** + * Determines if a mode has a dependency on it's parent or not + * + * If a mode does have a parent dependency then often we need to clone it if + * it's used in multiple places so that each copy points to the correct parent, + * where-as modes without a parent can often safely be re-used at the bottom of + * a mode chain. + * + * @param {Mode | null} mode + * @returns {boolean} - is there a dependency on the parent? + * */ +function dependencyOnParent(mode) { + if (!mode) return false; + + return mode.endsWithParent || dependencyOnParent(mode.starts); +} + +/** + * Expands a mode or clones it if necessary + * + * This is necessary for modes with parental dependenceis (see notes on + * `dependencyOnParent`) and for nodes that have `variants` - which must then be + * exploded into their own individual modes at compile time. + * + * @param {Mode} mode + * @returns {Mode | Mode[]} + * */ +function expandOrCloneMode(mode) { + if (mode.variants && !mode.cachedVariants) { + mode.cachedVariants = mode.variants.map(function(variant) { + return inherit$1(mode, { variants: null }, variant); + }); + } + + // EXPAND + // if we have variants then essentially "replace" the mode with the variants + // this happens in compileMode, where this function is called from + if (mode.cachedVariants) { + return mode.cachedVariants; + } + + // CLONE + // if we have dependencies on parents then we need a unique + // instance of ourselves, so we can be reused with many + // different parents without issue + if (dependencyOnParent(mode)) { + return inherit$1(mode, { starts: mode.starts ? inherit$1(mode.starts) : null }); + } + + if (Object.isFrozen(mode)) { + return inherit$1(mode); + } + + // no special dependency issues, just return ourselves + return mode; +} + +var version = "11.11.1"; + +class HTMLInjectionError extends Error { + constructor(reason, html) { + super(reason); + this.name = "HTMLInjectionError"; + this.html = html; + } +} + +/* +Syntax highlighting with language autodetection. +https://highlightjs.org/ +*/ + + + +/** +@typedef {import('highlight.js').Mode} Mode +@typedef {import('highlight.js').CompiledMode} CompiledMode +@typedef {import('highlight.js').CompiledScope} CompiledScope +@typedef {import('highlight.js').Language} Language +@typedef {import('highlight.js').HLJSApi} HLJSApi +@typedef {import('highlight.js').HLJSPlugin} HLJSPlugin +@typedef {import('highlight.js').PluginEvent} PluginEvent +@typedef {import('highlight.js').HLJSOptions} HLJSOptions +@typedef {import('highlight.js').LanguageFn} LanguageFn +@typedef {import('highlight.js').HighlightedHTMLElement} HighlightedHTMLElement +@typedef {import('highlight.js').BeforeHighlightContext} BeforeHighlightContext +@typedef {import('highlight.js/private').MatchType} MatchType +@typedef {import('highlight.js/private').KeywordData} KeywordData +@typedef {import('highlight.js/private').EnhancedMatch} EnhancedMatch +@typedef {import('highlight.js/private').AnnotatedError} AnnotatedError +@typedef {import('highlight.js').AutoHighlightResult} AutoHighlightResult +@typedef {import('highlight.js').HighlightOptions} HighlightOptions +@typedef {import('highlight.js').HighlightResult} HighlightResult +*/ + + +const escape = escapeHTML; +const inherit = inherit$1; +const NO_MATCH = Symbol("nomatch"); +const MAX_KEYWORD_HITS = 7; + +/** + * @param {any} hljs - object that is extended (legacy) + * @returns {HLJSApi} + */ +const HLJS = function(hljs) { + // Global internal variables used within the highlight.js library. + /** @type {Record} */ + const languages = Object.create(null); + /** @type {Record} */ + const aliases = Object.create(null); + /** @type {HLJSPlugin[]} */ + const plugins = []; + + // safe/production mode - swallows more errors, tries to keep running + // even if a single syntax or parse hits a fatal error + let SAFE_MODE = true; + const LANGUAGE_NOT_FOUND = "Could not find the language '{}', did you forget to load/include a language module?"; + /** @type {Language} */ + const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: 'Plain text', contains: [] }; + + // Global options used when within external APIs. This is modified when + // calling the `hljs.configure` function. + /** @type HLJSOptions */ + let options = { + ignoreUnescapedHTML: false, + throwUnescapedHTML: false, + noHighlightRe: /^(no-?highlight)$/i, + languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i, + classPrefix: 'hljs-', + cssSelector: 'pre code', + languages: null, + // beta configuration options, subject to change, welcome to discuss + // https://github.com/highlightjs/highlight.js/issues/1086 + __emitter: TokenTreeEmitter + }; + + /* Utility functions */ + + /** + * Tests a language name to see if highlighting should be skipped + * @param {string} languageName + */ + function shouldNotHighlight(languageName) { + return options.noHighlightRe.test(languageName); + } + + /** + * @param {HighlightedHTMLElement} block - the HTML element to determine language for + */ + function blockLanguage(block) { + let classes = block.className + ' '; + + classes += block.parentNode ? block.parentNode.className : ''; + + // language-* takes precedence over non-prefixed class names. + const match = options.languageDetectRe.exec(classes); + if (match) { + const language = getLanguage(match[1]); + if (!language) { + warn(LANGUAGE_NOT_FOUND.replace("{}", match[1])); + warn("Falling back to no-highlight mode for this block.", block); + } + return language ? match[1] : 'no-highlight'; + } + + return classes + .split(/\s+/) + .find((_class) => shouldNotHighlight(_class) || getLanguage(_class)); + } + + /** + * Core highlighting function. + * + * OLD API + * highlight(lang, code, ignoreIllegals, continuation) + * + * NEW API + * highlight(code, {lang, ignoreIllegals}) + * + * @param {string} codeOrLanguageName - the language to use for highlighting + * @param {string | HighlightOptions} optionsOrCode - the code to highlight + * @param {boolean} [ignoreIllegals] - whether to ignore illegal matches, default is to bail + * + * @returns {HighlightResult} Result - an object that represents the result + * @property {string} language - the language name + * @property {number} relevance - the relevance score + * @property {string} value - the highlighted HTML code + * @property {string} code - the original raw code + * @property {CompiledMode} top - top of the current mode stack + * @property {boolean} illegal - indicates whether any illegal matches were found + */ + function highlight(codeOrLanguageName, optionsOrCode, ignoreIllegals) { + let code = ""; + let languageName = ""; + if (typeof optionsOrCode === "object") { + code = codeOrLanguageName; + ignoreIllegals = optionsOrCode.ignoreIllegals; + languageName = optionsOrCode.language; + } else { + // old API + deprecated("10.7.0", "highlight(lang, code, ...args) has been deprecated."); + deprecated("10.7.0", "Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"); + languageName = codeOrLanguageName; + code = optionsOrCode; + } + + // https://github.com/highlightjs/highlight.js/issues/3149 + // eslint-disable-next-line no-undefined + if (ignoreIllegals === undefined) { ignoreIllegals = true; } + + /** @type {BeforeHighlightContext} */ + const context = { + code, + language: languageName + }; + // the plugin can change the desired language or the code to be highlighted + // just be changing the object it was passed + fire("before:highlight", context); + + // a before plugin can usurp the result completely by providing it's own + // in which case we don't even need to call highlight + const result = context.result + ? context.result + : _highlight(context.language, context.code, ignoreIllegals); + + result.code = context.code; + // the plugin can change anything in result to suite it + fire("after:highlight", result); + + return result; + } + + /** + * private highlight that's used internally and does not fire callbacks + * + * @param {string} languageName - the language to use for highlighting + * @param {string} codeToHighlight - the code to highlight + * @param {boolean?} [ignoreIllegals] - whether to ignore illegal matches, default is to bail + * @param {CompiledMode?} [continuation] - current continuation mode, if any + * @returns {HighlightResult} - result of the highlight operation + */ + function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) { + const keywordHits = Object.create(null); + + /** + * Return keyword data if a match is a keyword + * @param {CompiledMode} mode - current mode + * @param {string} matchText - the textual match + * @returns {KeywordData | false} + */ + function keywordData(mode, matchText) { + return mode.keywords[matchText]; + } + + function processKeywords() { + if (!top.keywords) { + emitter.addText(modeBuffer); + return; + } + + let lastIndex = 0; + top.keywordPatternRe.lastIndex = 0; + let match = top.keywordPatternRe.exec(modeBuffer); + let buf = ""; + + while (match) { + buf += modeBuffer.substring(lastIndex, match.index); + const word = language.case_insensitive ? match[0].toLowerCase() : match[0]; + const data = keywordData(top, word); + if (data) { + const [kind, keywordRelevance] = data; + emitter.addText(buf); + buf = ""; + + keywordHits[word] = (keywordHits[word] || 0) + 1; + if (keywordHits[word] <= MAX_KEYWORD_HITS) relevance += keywordRelevance; + if (kind.startsWith("_")) { + // _ implied for relevance only, do not highlight + // by applying a class name + buf += match[0]; + } else { + const cssClass = language.classNameAliases[kind] || kind; + emitKeyword(match[0], cssClass); + } + } else { + buf += match[0]; + } + lastIndex = top.keywordPatternRe.lastIndex; + match = top.keywordPatternRe.exec(modeBuffer); + } + buf += modeBuffer.substring(lastIndex); + emitter.addText(buf); + } + + function processSubLanguage() { + if (modeBuffer === "") return; + /** @type HighlightResult */ + let result = null; + + if (typeof top.subLanguage === 'string') { + if (!languages[top.subLanguage]) { + emitter.addText(modeBuffer); + return; + } + result = _highlight(top.subLanguage, modeBuffer, true, continuations[top.subLanguage]); + continuations[top.subLanguage] = /** @type {CompiledMode} */ (result._top); + } else { + result = highlightAuto(modeBuffer, top.subLanguage.length ? top.subLanguage : null); + } + + // Counting embedded language score towards the host language may be disabled + // with zeroing the containing mode relevance. Use case in point is Markdown that + // allows XML everywhere and makes every XML snippet to have a much larger Markdown + // score. + if (top.relevance > 0) { + relevance += result.relevance; + } + emitter.__addSublanguage(result._emitter, result.language); + } + + function processBuffer() { + if (top.subLanguage != null) { + processSubLanguage(); + } else { + processKeywords(); + } + modeBuffer = ''; + } + + /** + * @param {string} text + * @param {string} scope + */ + function emitKeyword(keyword, scope) { + if (keyword === "") return; + + emitter.startScope(scope); + emitter.addText(keyword); + emitter.endScope(); + } + + /** + * @param {CompiledScope} scope + * @param {RegExpMatchArray} match + */ + function emitMultiClass(scope, match) { + let i = 1; + const max = match.length - 1; + while (i <= max) { + if (!scope._emit[i]) { i++; continue; } + const klass = language.classNameAliases[scope[i]] || scope[i]; + const text = match[i]; + if (klass) { + emitKeyword(text, klass); + } else { + modeBuffer = text; + processKeywords(); + modeBuffer = ""; + } + i++; + } + } + + /** + * @param {CompiledMode} mode - new mode to start + * @param {RegExpMatchArray} match + */ + function startNewMode(mode, match) { + if (mode.scope && typeof mode.scope === "string") { + emitter.openNode(language.classNameAliases[mode.scope] || mode.scope); + } + if (mode.beginScope) { + // beginScope just wraps the begin match itself in a scope + if (mode.beginScope._wrap) { + emitKeyword(modeBuffer, language.classNameAliases[mode.beginScope._wrap] || mode.beginScope._wrap); + modeBuffer = ""; + } else if (mode.beginScope._multi) { + // at this point modeBuffer should just be the match + emitMultiClass(mode.beginScope, match); + modeBuffer = ""; + } + } + + top = Object.create(mode, { parent: { value: top } }); + return top; + } + + /** + * @param {CompiledMode } mode - the mode to potentially end + * @param {RegExpMatchArray} match - the latest match + * @param {string} matchPlusRemainder - match plus remainder of content + * @returns {CompiledMode | void} - the next mode, or if void continue on in current mode + */ + function endOfMode(mode, match, matchPlusRemainder) { + let matched = startsWith(mode.endRe, matchPlusRemainder); + + if (matched) { + if (mode["on:end"]) { + const resp = new Response(mode); + mode["on:end"](match, resp); + if (resp.isMatchIgnored) matched = false; + } + + if (matched) { + while (mode.endsParent && mode.parent) { + mode = mode.parent; + } + return mode; + } + } + // even if on:end fires an `ignore` it's still possible + // that we might trigger the end node because of a parent mode + if (mode.endsWithParent) { + return endOfMode(mode.parent, match, matchPlusRemainder); + } + } + + /** + * Handle matching but then ignoring a sequence of text + * + * @param {string} lexeme - string containing full match text + */ + function doIgnore(lexeme) { + if (top.matcher.regexIndex === 0) { + // no more regexes to potentially match here, so we move the cursor forward one + // space + modeBuffer += lexeme[0]; + return 1; + } else { + // no need to move the cursor, we still have additional regexes to try and + // match at this very spot + resumeScanAtSamePosition = true; + return 0; + } + } + + /** + * Handle the start of a new potential mode match + * + * @param {EnhancedMatch} match - the current match + * @returns {number} how far to advance the parse cursor + */ + function doBeginMatch(match) { + const lexeme = match[0]; + const newMode = match.rule; + + const resp = new Response(newMode); + // first internal before callbacks, then the public ones + const beforeCallbacks = [newMode.__beforeBegin, newMode["on:begin"]]; + for (const cb of beforeCallbacks) { + if (!cb) continue; + cb(match, resp); + if (resp.isMatchIgnored) return doIgnore(lexeme); + } + + if (newMode.skip) { + modeBuffer += lexeme; + } else { + if (newMode.excludeBegin) { + modeBuffer += lexeme; + } + processBuffer(); + if (!newMode.returnBegin && !newMode.excludeBegin) { + modeBuffer = lexeme; + } + } + startNewMode(newMode, match); + return newMode.returnBegin ? 0 : lexeme.length; + } + + /** + * Handle the potential end of mode + * + * @param {RegExpMatchArray} match - the current match + */ + function doEndMatch(match) { + const lexeme = match[0]; + const matchPlusRemainder = codeToHighlight.substring(match.index); + + const endMode = endOfMode(top, match, matchPlusRemainder); + if (!endMode) { return NO_MATCH; } + + const origin = top; + if (top.endScope && top.endScope._wrap) { + processBuffer(); + emitKeyword(lexeme, top.endScope._wrap); + } else if (top.endScope && top.endScope._multi) { + processBuffer(); + emitMultiClass(top.endScope, match); + } else if (origin.skip) { + modeBuffer += lexeme; + } else { + if (!(origin.returnEnd || origin.excludeEnd)) { + modeBuffer += lexeme; + } + processBuffer(); + if (origin.excludeEnd) { + modeBuffer = lexeme; + } + } + do { + if (top.scope) { + emitter.closeNode(); + } + if (!top.skip && !top.subLanguage) { + relevance += top.relevance; + } + top = top.parent; + } while (top !== endMode.parent); + if (endMode.starts) { + startNewMode(endMode.starts, match); + } + return origin.returnEnd ? 0 : lexeme.length; + } + + function processContinuations() { + const list = []; + for (let current = top; current !== language; current = current.parent) { + if (current.scope) { + list.unshift(current.scope); + } + } + list.forEach(item => emitter.openNode(item)); + } + + /** @type {{type?: MatchType, index?: number, rule?: Mode}}} */ + let lastMatch = {}; + + /** + * Process an individual match + * + * @param {string} textBeforeMatch - text preceding the match (since the last match) + * @param {EnhancedMatch} [match] - the match itself + */ + function processLexeme(textBeforeMatch, match) { + const lexeme = match && match[0]; + + // add non-matched text to the current mode buffer + modeBuffer += textBeforeMatch; + + if (lexeme == null) { + processBuffer(); + return 0; + } + + // we've found a 0 width match and we're stuck, so we need to advance + // this happens when we have badly behaved rules that have optional matchers to the degree that + // sometimes they can end up matching nothing at all + // Ref: https://github.com/highlightjs/highlight.js/issues/2140 + if (lastMatch.type === "begin" && match.type === "end" && lastMatch.index === match.index && lexeme === "") { + // spit the "skipped" character that our regex choked on back into the output sequence + modeBuffer += codeToHighlight.slice(match.index, match.index + 1); + if (!SAFE_MODE) { + /** @type {AnnotatedError} */ + const err = new Error(`0 width match regex (${languageName})`); + err.languageName = languageName; + err.badRule = lastMatch.rule; + throw err; + } + return 1; + } + lastMatch = match; + + if (match.type === "begin") { + return doBeginMatch(match); + } else if (match.type === "illegal" && !ignoreIllegals) { + // illegal match, we do not continue processing + /** @type {AnnotatedError} */ + const err = new Error('Illegal lexeme "' + lexeme + '" for mode "' + (top.scope || '') + '"'); + err.mode = top; + throw err; + } else if (match.type === "end") { + const processed = doEndMatch(match); + if (processed !== NO_MATCH) { + return processed; + } + } + + // edge case for when illegal matches $ (end of line) which is technically + // a 0 width match but not a begin/end match so it's not caught by the + // first handler (when ignoreIllegals is true) + if (match.type === "illegal" && lexeme === "") { + // advance so we aren't stuck in an infinite loop + modeBuffer += "\n"; + return 1; + } + + // infinite loops are BAD, this is a last ditch catch all. if we have a + // decent number of iterations yet our index (cursor position in our + // parsing) still 3x behind our index then something is very wrong + // so we bail + if (iterations > 100000 && iterations > match.index * 3) { + const err = new Error('potential infinite loop, way more iterations than matches'); + throw err; + } + + /* + Why might be find ourselves here? An potential end match that was + triggered but could not be completed. IE, `doEndMatch` returned NO_MATCH. + (this could be because a callback requests the match be ignored, etc) + + This causes no real harm other than stopping a few times too many. + */ + + modeBuffer += lexeme; + return lexeme.length; + } + + const language = getLanguage(languageName); + if (!language) { + error(LANGUAGE_NOT_FOUND.replace("{}", languageName)); + throw new Error('Unknown language: "' + languageName + '"'); + } + + const md = compileLanguage(language); + let result = ''; + /** @type {CompiledMode} */ + let top = continuation || md; + /** @type Record */ + const continuations = {}; // keep continuations for sub-languages + const emitter = new options.__emitter(options); + processContinuations(); + let modeBuffer = ''; + let relevance = 0; + let index = 0; + let iterations = 0; + let resumeScanAtSamePosition = false; + + try { + if (!language.__emitTokens) { + top.matcher.considerAll(); + + for (;;) { + iterations++; + if (resumeScanAtSamePosition) { + // only regexes not matched previously will now be + // considered for a potential match + resumeScanAtSamePosition = false; + } else { + top.matcher.considerAll(); + } + top.matcher.lastIndex = index; + + const match = top.matcher.exec(codeToHighlight); + // console.log("match", match[0], match.rule && match.rule.begin) + + if (!match) break; + + const beforeMatch = codeToHighlight.substring(index, match.index); + const processedCount = processLexeme(beforeMatch, match); + index = match.index + processedCount; + } + processLexeme(codeToHighlight.substring(index)); + } else { + language.__emitTokens(codeToHighlight, emitter); + } + + emitter.finalize(); + result = emitter.toHTML(); + + return { + language: languageName, + value: result, + relevance, + illegal: false, + _emitter: emitter, + _top: top + }; + } catch (err) { + if (err.message && err.message.includes('Illegal')) { + return { + language: languageName, + value: escape(codeToHighlight), + illegal: true, + relevance: 0, + _illegalBy: { + message: err.message, + index, + context: codeToHighlight.slice(index - 100, index + 100), + mode: err.mode, + resultSoFar: result + }, + _emitter: emitter + }; + } else if (SAFE_MODE) { + return { + language: languageName, + value: escape(codeToHighlight), + illegal: false, + relevance: 0, + errorRaised: err, + _emitter: emitter, + _top: top + }; + } else { + throw err; + } + } + } + + /** + * returns a valid highlight result, without actually doing any actual work, + * auto highlight starts with this and it's possible for small snippets that + * auto-detection may not find a better match + * @param {string} code + * @returns {HighlightResult} + */ + function justTextHighlightResult(code) { + const result = { + value: escape(code), + illegal: false, + relevance: 0, + _top: PLAINTEXT_LANGUAGE, + _emitter: new options.__emitter(options) + }; + result._emitter.addText(code); + return result; + } + + /** + Highlighting with language detection. Accepts a string with the code to + highlight. Returns an object with the following properties: + + - language (detected language) + - relevance (int) + - value (an HTML string with highlighting markup) + - secondBest (object with the same structure for second-best heuristically + detected language, may be absent) + + @param {string} code + @param {Array} [languageSubset] + @returns {AutoHighlightResult} + */ + function highlightAuto(code, languageSubset) { + languageSubset = languageSubset || options.languages || Object.keys(languages); + const plaintext = justTextHighlightResult(code); + + const results = languageSubset.filter(getLanguage).filter(autoDetection).map(name => + _highlight(name, code, false) + ); + results.unshift(plaintext); // plaintext is always an option + + const sorted = results.sort((a, b) => { + // sort base on relevance + if (a.relevance !== b.relevance) return b.relevance - a.relevance; + + // always award the tie to the base language + // ie if C++ and Arduino are tied, it's more likely to be C++ + if (a.language && b.language) { + if (getLanguage(a.language).supersetOf === b.language) { + return 1; + } else if (getLanguage(b.language).supersetOf === a.language) { + return -1; + } + } + + // otherwise say they are equal, which has the effect of sorting on + // relevance while preserving the original ordering - which is how ties + // have historically been settled, ie the language that comes first always + // wins in the case of a tie + return 0; + }); + + const [best, secondBest] = sorted; + + /** @type {AutoHighlightResult} */ + const result = best; + result.secondBest = secondBest; + + return result; + } + + /** + * Builds new class name for block given the language name + * + * @param {HTMLElement} element + * @param {string} [currentLang] + * @param {string} [resultLang] + */ + function updateClassName(element, currentLang, resultLang) { + const language = (currentLang && aliases[currentLang]) || resultLang; + + element.classList.add("hljs"); + element.classList.add(`language-${language}`); + } + + /** + * Applies highlighting to a DOM node containing code. + * + * @param {HighlightedHTMLElement} element - the HTML element to highlight + */ + function highlightElement(element) { + /** @type HTMLElement */ + let node = null; + const language = blockLanguage(element); + + if (shouldNotHighlight(language)) return; + + fire("before:highlightElement", + { el: element, language }); + + if (element.dataset.highlighted) { + console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.", element); + return; + } + + // we should be all text, no child nodes (unescaped HTML) - this is possibly + // an HTML injection attack - it's likely too late if this is already in + // production (the code has likely already done its damage by the time + // we're seeing it)... but we yell loudly about this so that hopefully it's + // more likely to be caught in development before making it to production + if (element.children.length > 0) { + if (!options.ignoreUnescapedHTML) { + console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."); + console.warn("https://github.com/highlightjs/highlight.js/wiki/security"); + console.warn("The element with unescaped HTML:"); + console.warn(element); + } + if (options.throwUnescapedHTML) { + const err = new HTMLInjectionError( + "One of your code blocks includes unescaped HTML.", + element.innerHTML + ); + throw err; + } + } + + node = element; + const text = node.textContent; + const result = language ? highlight(text, { language, ignoreIllegals: true }) : highlightAuto(text); + + element.innerHTML = result.value; + element.dataset.highlighted = "yes"; + updateClassName(element, language, result.language); + element.result = { + language: result.language, + // TODO: remove with version 11.0 + re: result.relevance, + relevance: result.relevance + }; + if (result.secondBest) { + element.secondBest = { + language: result.secondBest.language, + relevance: result.secondBest.relevance + }; + } + + fire("after:highlightElement", { el: element, result, text }); + } + + /** + * Updates highlight.js global options with the passed options + * + * @param {Partial} userOptions + */ + function configure(userOptions) { + options = inherit(options, userOptions); + } + + // TODO: remove v12, deprecated + const initHighlighting = () => { + highlightAll(); + deprecated("10.6.0", "initHighlighting() deprecated. Use highlightAll() now."); + }; + + // TODO: remove v12, deprecated + function initHighlightingOnLoad() { + highlightAll(); + deprecated("10.6.0", "initHighlightingOnLoad() deprecated. Use highlightAll() now."); + } + + let wantsHighlight = false; + + /** + * auto-highlights all pre>code elements on the page + */ + function highlightAll() { + function boot() { + // if a highlight was requested before DOM was loaded, do now + highlightAll(); + } + + // if we are called too early in the loading process + if (document.readyState === "loading") { + // make sure the event listener is only added once + if (!wantsHighlight) { + window.addEventListener('DOMContentLoaded', boot, false); + } + wantsHighlight = true; + return; + } + + const blocks = document.querySelectorAll(options.cssSelector); + blocks.forEach(highlightElement); + } + + /** + * Register a language grammar module + * + * @param {string} languageName + * @param {LanguageFn} languageDefinition + */ + function registerLanguage(languageName, languageDefinition) { + let lang = null; + try { + lang = languageDefinition(hljs); + } catch (error$1) { + error("Language definition for '{}' could not be registered.".replace("{}", languageName)); + // hard or soft error + if (!SAFE_MODE) { throw error$1; } else { error(error$1); } + // languages that have serious errors are replaced with essentially a + // "plaintext" stand-in so that the code blocks will still get normal + // css classes applied to them - and one bad language won't break the + // entire highlighter + lang = PLAINTEXT_LANGUAGE; + } + // give it a temporary name if it doesn't have one in the meta-data + if (!lang.name) lang.name = languageName; + languages[languageName] = lang; + lang.rawDefinition = languageDefinition.bind(null, hljs); + + if (lang.aliases) { + registerAliases(lang.aliases, { languageName }); + } + } + + /** + * Remove a language grammar module + * + * @param {string} languageName + */ + function unregisterLanguage(languageName) { + delete languages[languageName]; + for (const alias of Object.keys(aliases)) { + if (aliases[alias] === languageName) { + delete aliases[alias]; + } + } + } + + /** + * @returns {string[]} List of language internal names + */ + function listLanguages() { + return Object.keys(languages); + } + + /** + * @param {string} name - name of the language to retrieve + * @returns {Language | undefined} + */ + function getLanguage(name) { + name = (name || '').toLowerCase(); + return languages[name] || languages[aliases[name]]; + } + + /** + * + * @param {string|string[]} aliasList - single alias or list of aliases + * @param {{languageName: string}} opts + */ + function registerAliases(aliasList, { languageName }) { + if (typeof aliasList === 'string') { + aliasList = [aliasList]; + } + aliasList.forEach(alias => { aliases[alias.toLowerCase()] = languageName; }); + } + + /** + * Determines if a given language has auto-detection enabled + * @param {string} name - name of the language + */ + function autoDetection(name) { + const lang = getLanguage(name); + return lang && !lang.disableAutodetect; + } + + /** + * Upgrades the old highlightBlock plugins to the new + * highlightElement API + * @param {HLJSPlugin} plugin + */ + function upgradePluginAPI(plugin) { + // TODO: remove with v12 + if (plugin["before:highlightBlock"] && !plugin["before:highlightElement"]) { + plugin["before:highlightElement"] = (data) => { + plugin["before:highlightBlock"]( + Object.assign({ block: data.el }, data) + ); + }; + } + if (plugin["after:highlightBlock"] && !plugin["after:highlightElement"]) { + plugin["after:highlightElement"] = (data) => { + plugin["after:highlightBlock"]( + Object.assign({ block: data.el }, data) + ); + }; + } + } + + /** + * @param {HLJSPlugin} plugin + */ + function addPlugin(plugin) { + upgradePluginAPI(plugin); + plugins.push(plugin); + } + + /** + * @param {HLJSPlugin} plugin + */ + function removePlugin(plugin) { + const index = plugins.indexOf(plugin); + if (index !== -1) { + plugins.splice(index, 1); + } + } + + /** + * + * @param {PluginEvent} event + * @param {any} args + */ + function fire(event, args) { + const cb = event; + plugins.forEach(function(plugin) { + if (plugin[cb]) { + plugin[cb](args); + } + }); + } + + /** + * DEPRECATED + * @param {HighlightedHTMLElement} el + */ + function deprecateHighlightBlock(el) { + deprecated("10.7.0", "highlightBlock will be removed entirely in v12.0"); + deprecated("10.7.0", "Please use highlightElement now."); + + return highlightElement(el); + } + + /* Interface definition */ + Object.assign(hljs, { + highlight, + highlightAuto, + highlightAll, + highlightElement, + // TODO: Remove with v12 API + highlightBlock: deprecateHighlightBlock, + configure, + initHighlighting, + initHighlightingOnLoad, + registerLanguage, + unregisterLanguage, + listLanguages, + getLanguage, + registerAliases, + autoDetection, + inherit, + addPlugin, + removePlugin + }); + + hljs.debugMode = function() { SAFE_MODE = false; }; + hljs.safeMode = function() { SAFE_MODE = true; }; + hljs.versionString = version; + + hljs.regex = { + concat: concat, + lookahead: lookahead, + either: either, + optional: optional, + anyNumberOfTimes: anyNumberOfTimes + }; + + for (const key in MODES) { + // @ts-ignore + if (typeof MODES[key] === "object") { + // @ts-ignore + deepFreeze(MODES[key]); + } + } + + // merge all the modes/regexes into our main object + Object.assign(hljs, MODES); + + return hljs; +}; + +// Other names for the variable may break build script +const highlight = HLJS({}); + +// returns a new instance of the highlighter to be used for extensions +// check https://github.com/wooorm/lowlight/issues/47 +highlight.newInstance = () => HLJS({}); + +export { highlight as default }; diff --git a/backend/static/highlight(1)/es/core.min.js b/backend/static/highlight(1)/es/core.min.js new file mode 100644 index 0000000..a614e4d --- /dev/null +++ b/backend/static/highlight(1)/es/core.min.js @@ -0,0 +1,306 @@ +/*! + Highlight.js v11.11.1 (git: 08cb242e7d) + (c) 2006-2025 Josh Goebel and other contributors + License: BSD-3-Clause + */ +function e(t){return t instanceof Map?t.clear=t.delete=t.set=()=>{ +throw Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach((n=>{ +const i=t[n],s=typeof i;"object"!==s&&"function"!==s||Object.isFrozen(i)||e(i) +})),t}class t{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function n(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function i(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] +;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const s=e=>!!e.scope +;class r{constructor(e,t){ +this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ +this.buffer+=n(e)}openNode(e){if(!s(e))return;const t=((e,{prefix:t})=>{ +if(e.startsWith("language:"))return e.replace("language:","language-") +;if(e.includes(".")){const n=e.split(".") +;return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ") +}return`${t}${e}`})(e.scope,{prefix:this.classPrefix});this.span(t)} +closeNode(e){s(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}const o=(e={})=>{const t={children:[]} +;return Object.assign(t,e),t};class a{constructor(){ +this.rootNode=o(),this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const t=o({scope:e}) +;this.add(t),this.stack.push(t)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ +return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), +t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +a._collapse(e)})))}}class c extends a{constructor(e){super(),this.options=e} +addText(e){""!==e&&this.add(e)}startScope(e){this.openNode(e)}endScope(){ +this.closeNode()}__addSublanguage(e,t){const n=e.root +;t&&(n.scope="language:"+t),this.add(n)}toHTML(){ +return new r(this,this.options).value()}finalize(){ +return this.closeAllNodes(),!0}}function l(e){ +return e?"string"==typeof e?e:e.source:null}function g(e){return h("(?=",e,")")} +function u(e){return h("(?:",e,")*")}function d(e){return h("(?:",e,")?")} +function h(...e){return e.map((e=>l(e))).join("")}function f(...e){const t=(e=>{ +const t=e[e.length-1] +;return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{} +})(e);return"("+(t.capture?"":"?:")+e.map((e=>l(e))).join("|")+")"} +function p(e){return RegExp(e.toString()+"|").exec("").length-1} +const b=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ +;function m(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n +;let i=l(e),s="";for(;i.length>0;){const e=b.exec(i);if(!e){s+=i;break} +s+=i.substring(0,e.index), +i=i.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?s+="\\"+(Number(e[1])+t):(s+=e[0], +"("===e[0]&&n++)}return s})).map((e=>`(${e})`)).join(t)} +const E="[a-zA-Z]\\w*",x="[a-zA-Z_]\\w*",_="\\b\\d+(\\.\\d+)?",y="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",w="\\b(0b[01]+)",O={ +begin:"\\\\[\\s\\S]",relevance:0},k={scope:"string",begin:"'",end:"'", +illegal:"\\n",contains:[O]},v={scope:"string",begin:'"',end:'"',illegal:"\\n", +contains:[O]},N=(e,t,n={})=>{const s=i({scope:"comment",begin:e,end:t, +contains:[]},n);s.contains.push({scope:"doctag", +begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", +end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) +;const r=f("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) +;return s.contains.push({begin:h(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),s +},S=N("//","$"),M=N("/\\*","\\*/"),R=N("#","$");var A=Object.freeze({ +__proto__:null,APOS_STRING_MODE:k,BACKSLASH_ESCAPE:O,BINARY_NUMBER_MODE:{ +scope:"number",begin:w,relevance:0},BINARY_NUMBER_RE:w,COMMENT:N, +C_BLOCK_COMMENT_MODE:M,C_LINE_COMMENT_MODE:S,C_NUMBER_MODE:{scope:"number", +begin:y,relevance:0},C_NUMBER_RE:y,END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ +t.data._beginMatch!==e[1]&&t.ignoreMatch()}}),HASH_COMMENT_MODE:R,IDENT_RE:E, +MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:{begin:"\\.\\s*"+x,relevance:0}, +NUMBER_MODE:{scope:"number",begin:_,relevance:0},NUMBER_RE:_, +PHRASAL_WORDS_MODE:{ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},QUOTE_STRING_MODE:v,REGEXP_MODE:{scope:"regexp",begin:/\/(?=[^/\n]*\/)/, +end:/\/[gimuy]*/,contains:[O,{begin:/\[/,end:/\]/,relevance:0,contains:[O]}]}, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const t=/^#![ ]*\// +;return e.binary&&(e.begin=h(t,/.*\b/,e.binary,/\b.*/)),i({scope:"meta",begin:t, +end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)}, +TITLE_MODE:{scope:"title",begin:E,relevance:0},UNDERSCORE_IDENT_RE:x, +UNDERSCORE_TITLE_MODE:{scope:"title",begin:x,relevance:0}});function j(e,t){ +"."===e.input[e.index-1]&&t.ignoreMatch()}function I(e,t){ +void 0!==e.className&&(e.scope=e.className,delete e.className)}function T(e,t){ +t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=j,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function L(e,t){ +Array.isArray(e.illegal)&&(e.illegal=f(...e.illegal))}function B(e,t){ +if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function P(e,t){ +void 0===e.relevance&&(e.relevance=1)}const D=(e,t)=>{if(!e.beforeMatch)return +;if(e.starts)throw Error("beforeMatch cannot be used with starts") +;const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t] +})),e.keywords=n.keywords,e.begin=h(n.beforeMatch,g(n.begin)),e.starts={ +relevance:0,contains:[Object.assign(n,{endsParent:!0})] +},e.relevance=0,delete n.beforeMatch +},H=["of","and","for","in","not","or","if","then","parent","list","value"] +;function C(e,t,n="keyword"){const i=Object.create(null) +;return"string"==typeof e?s(n,e.split(" ")):Array.isArray(e)?s(n,e):Object.keys(e).forEach((n=>{ +Object.assign(i,C(e[n],t,n))})),i;function s(e,n){ +t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") +;i[n[0]]=[e,$(n[0],n[1])]}))}}function $(e,t){ +return t?Number(t):(e=>H.includes(e.toLowerCase()))(e)?0:1}const U={},z=e=>{ +console.error(e)},W=(e,...t)=>{console.log("WARN: "+e,...t)},X=(e,t)=>{ +U[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),U[`${e}/${t}`]=!0) +},G=Error();function K(e,t,{key:n}){let i=0;const s=e[n],r={},o={} +;for(let e=1;e<=t.length;e++)o[e+i]=s[e],r[e+i]=!0,i+=p(t[e-1]) +;e[n]=o,e[n]._emit=r,e[n]._multi=!0}function F(e){(e=>{ +e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, +delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ +_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope +}),(e=>{if(Array.isArray(e.begin)){ +if(e.skip||e.excludeBegin||e.returnBegin)throw z("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), +G +;if("object"!=typeof e.beginScope||null===e.beginScope)throw z("beginScope must be object"), +G;K(e,e.begin,{key:"beginScope"}),e.begin=m(e.begin,{joinWith:""})}})(e),(e=>{ +if(Array.isArray(e.end)){ +if(e.skip||e.excludeEnd||e.returnEnd)throw z("skip, excludeEnd, returnEnd not compatible with endScope: {}"), +G +;if("object"!=typeof e.endScope||null===e.endScope)throw z("endScope must be object"), +G;K(e,e.end,{key:"endScope"}),e.end=m(e.end,{joinWith:""})}})(e)}function Z(e){ +function t(t,n){ +return RegExp(l(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":"")) +}class n{constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,t){ +t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), +this.matchAt+=p(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=t(m(e,{joinWith:"|" +}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex +;const t=this.matcherRe.exec(e);if(!t)return null +;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] +;return t.splice(0,n),Object.assign(t,i)}}class s{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n +;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), +t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ +this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ +const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex +;let n=t.exec(e) +;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ +const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} +return n&&(this.regexIndex+=n.position+1, +this.regexIndex===this.count&&this.considerAll()),n}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=i(e.classNameAliases||{}),function n(r,o){const a=r +;if(r.isCompiled)return a +;[I,B,F,D].forEach((e=>e(r,o))),e.compilerExtensions.forEach((e=>e(r,o))), +r.__beforeBegin=null,[T,L,P].forEach((e=>e(r,o))),r.isCompiled=!0;let c=null +;return"object"==typeof r.keywords&&r.keywords.$pattern&&(r.keywords=Object.assign({},r.keywords), +c=r.keywords.$pattern, +delete r.keywords.$pattern),c=c||/\w+/,r.keywords&&(r.keywords=C(r.keywords,e.case_insensitive)), +a.keywordPatternRe=t(c,!0), +o&&(r.begin||(r.begin=/\B|\b/),a.beginRe=t(a.begin),r.end||r.endsWithParent||(r.end=/\B|\b/), +r.end&&(a.endRe=t(a.end)), +a.terminatorEnd=l(a.end)||"",r.endsWithParent&&o.terminatorEnd&&(a.terminatorEnd+=(r.end?"|":"")+o.terminatorEnd)), +r.illegal&&(a.illegalRe=t(r.illegal)), +r.contains||(r.contains=[]),r.contains=[].concat(...r.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>i(e,{ +variants:null},t)))),e.cachedVariants?e.cachedVariants:V(e)?i(e,{ +starts:e.starts?i(e.starts):null +}):Object.isFrozen(e)?i(e):e))("self"===e?r:e)))),r.contains.forEach((e=>{n(e,a) +})),r.starts&&n(r.starts,o),a.matcher=(e=>{const t=new s +;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(a),a}(e)}function V(e){ +return!!e&&(e.endsWithParent||V(e.starts))}class q extends Error{ +constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}} +const J=n,Y=i,Q=Symbol("nomatch"),ee=n=>{ +const i=Object.create(null),s=Object.create(null),r=[];let o=!0 +;const a="Could not find the language '{}', did you forget to load/include a language module?",l={ +disableAutodetect:!0,name:"Plain text",contains:[]};let p={ +ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +cssSelector:"pre code",languages:null,__emitter:c};function b(e){ +return p.noHighlightRe.test(e)}function m(e,t,n){let i="",s="" +;"object"==typeof t?(i=e, +n=t.ignoreIllegals,s=t.language):(X("10.7.0","highlight(lang, code, ...args) has been deprecated."), +X("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +s=e,i=t),void 0===n&&(n=!0);const r={code:i,language:s};N("before:highlight",r) +;const o=r.result?r.result:E(r.language,r.code,n) +;return o.code=r.code,N("after:highlight",o),o}function E(e,n,s,r){ +const c=Object.create(null);function l(){if(!N.keywords)return void M.addText(R) +;let e=0;N.keywordPatternRe.lastIndex=0;let t=N.keywordPatternRe.exec(R),n="" +;for(;t;){n+=R.substring(e,t.index) +;const s=w.case_insensitive?t[0].toLowerCase():t[0],r=(i=s,N.keywords[i]);if(r){ +const[e,i]=r +;if(M.addText(n),n="",c[s]=(c[s]||0)+1,c[s]<=7&&(A+=i),e.startsWith("_"))n+=t[0];else{ +const n=w.classNameAliases[e]||e;u(t[0],n)}}else n+=t[0] +;e=N.keywordPatternRe.lastIndex,t=N.keywordPatternRe.exec(R)}var i +;n+=R.substring(e),M.addText(n)}function g(){null!=N.subLanguage?(()=>{ +if(""===R)return;let e=null;if("string"==typeof N.subLanguage){ +if(!i[N.subLanguage])return void M.addText(R) +;e=E(N.subLanguage,R,!0,S[N.subLanguage]),S[N.subLanguage]=e._top +}else e=x(R,N.subLanguage.length?N.subLanguage:null) +;N.relevance>0&&(A+=e.relevance),M.__addSublanguage(e._emitter,e.language) +})():l(),R=""}function u(e,t){ +""!==e&&(M.startScope(t),M.addText(e),M.endScope())}function d(e,t){let n=1 +;const i=t.length-1;for(;n<=i;){if(!e._emit[n]){n++;continue} +const i=w.classNameAliases[e[n]]||e[n],s=t[n];i?u(s,i):(R=s,l(),R=""),n++}} +function h(e,t){ +return e.scope&&"string"==typeof e.scope&&M.openNode(w.classNameAliases[e.scope]||e.scope), +e.beginScope&&(e.beginScope._wrap?(u(R,w.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), +R=""):e.beginScope._multi&&(d(e.beginScope,t),R="")),N=Object.create(e,{parent:{ +value:N}}),N}function f(e,n,i){let s=((e,t)=>{const n=e&&e.exec(t) +;return n&&0===n.index})(e.endRe,i);if(s){if(e["on:end"]){const i=new t(e) +;e["on:end"](n,i),i.isMatchIgnored&&(s=!1)}if(s){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return f(e.parent,n,i)}function b(e){ +return 0===N.matcher.regexIndex?(R+=e[0],1):(T=!0,0)}function m(e){ +const t=e[0],i=n.substring(e.index),s=f(N,e,i);if(!s)return Q;const r=N +;N.endScope&&N.endScope._wrap?(g(), +u(t,N.endScope._wrap)):N.endScope&&N.endScope._multi?(g(), +d(N.endScope,e)):r.skip?R+=t:(r.returnEnd||r.excludeEnd||(R+=t), +g(),r.excludeEnd&&(R=t));do{ +N.scope&&M.closeNode(),N.skip||N.subLanguage||(A+=N.relevance),N=N.parent +}while(N!==s.parent);return s.starts&&h(s.starts,e),r.returnEnd?0:t.length} +let _={};function y(i,r){const a=r&&r[0];if(R+=i,null==a)return g(),0 +;if("begin"===_.type&&"end"===r.type&&_.index===r.index&&""===a){ +if(R+=n.slice(r.index,r.index+1),!o){const t=Error(`0 width match regex (${e})`) +;throw t.languageName=e,t.badRule=_.rule,t}return 1} +if(_=r,"begin"===r.type)return(e=>{ +const n=e[0],i=e.rule,s=new t(i),r=[i.__beforeBegin,i["on:begin"]] +;for(const t of r)if(t&&(t(e,s),s.isMatchIgnored))return b(n) +;return i.skip?R+=n:(i.excludeBegin&&(R+=n), +g(),i.returnBegin||i.excludeBegin||(R=n)),h(i,e),i.returnBegin?0:n.length})(r) +;if("illegal"===r.type&&!s){ +const e=Error('Illegal lexeme "'+a+'" for mode "'+(N.scope||"")+'"') +;throw e.mode=N,e}if("end"===r.type){const e=m(r);if(e!==Q)return e} +if("illegal"===r.type&&""===a)return R+="\n",1 +;if(I>1e5&&I>3*r.index)throw Error("potential infinite loop, way more iterations than matches") +;return R+=a,a.length}const w=O(e) +;if(!w)throw z(a.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const k=Z(w);let v="",N=r||k;const S={},M=new p.__emitter(p);(()=>{const e=[] +;for(let t=N;t!==w;t=t.parent)t.scope&&e.unshift(t.scope) +;e.forEach((e=>M.openNode(e)))})();let R="",A=0,j=0,I=0,T=!1;try{ +if(w.__emitTokens)w.__emitTokens(n,M);else{for(N.matcher.considerAll();;){ +I++,T?T=!1:N.matcher.considerAll(),N.matcher.lastIndex=j +;const e=N.matcher.exec(n);if(!e)break;const t=y(n.substring(j,e.index),e) +;j=e.index+t}y(n.substring(j))}return M.finalize(),v=M.toHTML(),{language:e, +value:v,relevance:A,illegal:!1,_emitter:M,_top:N}}catch(t){ +if(t.message&&t.message.includes("Illegal"))return{language:e,value:J(n), +illegal:!0,relevance:0,_illegalBy:{message:t.message,index:j, +context:n.slice(j-100,j+100),mode:t.mode,resultSoFar:v},_emitter:M};if(o)return{ +language:e,value:J(n),illegal:!1,relevance:0,errorRaised:t,_emitter:M,_top:N} +;throw t}}function x(e,t){t=t||p.languages||Object.keys(i);const n=(e=>{ +const t={value:J(e),illegal:!1,relevance:0,_top:l,_emitter:new p.__emitter(p)} +;return t._emitter.addText(e),t})(e),s=t.filter(O).filter(v).map((t=>E(t,e,!1))) +;s.unshift(n);const r=s.sort(((e,t)=>{ +if(e.relevance!==t.relevance)return t.relevance-e.relevance +;if(e.language&&t.language){if(O(e.language).supersetOf===t.language)return 1 +;if(O(t.language).supersetOf===e.language)return-1}return 0})),[o,a]=r,c=o +;return c.secondBest=a,c}function _(e){let t=null;const n=(e=>{ +let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"" +;const n=p.languageDetectRe.exec(t);if(n){const t=O(n[1]) +;return t||(W(a.replace("{}",n[1])), +W("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"} +return t.split(/\s+/).find((e=>b(e)||O(e)))})(e);if(b(n))return +;if(N("before:highlightElement",{el:e,language:n +}),e.dataset.highlighted)return void console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e) +;if(e.children.length>0&&(p.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), +console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), +console.warn("The element with unescaped HTML:"), +console.warn(e)),p.throwUnescapedHTML))throw new q("One of your code blocks includes unescaped HTML.",e.innerHTML) +;t=e;const i=t.textContent,r=n?m(i,{language:n,ignoreIllegals:!0}):x(i) +;e.innerHTML=r.value,e.dataset.highlighted="yes",((e,t,n)=>{const i=t&&s[t]||n +;e.classList.add("hljs"),e.classList.add("language-"+i) +})(e,n,r.language),e.result={language:r.language,re:r.relevance, +relevance:r.relevance},r.secondBest&&(e.secondBest={ +language:r.secondBest.language,relevance:r.secondBest.relevance +}),N("after:highlightElement",{el:e,result:r,text:i})}let y=!1;function w(){ +if("loading"===document.readyState)return y||window.addEventListener("DOMContentLoaded",(()=>{ +w()}),!1),void(y=!0);document.querySelectorAll(p.cssSelector).forEach(_)} +function O(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]} +function k(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +s[e.toLowerCase()]=t}))}function v(e){const t=O(e) +;return t&&!t.disableAutodetect}function N(e,t){const n=e;r.forEach((e=>{ +e[n]&&e[n](t)}))}Object.assign(n,{highlight:m,highlightAuto:x,highlightAll:w, +highlightElement:_, +highlightBlock:e=>(X("10.7.0","highlightBlock will be removed entirely in v12.0"), +X("10.7.0","Please use highlightElement now."),_(e)),configure:e=>{p=Y(p,e)}, +initHighlighting:()=>{ +w(),X("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, +initHighlightingOnLoad:()=>{ +w(),X("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") +},registerLanguage:(e,t)=>{let s=null;try{s=t(n)}catch(t){ +if(z("Language definition for '{}' could not be registered.".replace("{}",e)), +!o)throw t;z(t),s=l} +s.name||(s.name=e),i[e]=s,s.rawDefinition=t.bind(null,n),s.aliases&&k(s.aliases,{ +languageName:e})},unregisterLanguage:e=>{delete i[e] +;for(const t of Object.keys(s))s[t]===e&&delete s[t]}, +listLanguages:()=>Object.keys(i),getLanguage:O,registerAliases:k, +autoDetection:v,inherit:Y,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ +e["before:highlightBlock"](Object.assign({block:t.el},t)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ +e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),r.push(e)}, +removePlugin:e=>{const t=r.indexOf(e);-1!==t&&r.splice(t,1)}}),n.debugMode=()=>{ +o=!1},n.safeMode=()=>{o=!0},n.versionString="11.11.1",n.regex={concat:h, +lookahead:g,either:f,optional:d,anyNumberOfTimes:u} +;for(const t in A)"object"==typeof A[t]&&e(A[t]);return Object.assign(n,A),n +},te=ee({});te.newInstance=()=>ee({});export{te as default}; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/highlight.js b/backend/static/highlight(1)/es/highlight.js new file mode 100644 index 0000000..f8a828d --- /dev/null +++ b/backend/static/highlight(1)/es/highlight.js @@ -0,0 +1,2600 @@ +/*! + Highlight.js v11.11.1 (git: 08cb242e7d) + (c) 2006-2025 Josh Goebel and other contributors + License: BSD-3-Clause + */ +/* eslint-disable no-multi-assign */ + +function deepFreeze(obj) { + if (obj instanceof Map) { + obj.clear = + obj.delete = + obj.set = + function () { + throw new Error('map is read-only'); + }; + } else if (obj instanceof Set) { + obj.add = + obj.clear = + obj.delete = + function () { + throw new Error('set is read-only'); + }; + } + + // Freeze self + Object.freeze(obj); + + Object.getOwnPropertyNames(obj).forEach((name) => { + const prop = obj[name]; + const type = typeof prop; + + // Freeze prop if it is an object or function and also not already frozen + if ((type === 'object' || type === 'function') && !Object.isFrozen(prop)) { + deepFreeze(prop); + } + }); + + return obj; +} + +/** @typedef {import('highlight.js').CallbackResponse} CallbackResponse */ +/** @typedef {import('highlight.js').CompiledMode} CompiledMode */ +/** @implements CallbackResponse */ + +class Response { + /** + * @param {CompiledMode} mode + */ + constructor(mode) { + // eslint-disable-next-line no-undefined + if (mode.data === undefined) mode.data = {}; + + this.data = mode.data; + this.isMatchIgnored = false; + } + + ignoreMatch() { + this.isMatchIgnored = true; + } +} + +/** + * @param {string} value + * @returns {string} + */ +function escapeHTML(value) { + return value + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +/** + * performs a shallow merge of multiple objects into one + * + * @template T + * @param {T} original + * @param {Record[]} objects + * @returns {T} a single new object + */ +function inherit$1(original, ...objects) { + /** @type Record */ + const result = Object.create(null); + + for (const key in original) { + result[key] = original[key]; + } + objects.forEach(function(obj) { + for (const key in obj) { + result[key] = obj[key]; + } + }); + return /** @type {T} */ (result); +} + +/** + * @typedef {object} Renderer + * @property {(text: string) => void} addText + * @property {(node: Node) => void} openNode + * @property {(node: Node) => void} closeNode + * @property {() => string} value + */ + +/** @typedef {{scope?: string, language?: string, sublanguage?: boolean}} Node */ +/** @typedef {{walk: (r: Renderer) => void}} Tree */ +/** */ + +const SPAN_CLOSE = ''; + +/** + * Determines if a node needs to be wrapped in + * + * @param {Node} node */ +const emitsWrappingTags = (node) => { + // rarely we can have a sublanguage where language is undefined + // TODO: track down why + return !!node.scope; +}; + +/** + * + * @param {string} name + * @param {{prefix:string}} options + */ +const scopeToCSSClass = (name, { prefix }) => { + // sub-language + if (name.startsWith("language:")) { + return name.replace("language:", "language-"); + } + // tiered scope: comment.line + if (name.includes(".")) { + const pieces = name.split("."); + return [ + `${prefix}${pieces.shift()}`, + ...(pieces.map((x, i) => `${x}${"_".repeat(i + 1)}`)) + ].join(" "); + } + // simple scope + return `${prefix}${name}`; +}; + +/** @type {Renderer} */ +class HTMLRenderer { + /** + * Creates a new HTMLRenderer + * + * @param {Tree} parseTree - the parse tree (must support `walk` API) + * @param {{classPrefix: string}} options + */ + constructor(parseTree, options) { + this.buffer = ""; + this.classPrefix = options.classPrefix; + parseTree.walk(this); + } + + /** + * Adds texts to the output stream + * + * @param {string} text */ + addText(text) { + this.buffer += escapeHTML(text); + } + + /** + * Adds a node open to the output stream (if needed) + * + * @param {Node} node */ + openNode(node) { + if (!emitsWrappingTags(node)) return; + + const className = scopeToCSSClass(node.scope, + { prefix: this.classPrefix }); + this.span(className); + } + + /** + * Adds a node close to the output stream (if needed) + * + * @param {Node} node */ + closeNode(node) { + if (!emitsWrappingTags(node)) return; + + this.buffer += SPAN_CLOSE; + } + + /** + * returns the accumulated buffer + */ + value() { + return this.buffer; + } + + // helpers + + /** + * Builds a span element + * + * @param {string} className */ + span(className) { + this.buffer += ``; + } +} + +/** @typedef {{scope?: string, language?: string, children: Node[]} | string} Node */ +/** @typedef {{scope?: string, language?: string, children: Node[]} } DataNode */ +/** @typedef {import('highlight.js').Emitter} Emitter */ +/** */ + +/** @returns {DataNode} */ +const newNode = (opts = {}) => { + /** @type DataNode */ + const result = { children: [] }; + Object.assign(result, opts); + return result; +}; + +class TokenTree { + constructor() { + /** @type DataNode */ + this.rootNode = newNode(); + this.stack = [this.rootNode]; + } + + get top() { + return this.stack[this.stack.length - 1]; + } + + get root() { return this.rootNode; } + + /** @param {Node} node */ + add(node) { + this.top.children.push(node); + } + + /** @param {string} scope */ + openNode(scope) { + /** @type Node */ + const node = newNode({ scope }); + this.add(node); + this.stack.push(node); + } + + closeNode() { + if (this.stack.length > 1) { + return this.stack.pop(); + } + // eslint-disable-next-line no-undefined + return undefined; + } + + closeAllNodes() { + while (this.closeNode()); + } + + toJSON() { + return JSON.stringify(this.rootNode, null, 4); + } + + /** + * @typedef { import("./html_renderer").Renderer } Renderer + * @param {Renderer} builder + */ + walk(builder) { + // this does not + return this.constructor._walk(builder, this.rootNode); + // this works + // return TokenTree._walk(builder, this.rootNode); + } + + /** + * @param {Renderer} builder + * @param {Node} node + */ + static _walk(builder, node) { + if (typeof node === "string") { + builder.addText(node); + } else if (node.children) { + builder.openNode(node); + node.children.forEach((child) => this._walk(builder, child)); + builder.closeNode(node); + } + return builder; + } + + /** + * @param {Node} node + */ + static _collapse(node) { + if (typeof node === "string") return; + if (!node.children) return; + + if (node.children.every(el => typeof el === "string")) { + // node.text = node.children.join(""); + // delete node.children; + node.children = [node.children.join("")]; + } else { + node.children.forEach((child) => { + TokenTree._collapse(child); + }); + } + } +} + +/** + Currently this is all private API, but this is the minimal API necessary + that an Emitter must implement to fully support the parser. + + Minimal interface: + + - addText(text) + - __addSublanguage(emitter, subLanguageName) + - startScope(scope) + - endScope() + - finalize() + - toHTML() + +*/ + +/** + * @implements {Emitter} + */ +class TokenTreeEmitter extends TokenTree { + /** + * @param {*} options + */ + constructor(options) { + super(); + this.options = options; + } + + /** + * @param {string} text + */ + addText(text) { + if (text === "") { return; } + + this.add(text); + } + + /** @param {string} scope */ + startScope(scope) { + this.openNode(scope); + } + + endScope() { + this.closeNode(); + } + + /** + * @param {Emitter & {root: DataNode}} emitter + * @param {string} name + */ + __addSublanguage(emitter, name) { + /** @type DataNode */ + const node = emitter.root; + if (name) node.scope = `language:${name}`; + + this.add(node); + } + + toHTML() { + const renderer = new HTMLRenderer(this, this.options); + return renderer.value(); + } + + finalize() { + this.closeAllNodes(); + return true; + } +} + +/** + * @param {string} value + * @returns {RegExp} + * */ + +/** + * @param {RegExp | string } re + * @returns {string} + */ +function source(re) { + if (!re) return null; + if (typeof re === "string") return re; + + return re.source; +} + +/** + * @param {RegExp | string } re + * @returns {string} + */ +function lookahead(re) { + return concat('(?=', re, ')'); +} + +/** + * @param {RegExp | string } re + * @returns {string} + */ +function anyNumberOfTimes(re) { + return concat('(?:', re, ')*'); +} + +/** + * @param {RegExp | string } re + * @returns {string} + */ +function optional(re) { + return concat('(?:', re, ')?'); +} + +/** + * @param {...(RegExp | string) } args + * @returns {string} + */ +function concat(...args) { + const joined = args.map((x) => source(x)).join(""); + return joined; +} + +/** + * @param { Array } args + * @returns {object} + */ +function stripOptionsFromArgs(args) { + const opts = args[args.length - 1]; + + if (typeof opts === 'object' && opts.constructor === Object) { + args.splice(args.length - 1, 1); + return opts; + } else { + return {}; + } +} + +/** @typedef { {capture?: boolean} } RegexEitherOptions */ + +/** + * Any of the passed expresssions may match + * + * Creates a huge this | this | that | that match + * @param {(RegExp | string)[] | [...(RegExp | string)[], RegexEitherOptions]} args + * @returns {string} + */ +function either(...args) { + /** @type { object & {capture?: boolean} } */ + const opts = stripOptionsFromArgs(args); + const joined = '(' + + (opts.capture ? "" : "?:") + + args.map((x) => source(x)).join("|") + ")"; + return joined; +} + +/** + * @param {RegExp | string} re + * @returns {number} + */ +function countMatchGroups(re) { + return (new RegExp(re.toString() + '|')).exec('').length - 1; +} + +/** + * Does lexeme start with a regular expression match at the beginning + * @param {RegExp} re + * @param {string} lexeme + */ +function startsWith(re, lexeme) { + const match = re && re.exec(lexeme); + return match && match.index === 0; +} + +// BACKREF_RE matches an open parenthesis or backreference. To avoid +// an incorrect parse, it additionally matches the following: +// - [...] elements, where the meaning of parentheses and escapes change +// - other escape sequences, so we do not misparse escape sequences as +// interesting elements +// - non-matching or lookahead parentheses, which do not capture. These +// follow the '(' with a '?'. +const BACKREF_RE = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./; + +// **INTERNAL** Not intended for outside usage +// join logically computes regexps.join(separator), but fixes the +// backreferences so they continue to match. +// it also places each individual regular expression into it's own +// match group, keeping track of the sequencing of those match groups +// is currently an exercise for the caller. :-) +/** + * @param {(string | RegExp)[]} regexps + * @param {{joinWith: string}} opts + * @returns {string} + */ +function _rewriteBackreferences(regexps, { joinWith }) { + let numCaptures = 0; + + return regexps.map((regex) => { + numCaptures += 1; + const offset = numCaptures; + let re = source(regex); + let out = ''; + + while (re.length > 0) { + const match = BACKREF_RE.exec(re); + if (!match) { + out += re; + break; + } + out += re.substring(0, match.index); + re = re.substring(match.index + match[0].length); + if (match[0][0] === '\\' && match[1]) { + // Adjust the backreference. + out += '\\' + String(Number(match[1]) + offset); + } else { + out += match[0]; + if (match[0] === '(') { + numCaptures++; + } + } + } + return out; + }).map(re => `(${re})`).join(joinWith); +} + +/** @typedef {import('highlight.js').Mode} Mode */ +/** @typedef {import('highlight.js').ModeCallback} ModeCallback */ + +// Common regexps +const MATCH_NOTHING_RE = /\b\B/; +const IDENT_RE = '[a-zA-Z]\\w*'; +const UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\w*'; +const NUMBER_RE = '\\b\\d+(\\.\\d+)?'; +const C_NUMBER_RE = '(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)'; // 0x..., 0..., decimal, float +const BINARY_NUMBER_RE = '\\b(0b[01]+)'; // 0b... +const RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~'; + +/** +* @param { Partial & {binary?: string | RegExp} } opts +*/ +const SHEBANG = (opts = {}) => { + const beginShebang = /^#![ ]*\//; + if (opts.binary) { + opts.begin = concat( + beginShebang, + /.*\b/, + opts.binary, + /\b.*/); + } + return inherit$1({ + scope: 'meta', + begin: beginShebang, + end: /$/, + relevance: 0, + /** @type {ModeCallback} */ + "on:begin": (m, resp) => { + if (m.index !== 0) resp.ignoreMatch(); + } + }, opts); +}; + +// Common modes +const BACKSLASH_ESCAPE = { + begin: '\\\\[\\s\\S]', relevance: 0 +}; +const APOS_STRING_MODE = { + scope: 'string', + begin: '\'', + end: '\'', + illegal: '\\n', + contains: [BACKSLASH_ESCAPE] +}; +const QUOTE_STRING_MODE = { + scope: 'string', + begin: '"', + end: '"', + illegal: '\\n', + contains: [BACKSLASH_ESCAPE] +}; +const PHRASAL_WORDS_MODE = { + begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +}; +/** + * Creates a comment mode + * + * @param {string | RegExp} begin + * @param {string | RegExp} end + * @param {Mode | {}} [modeOptions] + * @returns {Partial} + */ +const COMMENT = function(begin, end, modeOptions = {}) { + const mode = inherit$1( + { + scope: 'comment', + begin, + end, + contains: [] + }, + modeOptions + ); + mode.contains.push({ + scope: 'doctag', + // hack to avoid the space from being included. the space is necessary to + // match here to prevent the plain text rule below from gobbling up doctags + begin: '[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)', + end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/, + excludeBegin: true, + relevance: 0 + }); + const ENGLISH_WORD = either( + // list of common 1 and 2 letter words in English + "I", + "a", + "is", + "so", + "us", + "to", + "at", + "if", + "in", + "it", + "on", + // note: this is not an exhaustive list of contractions, just popular ones + /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, // contractions - can't we'd they're let's, etc + /[A-Za-z]+[-][a-z]+/, // `no-way`, etc. + /[A-Za-z][a-z]{2,}/ // allow capitalized words at beginning of sentences + ); + // looking like plain text, more likely to be a comment + mode.contains.push( + { + // TODO: how to include ", (, ) without breaking grammars that use these for + // comment delimiters? + // begin: /[ ]+([()"]?([A-Za-z'-]{3,}|is|a|I|so|us|[tT][oO]|at|if|in|it|on)[.]?[()":]?([.][ ]|[ ]|\))){3}/ + // --- + + // this tries to find sequences of 3 english words in a row (without any + // "programming" type syntax) this gives us a strong signal that we've + // TRULY found a comment - vs perhaps scanning with the wrong language. + // It's possible to find something that LOOKS like the start of the + // comment - but then if there is no readable text - good chance it is a + // false match and not a comment. + // + // for a visual example please see: + // https://github.com/highlightjs/highlight.js/issues/2827 + + begin: concat( + /[ ]+/, // necessary to prevent us gobbling up doctags like /* @author Bob Mcgill */ + '(', + ENGLISH_WORD, + /[.]?[:]?([.][ ]|[ ])/, + '){3}') // look for 3 words in a row + } + ); + return mode; +}; +const C_LINE_COMMENT_MODE = COMMENT('//', '$'); +const C_BLOCK_COMMENT_MODE = COMMENT('/\\*', '\\*/'); +const HASH_COMMENT_MODE = COMMENT('#', '$'); +const NUMBER_MODE = { + scope: 'number', + begin: NUMBER_RE, + relevance: 0 +}; +const C_NUMBER_MODE = { + scope: 'number', + begin: C_NUMBER_RE, + relevance: 0 +}; +const BINARY_NUMBER_MODE = { + scope: 'number', + begin: BINARY_NUMBER_RE, + relevance: 0 +}; +const REGEXP_MODE = { + scope: "regexp", + begin: /\/(?=[^/\n]*\/)/, + end: /\/[gimuy]*/, + contains: [ + BACKSLASH_ESCAPE, + { + begin: /\[/, + end: /\]/, + relevance: 0, + contains: [BACKSLASH_ESCAPE] + } + ] +}; +const TITLE_MODE = { + scope: 'title', + begin: IDENT_RE, + relevance: 0 +}; +const UNDERSCORE_TITLE_MODE = { + scope: 'title', + begin: UNDERSCORE_IDENT_RE, + relevance: 0 +}; +const METHOD_GUARD = { + // excludes method names from keyword processing + begin: '\\.\\s*' + UNDERSCORE_IDENT_RE, + relevance: 0 +}; + +/** + * Adds end same as begin mechanics to a mode + * + * Your mode must include at least a single () match group as that first match + * group is what is used for comparison + * @param {Partial} mode + */ +const END_SAME_AS_BEGIN = function(mode) { + return Object.assign(mode, + { + /** @type {ModeCallback} */ + 'on:begin': (m, resp) => { resp.data._beginMatch = m[1]; }, + /** @type {ModeCallback} */ + 'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); } + }); +}; + +var MODES = /*#__PURE__*/Object.freeze({ + __proto__: null, + APOS_STRING_MODE: APOS_STRING_MODE, + BACKSLASH_ESCAPE: BACKSLASH_ESCAPE, + BINARY_NUMBER_MODE: BINARY_NUMBER_MODE, + BINARY_NUMBER_RE: BINARY_NUMBER_RE, + COMMENT: COMMENT, + C_BLOCK_COMMENT_MODE: C_BLOCK_COMMENT_MODE, + C_LINE_COMMENT_MODE: C_LINE_COMMENT_MODE, + C_NUMBER_MODE: C_NUMBER_MODE, + C_NUMBER_RE: C_NUMBER_RE, + END_SAME_AS_BEGIN: END_SAME_AS_BEGIN, + HASH_COMMENT_MODE: HASH_COMMENT_MODE, + IDENT_RE: IDENT_RE, + MATCH_NOTHING_RE: MATCH_NOTHING_RE, + METHOD_GUARD: METHOD_GUARD, + NUMBER_MODE: NUMBER_MODE, + NUMBER_RE: NUMBER_RE, + PHRASAL_WORDS_MODE: PHRASAL_WORDS_MODE, + QUOTE_STRING_MODE: QUOTE_STRING_MODE, + REGEXP_MODE: REGEXP_MODE, + RE_STARTERS_RE: RE_STARTERS_RE, + SHEBANG: SHEBANG, + TITLE_MODE: TITLE_MODE, + UNDERSCORE_IDENT_RE: UNDERSCORE_IDENT_RE, + UNDERSCORE_TITLE_MODE: UNDERSCORE_TITLE_MODE +}); + +/** +@typedef {import('highlight.js').CallbackResponse} CallbackResponse +@typedef {import('highlight.js').CompilerExt} CompilerExt +*/ + +// Grammar extensions / plugins +// See: https://github.com/highlightjs/highlight.js/issues/2833 + +// Grammar extensions allow "syntactic sugar" to be added to the grammar modes +// without requiring any underlying changes to the compiler internals. + +// `compileMatch` being the perfect small example of now allowing a grammar +// author to write `match` when they desire to match a single expression rather +// than being forced to use `begin`. The extension then just moves `match` into +// `begin` when it runs. Ie, no features have been added, but we've just made +// the experience of writing (and reading grammars) a little bit nicer. + +// ------ + +// TODO: We need negative look-behind support to do this properly +/** + * Skip a match if it has a preceding dot + * + * This is used for `beginKeywords` to prevent matching expressions such as + * `bob.keyword.do()`. The mode compiler automatically wires this up as a + * special _internal_ 'on:begin' callback for modes with `beginKeywords` + * @param {RegExpMatchArray} match + * @param {CallbackResponse} response + */ +function skipIfHasPrecedingDot(match, response) { + const before = match.input[match.index - 1]; + if (before === ".") { + response.ignoreMatch(); + } +} + +/** + * + * @type {CompilerExt} + */ +function scopeClassName(mode, _parent) { + // eslint-disable-next-line no-undefined + if (mode.className !== undefined) { + mode.scope = mode.className; + delete mode.className; + } +} + +/** + * `beginKeywords` syntactic sugar + * @type {CompilerExt} + */ +function beginKeywords(mode, parent) { + if (!parent) return; + if (!mode.beginKeywords) return; + + // for languages with keywords that include non-word characters checking for + // a word boundary is not sufficient, so instead we check for a word boundary + // or whitespace - this does no harm in any case since our keyword engine + // doesn't allow spaces in keywords anyways and we still check for the boundary + // first + mode.begin = '\\b(' + mode.beginKeywords.split(' ').join('|') + ')(?!\\.)(?=\\b|\\s)'; + mode.__beforeBegin = skipIfHasPrecedingDot; + mode.keywords = mode.keywords || mode.beginKeywords; + delete mode.beginKeywords; + + // prevents double relevance, the keywords themselves provide + // relevance, the mode doesn't need to double it + // eslint-disable-next-line no-undefined + if (mode.relevance === undefined) mode.relevance = 0; +} + +/** + * Allow `illegal` to contain an array of illegal values + * @type {CompilerExt} + */ +function compileIllegal(mode, _parent) { + if (!Array.isArray(mode.illegal)) return; + + mode.illegal = either(...mode.illegal); +} + +/** + * `match` to match a single expression for readability + * @type {CompilerExt} + */ +function compileMatch(mode, _parent) { + if (!mode.match) return; + if (mode.begin || mode.end) throw new Error("begin & end are not supported with match"); + + mode.begin = mode.match; + delete mode.match; +} + +/** + * provides the default 1 relevance to all modes + * @type {CompilerExt} + */ +function compileRelevance(mode, _parent) { + // eslint-disable-next-line no-undefined + if (mode.relevance === undefined) mode.relevance = 1; +} + +// allow beforeMatch to act as a "qualifier" for the match +// the full match begin must be [beforeMatch][begin] +const beforeMatchExt = (mode, parent) => { + if (!mode.beforeMatch) return; + // starts conflicts with endsParent which we need to make sure the child + // rule is not matched multiple times + if (mode.starts) throw new Error("beforeMatch cannot be used with starts"); + + const originalMode = Object.assign({}, mode); + Object.keys(mode).forEach((key) => { delete mode[key]; }); + + mode.keywords = originalMode.keywords; + mode.begin = concat(originalMode.beforeMatch, lookahead(originalMode.begin)); + mode.starts = { + relevance: 0, + contains: [ + Object.assign(originalMode, { endsParent: true }) + ] + }; + mode.relevance = 0; + + delete originalMode.beforeMatch; +}; + +// keywords that should have no default relevance value +const COMMON_KEYWORDS = [ + 'of', + 'and', + 'for', + 'in', + 'not', + 'or', + 'if', + 'then', + 'parent', // common variable name + 'list', // common variable name + 'value' // common variable name +]; + +const DEFAULT_KEYWORD_SCOPE = "keyword"; + +/** + * Given raw keywords from a language definition, compile them. + * + * @param {string | Record | Array} rawKeywords + * @param {boolean} caseInsensitive + */ +function compileKeywords(rawKeywords, caseInsensitive, scopeName = DEFAULT_KEYWORD_SCOPE) { + /** @type {import("highlight.js/private").KeywordDict} */ + const compiledKeywords = Object.create(null); + + // input can be a string of keywords, an array of keywords, or a object with + // named keys representing scopeName (which can then point to a string or array) + if (typeof rawKeywords === 'string') { + compileList(scopeName, rawKeywords.split(" ")); + } else if (Array.isArray(rawKeywords)) { + compileList(scopeName, rawKeywords); + } else { + Object.keys(rawKeywords).forEach(function(scopeName) { + // collapse all our objects back into the parent object + Object.assign( + compiledKeywords, + compileKeywords(rawKeywords[scopeName], caseInsensitive, scopeName) + ); + }); + } + return compiledKeywords; + + // --- + + /** + * Compiles an individual list of keywords + * + * Ex: "for if when while|5" + * + * @param {string} scopeName + * @param {Array} keywordList + */ + function compileList(scopeName, keywordList) { + if (caseInsensitive) { + keywordList = keywordList.map(x => x.toLowerCase()); + } + keywordList.forEach(function(keyword) { + const pair = keyword.split('|'); + compiledKeywords[pair[0]] = [scopeName, scoreForKeyword(pair[0], pair[1])]; + }); + } +} + +/** + * Returns the proper score for a given keyword + * + * Also takes into account comment keywords, which will be scored 0 UNLESS + * another score has been manually assigned. + * @param {string} keyword + * @param {string} [providedScore] + */ +function scoreForKeyword(keyword, providedScore) { + // manual scores always win over common keywords + // so you can force a score of 1 if you really insist + if (providedScore) { + return Number(providedScore); + } + + return commonKeyword(keyword) ? 0 : 1; +} + +/** + * Determines if a given keyword is common or not + * + * @param {string} keyword */ +function commonKeyword(keyword) { + return COMMON_KEYWORDS.includes(keyword.toLowerCase()); +} + +/* + +For the reasoning behind this please see: +https://github.com/highlightjs/highlight.js/issues/2880#issuecomment-747275419 + +*/ + +/** + * @type {Record} + */ +const seenDeprecations = {}; + +/** + * @param {string} message + */ +const error = (message) => { + console.error(message); +}; + +/** + * @param {string} message + * @param {any} args + */ +const warn = (message, ...args) => { + console.log(`WARN: ${message}`, ...args); +}; + +/** + * @param {string} version + * @param {string} message + */ +const deprecated = (version, message) => { + if (seenDeprecations[`${version}/${message}`]) return; + + console.log(`Deprecated as of ${version}. ${message}`); + seenDeprecations[`${version}/${message}`] = true; +}; + +/* eslint-disable no-throw-literal */ + +/** +@typedef {import('highlight.js').CompiledMode} CompiledMode +*/ + +const MultiClassError = new Error(); + +/** + * Renumbers labeled scope names to account for additional inner match + * groups that otherwise would break everything. + * + * Lets say we 3 match scopes: + * + * { 1 => ..., 2 => ..., 3 => ... } + * + * So what we need is a clean match like this: + * + * (a)(b)(c) => [ "a", "b", "c" ] + * + * But this falls apart with inner match groups: + * + * (a)(((b)))(c) => ["a", "b", "b", "b", "c" ] + * + * Our scopes are now "out of alignment" and we're repeating `b` 3 times. + * What needs to happen is the numbers are remapped: + * + * { 1 => ..., 2 => ..., 5 => ... } + * + * We also need to know that the ONLY groups that should be output + * are 1, 2, and 5. This function handles this behavior. + * + * @param {CompiledMode} mode + * @param {Array} regexes + * @param {{key: "beginScope"|"endScope"}} opts + */ +function remapScopeNames(mode, regexes, { key }) { + let offset = 0; + const scopeNames = mode[key]; + /** @type Record */ + const emit = {}; + /** @type Record */ + const positions = {}; + + for (let i = 1; i <= regexes.length; i++) { + positions[i + offset] = scopeNames[i]; + emit[i + offset] = true; + offset += countMatchGroups(regexes[i - 1]); + } + // we use _emit to keep track of which match groups are "top-level" to avoid double + // output from inside match groups + mode[key] = positions; + mode[key]._emit = emit; + mode[key]._multi = true; +} + +/** + * @param {CompiledMode} mode + */ +function beginMultiClass(mode) { + if (!Array.isArray(mode.begin)) return; + + if (mode.skip || mode.excludeBegin || mode.returnBegin) { + error("skip, excludeBegin, returnBegin not compatible with beginScope: {}"); + throw MultiClassError; + } + + if (typeof mode.beginScope !== "object" || mode.beginScope === null) { + error("beginScope must be object"); + throw MultiClassError; + } + + remapScopeNames(mode, mode.begin, { key: "beginScope" }); + mode.begin = _rewriteBackreferences(mode.begin, { joinWith: "" }); +} + +/** + * @param {CompiledMode} mode + */ +function endMultiClass(mode) { + if (!Array.isArray(mode.end)) return; + + if (mode.skip || mode.excludeEnd || mode.returnEnd) { + error("skip, excludeEnd, returnEnd not compatible with endScope: {}"); + throw MultiClassError; + } + + if (typeof mode.endScope !== "object" || mode.endScope === null) { + error("endScope must be object"); + throw MultiClassError; + } + + remapScopeNames(mode, mode.end, { key: "endScope" }); + mode.end = _rewriteBackreferences(mode.end, { joinWith: "" }); +} + +/** + * this exists only to allow `scope: {}` to be used beside `match:` + * Otherwise `beginScope` would necessary and that would look weird + + { + match: [ /def/, /\w+/ ] + scope: { 1: "keyword" , 2: "title" } + } + + * @param {CompiledMode} mode + */ +function scopeSugar(mode) { + if (mode.scope && typeof mode.scope === "object" && mode.scope !== null) { + mode.beginScope = mode.scope; + delete mode.scope; + } +} + +/** + * @param {CompiledMode} mode + */ +function MultiClass(mode) { + scopeSugar(mode); + + if (typeof mode.beginScope === "string") { + mode.beginScope = { _wrap: mode.beginScope }; + } + if (typeof mode.endScope === "string") { + mode.endScope = { _wrap: mode.endScope }; + } + + beginMultiClass(mode); + endMultiClass(mode); +} + +/** +@typedef {import('highlight.js').Mode} Mode +@typedef {import('highlight.js').CompiledMode} CompiledMode +@typedef {import('highlight.js').Language} Language +@typedef {import('highlight.js').HLJSPlugin} HLJSPlugin +@typedef {import('highlight.js').CompiledLanguage} CompiledLanguage +*/ + +// compilation + +/** + * Compiles a language definition result + * + * Given the raw result of a language definition (Language), compiles this so + * that it is ready for highlighting code. + * @param {Language} language + * @returns {CompiledLanguage} + */ +function compileLanguage(language) { + /** + * Builds a regex with the case sensitivity of the current language + * + * @param {RegExp | string} value + * @param {boolean} [global] + */ + function langRe(value, global) { + return new RegExp( + source(value), + 'm' + + (language.case_insensitive ? 'i' : '') + + (language.unicodeRegex ? 'u' : '') + + (global ? 'g' : '') + ); + } + + /** + Stores multiple regular expressions and allows you to quickly search for + them all in a string simultaneously - returning the first match. It does + this by creating a huge (a|b|c) regex - each individual item wrapped with () + and joined by `|` - using match groups to track position. When a match is + found checking which position in the array has content allows us to figure + out which of the original regexes / match groups triggered the match. + + The match object itself (the result of `Regex.exec`) is returned but also + enhanced by merging in any meta-data that was registered with the regex. + This is how we keep track of which mode matched, and what type of rule + (`illegal`, `begin`, end, etc). + */ + class MultiRegex { + constructor() { + this.matchIndexes = {}; + // @ts-ignore + this.regexes = []; + this.matchAt = 1; + this.position = 0; + } + + // @ts-ignore + addRule(re, opts) { + opts.position = this.position++; + // @ts-ignore + this.matchIndexes[this.matchAt] = opts; + this.regexes.push([opts, re]); + this.matchAt += countMatchGroups(re) + 1; + } + + compile() { + if (this.regexes.length === 0) { + // avoids the need to check length every time exec is called + // @ts-ignore + this.exec = () => null; + } + const terminators = this.regexes.map(el => el[1]); + this.matcherRe = langRe(_rewriteBackreferences(terminators, { joinWith: '|' }), true); + this.lastIndex = 0; + } + + /** @param {string} s */ + exec(s) { + this.matcherRe.lastIndex = this.lastIndex; + const match = this.matcherRe.exec(s); + if (!match) { return null; } + + // eslint-disable-next-line no-undefined + const i = match.findIndex((el, i) => i > 0 && el !== undefined); + // @ts-ignore + const matchData = this.matchIndexes[i]; + // trim off any earlier non-relevant match groups (ie, the other regex + // match groups that make up the multi-matcher) + match.splice(0, i); + + return Object.assign(match, matchData); + } + } + + /* + Created to solve the key deficiently with MultiRegex - there is no way to + test for multiple matches at a single location. Why would we need to do + that? In the future a more dynamic engine will allow certain matches to be + ignored. An example: if we matched say the 3rd regex in a large group but + decided to ignore it - we'd need to started testing again at the 4th + regex... but MultiRegex itself gives us no real way to do that. + + So what this class creates MultiRegexs on the fly for whatever search + position they are needed. + + NOTE: These additional MultiRegex objects are created dynamically. For most + grammars most of the time we will never actually need anything more than the + first MultiRegex - so this shouldn't have too much overhead. + + Say this is our search group, and we match regex3, but wish to ignore it. + + regex1 | regex2 | regex3 | regex4 | regex5 ' ie, startAt = 0 + + What we need is a new MultiRegex that only includes the remaining + possibilities: + + regex4 | regex5 ' ie, startAt = 3 + + This class wraps all that complexity up in a simple API... `startAt` decides + where in the array of expressions to start doing the matching. It + auto-increments, so if a match is found at position 2, then startAt will be + set to 3. If the end is reached startAt will return to 0. + + MOST of the time the parser will be setting startAt manually to 0. + */ + class ResumableMultiRegex { + constructor() { + // @ts-ignore + this.rules = []; + // @ts-ignore + this.multiRegexes = []; + this.count = 0; + + this.lastIndex = 0; + this.regexIndex = 0; + } + + // @ts-ignore + getMatcher(index) { + if (this.multiRegexes[index]) return this.multiRegexes[index]; + + const matcher = new MultiRegex(); + this.rules.slice(index).forEach(([re, opts]) => matcher.addRule(re, opts)); + matcher.compile(); + this.multiRegexes[index] = matcher; + return matcher; + } + + resumingScanAtSamePosition() { + return this.regexIndex !== 0; + } + + considerAll() { + this.regexIndex = 0; + } + + // @ts-ignore + addRule(re, opts) { + this.rules.push([re, opts]); + if (opts.type === "begin") this.count++; + } + + /** @param {string} s */ + exec(s) { + const m = this.getMatcher(this.regexIndex); + m.lastIndex = this.lastIndex; + let result = m.exec(s); + + // The following is because we have no easy way to say "resume scanning at the + // existing position but also skip the current rule ONLY". What happens is + // all prior rules are also skipped which can result in matching the wrong + // thing. Example of matching "booger": + + // our matcher is [string, "booger", number] + // + // ....booger.... + + // if "booger" is ignored then we'd really need a regex to scan from the + // SAME position for only: [string, number] but ignoring "booger" (if it + // was the first match), a simple resume would scan ahead who knows how + // far looking only for "number", ignoring potential string matches (or + // future "booger" matches that might be valid.) + + // So what we do: We execute two matchers, one resuming at the same + // position, but the second full matcher starting at the position after: + + // /--- resume first regex match here (for [number]) + // |/---- full match here for [string, "booger", number] + // vv + // ....booger.... + + // Which ever results in a match first is then used. So this 3-4 step + // process essentially allows us to say "match at this position, excluding + // a prior rule that was ignored". + // + // 1. Match "booger" first, ignore. Also proves that [string] does non match. + // 2. Resume matching for [number] + // 3. Match at index + 1 for [string, "booger", number] + // 4. If #2 and #3 result in matches, which came first? + if (this.resumingScanAtSamePosition()) { + if (result && result.index === this.lastIndex) ; else { // use the second matcher result + const m2 = this.getMatcher(0); + m2.lastIndex = this.lastIndex + 1; + result = m2.exec(s); + } + } + + if (result) { + this.regexIndex += result.position + 1; + if (this.regexIndex === this.count) { + // wrap-around to considering all matches again + this.considerAll(); + } + } + + return result; + } + } + + /** + * Given a mode, builds a huge ResumableMultiRegex that can be used to walk + * the content and find matches. + * + * @param {CompiledMode} mode + * @returns {ResumableMultiRegex} + */ + function buildModeRegex(mode) { + const mm = new ResumableMultiRegex(); + + mode.contains.forEach(term => mm.addRule(term.begin, { rule: term, type: "begin" })); + + if (mode.terminatorEnd) { + mm.addRule(mode.terminatorEnd, { type: "end" }); + } + if (mode.illegal) { + mm.addRule(mode.illegal, { type: "illegal" }); + } + + return mm; + } + + /** skip vs abort vs ignore + * + * @skip - The mode is still entered and exited normally (and contains rules apply), + * but all content is held and added to the parent buffer rather than being + * output when the mode ends. Mostly used with `sublanguage` to build up + * a single large buffer than can be parsed by sublanguage. + * + * - The mode begin ands ends normally. + * - Content matched is added to the parent mode buffer. + * - The parser cursor is moved forward normally. + * + * @abort - A hack placeholder until we have ignore. Aborts the mode (as if it + * never matched) but DOES NOT continue to match subsequent `contains` + * modes. Abort is bad/suboptimal because it can result in modes + * farther down not getting applied because an earlier rule eats the + * content but then aborts. + * + * - The mode does not begin. + * - Content matched by `begin` is added to the mode buffer. + * - The parser cursor is moved forward accordingly. + * + * @ignore - Ignores the mode (as if it never matched) and continues to match any + * subsequent `contains` modes. Ignore isn't technically possible with + * the current parser implementation. + * + * - The mode does not begin. + * - Content matched by `begin` is ignored. + * - The parser cursor is not moved forward. + */ + + /** + * Compiles an individual mode + * + * This can raise an error if the mode contains certain detectable known logic + * issues. + * @param {Mode} mode + * @param {CompiledMode | null} [parent] + * @returns {CompiledMode | never} + */ + function compileMode(mode, parent) { + const cmode = /** @type CompiledMode */ (mode); + if (mode.isCompiled) return cmode; + + [ + scopeClassName, + // do this early so compiler extensions generally don't have to worry about + // the distinction between match/begin + compileMatch, + MultiClass, + beforeMatchExt + ].forEach(ext => ext(mode, parent)); + + language.compilerExtensions.forEach(ext => ext(mode, parent)); + + // __beforeBegin is considered private API, internal use only + mode.__beforeBegin = null; + + [ + beginKeywords, + // do this later so compiler extensions that come earlier have access to the + // raw array if they wanted to perhaps manipulate it, etc. + compileIllegal, + // default to 1 relevance if not specified + compileRelevance + ].forEach(ext => ext(mode, parent)); + + mode.isCompiled = true; + + let keywordPattern = null; + if (typeof mode.keywords === "object" && mode.keywords.$pattern) { + // we need a copy because keywords might be compiled multiple times + // so we can't go deleting $pattern from the original on the first + // pass + mode.keywords = Object.assign({}, mode.keywords); + keywordPattern = mode.keywords.$pattern; + delete mode.keywords.$pattern; + } + keywordPattern = keywordPattern || /\w+/; + + if (mode.keywords) { + mode.keywords = compileKeywords(mode.keywords, language.case_insensitive); + } + + cmode.keywordPatternRe = langRe(keywordPattern, true); + + if (parent) { + if (!mode.begin) mode.begin = /\B|\b/; + cmode.beginRe = langRe(cmode.begin); + if (!mode.end && !mode.endsWithParent) mode.end = /\B|\b/; + if (mode.end) cmode.endRe = langRe(cmode.end); + cmode.terminatorEnd = source(cmode.end) || ''; + if (mode.endsWithParent && parent.terminatorEnd) { + cmode.terminatorEnd += (mode.end ? '|' : '') + parent.terminatorEnd; + } + } + if (mode.illegal) cmode.illegalRe = langRe(/** @type {RegExp | string} */ (mode.illegal)); + if (!mode.contains) mode.contains = []; + + mode.contains = [].concat(...mode.contains.map(function(c) { + return expandOrCloneMode(c === 'self' ? mode : c); + })); + mode.contains.forEach(function(c) { compileMode(/** @type Mode */ (c), cmode); }); + + if (mode.starts) { + compileMode(mode.starts, parent); + } + + cmode.matcher = buildModeRegex(cmode); + return cmode; + } + + if (!language.compilerExtensions) language.compilerExtensions = []; + + // self is not valid at the top-level + if (language.contains && language.contains.includes('self')) { + throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation."); + } + + // we need a null object, which inherit will guarantee + language.classNameAliases = inherit$1(language.classNameAliases || {}); + + return compileMode(/** @type Mode */ (language)); +} + +/** + * Determines if a mode has a dependency on it's parent or not + * + * If a mode does have a parent dependency then often we need to clone it if + * it's used in multiple places so that each copy points to the correct parent, + * where-as modes without a parent can often safely be re-used at the bottom of + * a mode chain. + * + * @param {Mode | null} mode + * @returns {boolean} - is there a dependency on the parent? + * */ +function dependencyOnParent(mode) { + if (!mode) return false; + + return mode.endsWithParent || dependencyOnParent(mode.starts); +} + +/** + * Expands a mode or clones it if necessary + * + * This is necessary for modes with parental dependenceis (see notes on + * `dependencyOnParent`) and for nodes that have `variants` - which must then be + * exploded into their own individual modes at compile time. + * + * @param {Mode} mode + * @returns {Mode | Mode[]} + * */ +function expandOrCloneMode(mode) { + if (mode.variants && !mode.cachedVariants) { + mode.cachedVariants = mode.variants.map(function(variant) { + return inherit$1(mode, { variants: null }, variant); + }); + } + + // EXPAND + // if we have variants then essentially "replace" the mode with the variants + // this happens in compileMode, where this function is called from + if (mode.cachedVariants) { + return mode.cachedVariants; + } + + // CLONE + // if we have dependencies on parents then we need a unique + // instance of ourselves, so we can be reused with many + // different parents without issue + if (dependencyOnParent(mode)) { + return inherit$1(mode, { starts: mode.starts ? inherit$1(mode.starts) : null }); + } + + if (Object.isFrozen(mode)) { + return inherit$1(mode); + } + + // no special dependency issues, just return ourselves + return mode; +} + +var version = "11.11.1"; + +class HTMLInjectionError extends Error { + constructor(reason, html) { + super(reason); + this.name = "HTMLInjectionError"; + this.html = html; + } +} + +/* +Syntax highlighting with language autodetection. +https://highlightjs.org/ +*/ + + + +/** +@typedef {import('highlight.js').Mode} Mode +@typedef {import('highlight.js').CompiledMode} CompiledMode +@typedef {import('highlight.js').CompiledScope} CompiledScope +@typedef {import('highlight.js').Language} Language +@typedef {import('highlight.js').HLJSApi} HLJSApi +@typedef {import('highlight.js').HLJSPlugin} HLJSPlugin +@typedef {import('highlight.js').PluginEvent} PluginEvent +@typedef {import('highlight.js').HLJSOptions} HLJSOptions +@typedef {import('highlight.js').LanguageFn} LanguageFn +@typedef {import('highlight.js').HighlightedHTMLElement} HighlightedHTMLElement +@typedef {import('highlight.js').BeforeHighlightContext} BeforeHighlightContext +@typedef {import('highlight.js/private').MatchType} MatchType +@typedef {import('highlight.js/private').KeywordData} KeywordData +@typedef {import('highlight.js/private').EnhancedMatch} EnhancedMatch +@typedef {import('highlight.js/private').AnnotatedError} AnnotatedError +@typedef {import('highlight.js').AutoHighlightResult} AutoHighlightResult +@typedef {import('highlight.js').HighlightOptions} HighlightOptions +@typedef {import('highlight.js').HighlightResult} HighlightResult +*/ + + +const escape = escapeHTML; +const inherit = inherit$1; +const NO_MATCH = Symbol("nomatch"); +const MAX_KEYWORD_HITS = 7; + +/** + * @param {any} hljs - object that is extended (legacy) + * @returns {HLJSApi} + */ +const HLJS = function(hljs) { + // Global internal variables used within the highlight.js library. + /** @type {Record} */ + const languages = Object.create(null); + /** @type {Record} */ + const aliases = Object.create(null); + /** @type {HLJSPlugin[]} */ + const plugins = []; + + // safe/production mode - swallows more errors, tries to keep running + // even if a single syntax or parse hits a fatal error + let SAFE_MODE = true; + const LANGUAGE_NOT_FOUND = "Could not find the language '{}', did you forget to load/include a language module?"; + /** @type {Language} */ + const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: 'Plain text', contains: [] }; + + // Global options used when within external APIs. This is modified when + // calling the `hljs.configure` function. + /** @type HLJSOptions */ + let options = { + ignoreUnescapedHTML: false, + throwUnescapedHTML: false, + noHighlightRe: /^(no-?highlight)$/i, + languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i, + classPrefix: 'hljs-', + cssSelector: 'pre code', + languages: null, + // beta configuration options, subject to change, welcome to discuss + // https://github.com/highlightjs/highlight.js/issues/1086 + __emitter: TokenTreeEmitter + }; + + /* Utility functions */ + + /** + * Tests a language name to see if highlighting should be skipped + * @param {string} languageName + */ + function shouldNotHighlight(languageName) { + return options.noHighlightRe.test(languageName); + } + + /** + * @param {HighlightedHTMLElement} block - the HTML element to determine language for + */ + function blockLanguage(block) { + let classes = block.className + ' '; + + classes += block.parentNode ? block.parentNode.className : ''; + + // language-* takes precedence over non-prefixed class names. + const match = options.languageDetectRe.exec(classes); + if (match) { + const language = getLanguage(match[1]); + if (!language) { + warn(LANGUAGE_NOT_FOUND.replace("{}", match[1])); + warn("Falling back to no-highlight mode for this block.", block); + } + return language ? match[1] : 'no-highlight'; + } + + return classes + .split(/\s+/) + .find((_class) => shouldNotHighlight(_class) || getLanguage(_class)); + } + + /** + * Core highlighting function. + * + * OLD API + * highlight(lang, code, ignoreIllegals, continuation) + * + * NEW API + * highlight(code, {lang, ignoreIllegals}) + * + * @param {string} codeOrLanguageName - the language to use for highlighting + * @param {string | HighlightOptions} optionsOrCode - the code to highlight + * @param {boolean} [ignoreIllegals] - whether to ignore illegal matches, default is to bail + * + * @returns {HighlightResult} Result - an object that represents the result + * @property {string} language - the language name + * @property {number} relevance - the relevance score + * @property {string} value - the highlighted HTML code + * @property {string} code - the original raw code + * @property {CompiledMode} top - top of the current mode stack + * @property {boolean} illegal - indicates whether any illegal matches were found + */ + function highlight(codeOrLanguageName, optionsOrCode, ignoreIllegals) { + let code = ""; + let languageName = ""; + if (typeof optionsOrCode === "object") { + code = codeOrLanguageName; + ignoreIllegals = optionsOrCode.ignoreIllegals; + languageName = optionsOrCode.language; + } else { + // old API + deprecated("10.7.0", "highlight(lang, code, ...args) has been deprecated."); + deprecated("10.7.0", "Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"); + languageName = codeOrLanguageName; + code = optionsOrCode; + } + + // https://github.com/highlightjs/highlight.js/issues/3149 + // eslint-disable-next-line no-undefined + if (ignoreIllegals === undefined) { ignoreIllegals = true; } + + /** @type {BeforeHighlightContext} */ + const context = { + code, + language: languageName + }; + // the plugin can change the desired language or the code to be highlighted + // just be changing the object it was passed + fire("before:highlight", context); + + // a before plugin can usurp the result completely by providing it's own + // in which case we don't even need to call highlight + const result = context.result + ? context.result + : _highlight(context.language, context.code, ignoreIllegals); + + result.code = context.code; + // the plugin can change anything in result to suite it + fire("after:highlight", result); + + return result; + } + + /** + * private highlight that's used internally and does not fire callbacks + * + * @param {string} languageName - the language to use for highlighting + * @param {string} codeToHighlight - the code to highlight + * @param {boolean?} [ignoreIllegals] - whether to ignore illegal matches, default is to bail + * @param {CompiledMode?} [continuation] - current continuation mode, if any + * @returns {HighlightResult} - result of the highlight operation + */ + function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) { + const keywordHits = Object.create(null); + + /** + * Return keyword data if a match is a keyword + * @param {CompiledMode} mode - current mode + * @param {string} matchText - the textual match + * @returns {KeywordData | false} + */ + function keywordData(mode, matchText) { + return mode.keywords[matchText]; + } + + function processKeywords() { + if (!top.keywords) { + emitter.addText(modeBuffer); + return; + } + + let lastIndex = 0; + top.keywordPatternRe.lastIndex = 0; + let match = top.keywordPatternRe.exec(modeBuffer); + let buf = ""; + + while (match) { + buf += modeBuffer.substring(lastIndex, match.index); + const word = language.case_insensitive ? match[0].toLowerCase() : match[0]; + const data = keywordData(top, word); + if (data) { + const [kind, keywordRelevance] = data; + emitter.addText(buf); + buf = ""; + + keywordHits[word] = (keywordHits[word] || 0) + 1; + if (keywordHits[word] <= MAX_KEYWORD_HITS) relevance += keywordRelevance; + if (kind.startsWith("_")) { + // _ implied for relevance only, do not highlight + // by applying a class name + buf += match[0]; + } else { + const cssClass = language.classNameAliases[kind] || kind; + emitKeyword(match[0], cssClass); + } + } else { + buf += match[0]; + } + lastIndex = top.keywordPatternRe.lastIndex; + match = top.keywordPatternRe.exec(modeBuffer); + } + buf += modeBuffer.substring(lastIndex); + emitter.addText(buf); + } + + function processSubLanguage() { + if (modeBuffer === "") return; + /** @type HighlightResult */ + let result = null; + + if (typeof top.subLanguage === 'string') { + if (!languages[top.subLanguage]) { + emitter.addText(modeBuffer); + return; + } + result = _highlight(top.subLanguage, modeBuffer, true, continuations[top.subLanguage]); + continuations[top.subLanguage] = /** @type {CompiledMode} */ (result._top); + } else { + result = highlightAuto(modeBuffer, top.subLanguage.length ? top.subLanguage : null); + } + + // Counting embedded language score towards the host language may be disabled + // with zeroing the containing mode relevance. Use case in point is Markdown that + // allows XML everywhere and makes every XML snippet to have a much larger Markdown + // score. + if (top.relevance > 0) { + relevance += result.relevance; + } + emitter.__addSublanguage(result._emitter, result.language); + } + + function processBuffer() { + if (top.subLanguage != null) { + processSubLanguage(); + } else { + processKeywords(); + } + modeBuffer = ''; + } + + /** + * @param {string} text + * @param {string} scope + */ + function emitKeyword(keyword, scope) { + if (keyword === "") return; + + emitter.startScope(scope); + emitter.addText(keyword); + emitter.endScope(); + } + + /** + * @param {CompiledScope} scope + * @param {RegExpMatchArray} match + */ + function emitMultiClass(scope, match) { + let i = 1; + const max = match.length - 1; + while (i <= max) { + if (!scope._emit[i]) { i++; continue; } + const klass = language.classNameAliases[scope[i]] || scope[i]; + const text = match[i]; + if (klass) { + emitKeyword(text, klass); + } else { + modeBuffer = text; + processKeywords(); + modeBuffer = ""; + } + i++; + } + } + + /** + * @param {CompiledMode} mode - new mode to start + * @param {RegExpMatchArray} match + */ + function startNewMode(mode, match) { + if (mode.scope && typeof mode.scope === "string") { + emitter.openNode(language.classNameAliases[mode.scope] || mode.scope); + } + if (mode.beginScope) { + // beginScope just wraps the begin match itself in a scope + if (mode.beginScope._wrap) { + emitKeyword(modeBuffer, language.classNameAliases[mode.beginScope._wrap] || mode.beginScope._wrap); + modeBuffer = ""; + } else if (mode.beginScope._multi) { + // at this point modeBuffer should just be the match + emitMultiClass(mode.beginScope, match); + modeBuffer = ""; + } + } + + top = Object.create(mode, { parent: { value: top } }); + return top; + } + + /** + * @param {CompiledMode } mode - the mode to potentially end + * @param {RegExpMatchArray} match - the latest match + * @param {string} matchPlusRemainder - match plus remainder of content + * @returns {CompiledMode | void} - the next mode, or if void continue on in current mode + */ + function endOfMode(mode, match, matchPlusRemainder) { + let matched = startsWith(mode.endRe, matchPlusRemainder); + + if (matched) { + if (mode["on:end"]) { + const resp = new Response(mode); + mode["on:end"](match, resp); + if (resp.isMatchIgnored) matched = false; + } + + if (matched) { + while (mode.endsParent && mode.parent) { + mode = mode.parent; + } + return mode; + } + } + // even if on:end fires an `ignore` it's still possible + // that we might trigger the end node because of a parent mode + if (mode.endsWithParent) { + return endOfMode(mode.parent, match, matchPlusRemainder); + } + } + + /** + * Handle matching but then ignoring a sequence of text + * + * @param {string} lexeme - string containing full match text + */ + function doIgnore(lexeme) { + if (top.matcher.regexIndex === 0) { + // no more regexes to potentially match here, so we move the cursor forward one + // space + modeBuffer += lexeme[0]; + return 1; + } else { + // no need to move the cursor, we still have additional regexes to try and + // match at this very spot + resumeScanAtSamePosition = true; + return 0; + } + } + + /** + * Handle the start of a new potential mode match + * + * @param {EnhancedMatch} match - the current match + * @returns {number} how far to advance the parse cursor + */ + function doBeginMatch(match) { + const lexeme = match[0]; + const newMode = match.rule; + + const resp = new Response(newMode); + // first internal before callbacks, then the public ones + const beforeCallbacks = [newMode.__beforeBegin, newMode["on:begin"]]; + for (const cb of beforeCallbacks) { + if (!cb) continue; + cb(match, resp); + if (resp.isMatchIgnored) return doIgnore(lexeme); + } + + if (newMode.skip) { + modeBuffer += lexeme; + } else { + if (newMode.excludeBegin) { + modeBuffer += lexeme; + } + processBuffer(); + if (!newMode.returnBegin && !newMode.excludeBegin) { + modeBuffer = lexeme; + } + } + startNewMode(newMode, match); + return newMode.returnBegin ? 0 : lexeme.length; + } + + /** + * Handle the potential end of mode + * + * @param {RegExpMatchArray} match - the current match + */ + function doEndMatch(match) { + const lexeme = match[0]; + const matchPlusRemainder = codeToHighlight.substring(match.index); + + const endMode = endOfMode(top, match, matchPlusRemainder); + if (!endMode) { return NO_MATCH; } + + const origin = top; + if (top.endScope && top.endScope._wrap) { + processBuffer(); + emitKeyword(lexeme, top.endScope._wrap); + } else if (top.endScope && top.endScope._multi) { + processBuffer(); + emitMultiClass(top.endScope, match); + } else if (origin.skip) { + modeBuffer += lexeme; + } else { + if (!(origin.returnEnd || origin.excludeEnd)) { + modeBuffer += lexeme; + } + processBuffer(); + if (origin.excludeEnd) { + modeBuffer = lexeme; + } + } + do { + if (top.scope) { + emitter.closeNode(); + } + if (!top.skip && !top.subLanguage) { + relevance += top.relevance; + } + top = top.parent; + } while (top !== endMode.parent); + if (endMode.starts) { + startNewMode(endMode.starts, match); + } + return origin.returnEnd ? 0 : lexeme.length; + } + + function processContinuations() { + const list = []; + for (let current = top; current !== language; current = current.parent) { + if (current.scope) { + list.unshift(current.scope); + } + } + list.forEach(item => emitter.openNode(item)); + } + + /** @type {{type?: MatchType, index?: number, rule?: Mode}}} */ + let lastMatch = {}; + + /** + * Process an individual match + * + * @param {string} textBeforeMatch - text preceding the match (since the last match) + * @param {EnhancedMatch} [match] - the match itself + */ + function processLexeme(textBeforeMatch, match) { + const lexeme = match && match[0]; + + // add non-matched text to the current mode buffer + modeBuffer += textBeforeMatch; + + if (lexeme == null) { + processBuffer(); + return 0; + } + + // we've found a 0 width match and we're stuck, so we need to advance + // this happens when we have badly behaved rules that have optional matchers to the degree that + // sometimes they can end up matching nothing at all + // Ref: https://github.com/highlightjs/highlight.js/issues/2140 + if (lastMatch.type === "begin" && match.type === "end" && lastMatch.index === match.index && lexeme === "") { + // spit the "skipped" character that our regex choked on back into the output sequence + modeBuffer += codeToHighlight.slice(match.index, match.index + 1); + if (!SAFE_MODE) { + /** @type {AnnotatedError} */ + const err = new Error(`0 width match regex (${languageName})`); + err.languageName = languageName; + err.badRule = lastMatch.rule; + throw err; + } + return 1; + } + lastMatch = match; + + if (match.type === "begin") { + return doBeginMatch(match); + } else if (match.type === "illegal" && !ignoreIllegals) { + // illegal match, we do not continue processing + /** @type {AnnotatedError} */ + const err = new Error('Illegal lexeme "' + lexeme + '" for mode "' + (top.scope || '') + '"'); + err.mode = top; + throw err; + } else if (match.type === "end") { + const processed = doEndMatch(match); + if (processed !== NO_MATCH) { + return processed; + } + } + + // edge case for when illegal matches $ (end of line) which is technically + // a 0 width match but not a begin/end match so it's not caught by the + // first handler (when ignoreIllegals is true) + if (match.type === "illegal" && lexeme === "") { + // advance so we aren't stuck in an infinite loop + modeBuffer += "\n"; + return 1; + } + + // infinite loops are BAD, this is a last ditch catch all. if we have a + // decent number of iterations yet our index (cursor position in our + // parsing) still 3x behind our index then something is very wrong + // so we bail + if (iterations > 100000 && iterations > match.index * 3) { + const err = new Error('potential infinite loop, way more iterations than matches'); + throw err; + } + + /* + Why might be find ourselves here? An potential end match that was + triggered but could not be completed. IE, `doEndMatch` returned NO_MATCH. + (this could be because a callback requests the match be ignored, etc) + + This causes no real harm other than stopping a few times too many. + */ + + modeBuffer += lexeme; + return lexeme.length; + } + + const language = getLanguage(languageName); + if (!language) { + error(LANGUAGE_NOT_FOUND.replace("{}", languageName)); + throw new Error('Unknown language: "' + languageName + '"'); + } + + const md = compileLanguage(language); + let result = ''; + /** @type {CompiledMode} */ + let top = continuation || md; + /** @type Record */ + const continuations = {}; // keep continuations for sub-languages + const emitter = new options.__emitter(options); + processContinuations(); + let modeBuffer = ''; + let relevance = 0; + let index = 0; + let iterations = 0; + let resumeScanAtSamePosition = false; + + try { + if (!language.__emitTokens) { + top.matcher.considerAll(); + + for (;;) { + iterations++; + if (resumeScanAtSamePosition) { + // only regexes not matched previously will now be + // considered for a potential match + resumeScanAtSamePosition = false; + } else { + top.matcher.considerAll(); + } + top.matcher.lastIndex = index; + + const match = top.matcher.exec(codeToHighlight); + // console.log("match", match[0], match.rule && match.rule.begin) + + if (!match) break; + + const beforeMatch = codeToHighlight.substring(index, match.index); + const processedCount = processLexeme(beforeMatch, match); + index = match.index + processedCount; + } + processLexeme(codeToHighlight.substring(index)); + } else { + language.__emitTokens(codeToHighlight, emitter); + } + + emitter.finalize(); + result = emitter.toHTML(); + + return { + language: languageName, + value: result, + relevance, + illegal: false, + _emitter: emitter, + _top: top + }; + } catch (err) { + if (err.message && err.message.includes('Illegal')) { + return { + language: languageName, + value: escape(codeToHighlight), + illegal: true, + relevance: 0, + _illegalBy: { + message: err.message, + index, + context: codeToHighlight.slice(index - 100, index + 100), + mode: err.mode, + resultSoFar: result + }, + _emitter: emitter + }; + } else if (SAFE_MODE) { + return { + language: languageName, + value: escape(codeToHighlight), + illegal: false, + relevance: 0, + errorRaised: err, + _emitter: emitter, + _top: top + }; + } else { + throw err; + } + } + } + + /** + * returns a valid highlight result, without actually doing any actual work, + * auto highlight starts with this and it's possible for small snippets that + * auto-detection may not find a better match + * @param {string} code + * @returns {HighlightResult} + */ + function justTextHighlightResult(code) { + const result = { + value: escape(code), + illegal: false, + relevance: 0, + _top: PLAINTEXT_LANGUAGE, + _emitter: new options.__emitter(options) + }; + result._emitter.addText(code); + return result; + } + + /** + Highlighting with language detection. Accepts a string with the code to + highlight. Returns an object with the following properties: + + - language (detected language) + - relevance (int) + - value (an HTML string with highlighting markup) + - secondBest (object with the same structure for second-best heuristically + detected language, may be absent) + + @param {string} code + @param {Array} [languageSubset] + @returns {AutoHighlightResult} + */ + function highlightAuto(code, languageSubset) { + languageSubset = languageSubset || options.languages || Object.keys(languages); + const plaintext = justTextHighlightResult(code); + + const results = languageSubset.filter(getLanguage).filter(autoDetection).map(name => + _highlight(name, code, false) + ); + results.unshift(plaintext); // plaintext is always an option + + const sorted = results.sort((a, b) => { + // sort base on relevance + if (a.relevance !== b.relevance) return b.relevance - a.relevance; + + // always award the tie to the base language + // ie if C++ and Arduino are tied, it's more likely to be C++ + if (a.language && b.language) { + if (getLanguage(a.language).supersetOf === b.language) { + return 1; + } else if (getLanguage(b.language).supersetOf === a.language) { + return -1; + } + } + + // otherwise say they are equal, which has the effect of sorting on + // relevance while preserving the original ordering - which is how ties + // have historically been settled, ie the language that comes first always + // wins in the case of a tie + return 0; + }); + + const [best, secondBest] = sorted; + + /** @type {AutoHighlightResult} */ + const result = best; + result.secondBest = secondBest; + + return result; + } + + /** + * Builds new class name for block given the language name + * + * @param {HTMLElement} element + * @param {string} [currentLang] + * @param {string} [resultLang] + */ + function updateClassName(element, currentLang, resultLang) { + const language = (currentLang && aliases[currentLang]) || resultLang; + + element.classList.add("hljs"); + element.classList.add(`language-${language}`); + } + + /** + * Applies highlighting to a DOM node containing code. + * + * @param {HighlightedHTMLElement} element - the HTML element to highlight + */ + function highlightElement(element) { + /** @type HTMLElement */ + let node = null; + const language = blockLanguage(element); + + if (shouldNotHighlight(language)) return; + + fire("before:highlightElement", + { el: element, language }); + + if (element.dataset.highlighted) { + console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.", element); + return; + } + + // we should be all text, no child nodes (unescaped HTML) - this is possibly + // an HTML injection attack - it's likely too late if this is already in + // production (the code has likely already done its damage by the time + // we're seeing it)... but we yell loudly about this so that hopefully it's + // more likely to be caught in development before making it to production + if (element.children.length > 0) { + if (!options.ignoreUnescapedHTML) { + console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."); + console.warn("https://github.com/highlightjs/highlight.js/wiki/security"); + console.warn("The element with unescaped HTML:"); + console.warn(element); + } + if (options.throwUnescapedHTML) { + const err = new HTMLInjectionError( + "One of your code blocks includes unescaped HTML.", + element.innerHTML + ); + throw err; + } + } + + node = element; + const text = node.textContent; + const result = language ? highlight(text, { language, ignoreIllegals: true }) : highlightAuto(text); + + element.innerHTML = result.value; + element.dataset.highlighted = "yes"; + updateClassName(element, language, result.language); + element.result = { + language: result.language, + // TODO: remove with version 11.0 + re: result.relevance, + relevance: result.relevance + }; + if (result.secondBest) { + element.secondBest = { + language: result.secondBest.language, + relevance: result.secondBest.relevance + }; + } + + fire("after:highlightElement", { el: element, result, text }); + } + + /** + * Updates highlight.js global options with the passed options + * + * @param {Partial} userOptions + */ + function configure(userOptions) { + options = inherit(options, userOptions); + } + + // TODO: remove v12, deprecated + const initHighlighting = () => { + highlightAll(); + deprecated("10.6.0", "initHighlighting() deprecated. Use highlightAll() now."); + }; + + // TODO: remove v12, deprecated + function initHighlightingOnLoad() { + highlightAll(); + deprecated("10.6.0", "initHighlightingOnLoad() deprecated. Use highlightAll() now."); + } + + let wantsHighlight = false; + + /** + * auto-highlights all pre>code elements on the page + */ + function highlightAll() { + function boot() { + // if a highlight was requested before DOM was loaded, do now + highlightAll(); + } + + // if we are called too early in the loading process + if (document.readyState === "loading") { + // make sure the event listener is only added once + if (!wantsHighlight) { + window.addEventListener('DOMContentLoaded', boot, false); + } + wantsHighlight = true; + return; + } + + const blocks = document.querySelectorAll(options.cssSelector); + blocks.forEach(highlightElement); + } + + /** + * Register a language grammar module + * + * @param {string} languageName + * @param {LanguageFn} languageDefinition + */ + function registerLanguage(languageName, languageDefinition) { + let lang = null; + try { + lang = languageDefinition(hljs); + } catch (error$1) { + error("Language definition for '{}' could not be registered.".replace("{}", languageName)); + // hard or soft error + if (!SAFE_MODE) { throw error$1; } else { error(error$1); } + // languages that have serious errors are replaced with essentially a + // "plaintext" stand-in so that the code blocks will still get normal + // css classes applied to them - and one bad language won't break the + // entire highlighter + lang = PLAINTEXT_LANGUAGE; + } + // give it a temporary name if it doesn't have one in the meta-data + if (!lang.name) lang.name = languageName; + languages[languageName] = lang; + lang.rawDefinition = languageDefinition.bind(null, hljs); + + if (lang.aliases) { + registerAliases(lang.aliases, { languageName }); + } + } + + /** + * Remove a language grammar module + * + * @param {string} languageName + */ + function unregisterLanguage(languageName) { + delete languages[languageName]; + for (const alias of Object.keys(aliases)) { + if (aliases[alias] === languageName) { + delete aliases[alias]; + } + } + } + + /** + * @returns {string[]} List of language internal names + */ + function listLanguages() { + return Object.keys(languages); + } + + /** + * @param {string} name - name of the language to retrieve + * @returns {Language | undefined} + */ + function getLanguage(name) { + name = (name || '').toLowerCase(); + return languages[name] || languages[aliases[name]]; + } + + /** + * + * @param {string|string[]} aliasList - single alias or list of aliases + * @param {{languageName: string}} opts + */ + function registerAliases(aliasList, { languageName }) { + if (typeof aliasList === 'string') { + aliasList = [aliasList]; + } + aliasList.forEach(alias => { aliases[alias.toLowerCase()] = languageName; }); + } + + /** + * Determines if a given language has auto-detection enabled + * @param {string} name - name of the language + */ + function autoDetection(name) { + const lang = getLanguage(name); + return lang && !lang.disableAutodetect; + } + + /** + * Upgrades the old highlightBlock plugins to the new + * highlightElement API + * @param {HLJSPlugin} plugin + */ + function upgradePluginAPI(plugin) { + // TODO: remove with v12 + if (plugin["before:highlightBlock"] && !plugin["before:highlightElement"]) { + plugin["before:highlightElement"] = (data) => { + plugin["before:highlightBlock"]( + Object.assign({ block: data.el }, data) + ); + }; + } + if (plugin["after:highlightBlock"] && !plugin["after:highlightElement"]) { + plugin["after:highlightElement"] = (data) => { + plugin["after:highlightBlock"]( + Object.assign({ block: data.el }, data) + ); + }; + } + } + + /** + * @param {HLJSPlugin} plugin + */ + function addPlugin(plugin) { + upgradePluginAPI(plugin); + plugins.push(plugin); + } + + /** + * @param {HLJSPlugin} plugin + */ + function removePlugin(plugin) { + const index = plugins.indexOf(plugin); + if (index !== -1) { + plugins.splice(index, 1); + } + } + + /** + * + * @param {PluginEvent} event + * @param {any} args + */ + function fire(event, args) { + const cb = event; + plugins.forEach(function(plugin) { + if (plugin[cb]) { + plugin[cb](args); + } + }); + } + + /** + * DEPRECATED + * @param {HighlightedHTMLElement} el + */ + function deprecateHighlightBlock(el) { + deprecated("10.7.0", "highlightBlock will be removed entirely in v12.0"); + deprecated("10.7.0", "Please use highlightElement now."); + + return highlightElement(el); + } + + /* Interface definition */ + Object.assign(hljs, { + highlight, + highlightAuto, + highlightAll, + highlightElement, + // TODO: Remove with v12 API + highlightBlock: deprecateHighlightBlock, + configure, + initHighlighting, + initHighlightingOnLoad, + registerLanguage, + unregisterLanguage, + listLanguages, + getLanguage, + registerAliases, + autoDetection, + inherit, + addPlugin, + removePlugin + }); + + hljs.debugMode = function() { SAFE_MODE = false; }; + hljs.safeMode = function() { SAFE_MODE = true; }; + hljs.versionString = version; + + hljs.regex = { + concat: concat, + lookahead: lookahead, + either: either, + optional: optional, + anyNumberOfTimes: anyNumberOfTimes + }; + + for (const key in MODES) { + // @ts-ignore + if (typeof MODES[key] === "object") { + // @ts-ignore + deepFreeze(MODES[key]); + } + } + + // merge all the modes/regexes into our main object + Object.assign(hljs, MODES); + + return hljs; +}; + +// Other names for the variable may break build script +const highlight = HLJS({}); + +// returns a new instance of the highlighter to be used for extensions +// check https://github.com/wooorm/lowlight/issues/47 +highlight.newInstance = () => HLJS({}); + +export { highlight as default }; diff --git a/backend/static/highlight(1)/es/highlight.min.js b/backend/static/highlight(1)/es/highlight.min.js new file mode 100644 index 0000000..a614e4d --- /dev/null +++ b/backend/static/highlight(1)/es/highlight.min.js @@ -0,0 +1,306 @@ +/*! + Highlight.js v11.11.1 (git: 08cb242e7d) + (c) 2006-2025 Josh Goebel and other contributors + License: BSD-3-Clause + */ +function e(t){return t instanceof Map?t.clear=t.delete=t.set=()=>{ +throw Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach((n=>{ +const i=t[n],s=typeof i;"object"!==s&&"function"!==s||Object.isFrozen(i)||e(i) +})),t}class t{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function n(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function i(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] +;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const s=e=>!!e.scope +;class r{constructor(e,t){ +this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ +this.buffer+=n(e)}openNode(e){if(!s(e))return;const t=((e,{prefix:t})=>{ +if(e.startsWith("language:"))return e.replace("language:","language-") +;if(e.includes(".")){const n=e.split(".") +;return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ") +}return`${t}${e}`})(e.scope,{prefix:this.classPrefix});this.span(t)} +closeNode(e){s(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}const o=(e={})=>{const t={children:[]} +;return Object.assign(t,e),t};class a{constructor(){ +this.rootNode=o(),this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const t=o({scope:e}) +;this.add(t),this.stack.push(t)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ +return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), +t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +a._collapse(e)})))}}class c extends a{constructor(e){super(),this.options=e} +addText(e){""!==e&&this.add(e)}startScope(e){this.openNode(e)}endScope(){ +this.closeNode()}__addSublanguage(e,t){const n=e.root +;t&&(n.scope="language:"+t),this.add(n)}toHTML(){ +return new r(this,this.options).value()}finalize(){ +return this.closeAllNodes(),!0}}function l(e){ +return e?"string"==typeof e?e:e.source:null}function g(e){return h("(?=",e,")")} +function u(e){return h("(?:",e,")*")}function d(e){return h("(?:",e,")?")} +function h(...e){return e.map((e=>l(e))).join("")}function f(...e){const t=(e=>{ +const t=e[e.length-1] +;return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{} +})(e);return"("+(t.capture?"":"?:")+e.map((e=>l(e))).join("|")+")"} +function p(e){return RegExp(e.toString()+"|").exec("").length-1} +const b=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ +;function m(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n +;let i=l(e),s="";for(;i.length>0;){const e=b.exec(i);if(!e){s+=i;break} +s+=i.substring(0,e.index), +i=i.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?s+="\\"+(Number(e[1])+t):(s+=e[0], +"("===e[0]&&n++)}return s})).map((e=>`(${e})`)).join(t)} +const E="[a-zA-Z]\\w*",x="[a-zA-Z_]\\w*",_="\\b\\d+(\\.\\d+)?",y="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",w="\\b(0b[01]+)",O={ +begin:"\\\\[\\s\\S]",relevance:0},k={scope:"string",begin:"'",end:"'", +illegal:"\\n",contains:[O]},v={scope:"string",begin:'"',end:'"',illegal:"\\n", +contains:[O]},N=(e,t,n={})=>{const s=i({scope:"comment",begin:e,end:t, +contains:[]},n);s.contains.push({scope:"doctag", +begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", +end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) +;const r=f("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) +;return s.contains.push({begin:h(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),s +},S=N("//","$"),M=N("/\\*","\\*/"),R=N("#","$");var A=Object.freeze({ +__proto__:null,APOS_STRING_MODE:k,BACKSLASH_ESCAPE:O,BINARY_NUMBER_MODE:{ +scope:"number",begin:w,relevance:0},BINARY_NUMBER_RE:w,COMMENT:N, +C_BLOCK_COMMENT_MODE:M,C_LINE_COMMENT_MODE:S,C_NUMBER_MODE:{scope:"number", +begin:y,relevance:0},C_NUMBER_RE:y,END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ +t.data._beginMatch!==e[1]&&t.ignoreMatch()}}),HASH_COMMENT_MODE:R,IDENT_RE:E, +MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:{begin:"\\.\\s*"+x,relevance:0}, +NUMBER_MODE:{scope:"number",begin:_,relevance:0},NUMBER_RE:_, +PHRASAL_WORDS_MODE:{ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},QUOTE_STRING_MODE:v,REGEXP_MODE:{scope:"regexp",begin:/\/(?=[^/\n]*\/)/, +end:/\/[gimuy]*/,contains:[O,{begin:/\[/,end:/\]/,relevance:0,contains:[O]}]}, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const t=/^#![ ]*\// +;return e.binary&&(e.begin=h(t,/.*\b/,e.binary,/\b.*/)),i({scope:"meta",begin:t, +end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)}, +TITLE_MODE:{scope:"title",begin:E,relevance:0},UNDERSCORE_IDENT_RE:x, +UNDERSCORE_TITLE_MODE:{scope:"title",begin:x,relevance:0}});function j(e,t){ +"."===e.input[e.index-1]&&t.ignoreMatch()}function I(e,t){ +void 0!==e.className&&(e.scope=e.className,delete e.className)}function T(e,t){ +t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=j,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function L(e,t){ +Array.isArray(e.illegal)&&(e.illegal=f(...e.illegal))}function B(e,t){ +if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function P(e,t){ +void 0===e.relevance&&(e.relevance=1)}const D=(e,t)=>{if(!e.beforeMatch)return +;if(e.starts)throw Error("beforeMatch cannot be used with starts") +;const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t] +})),e.keywords=n.keywords,e.begin=h(n.beforeMatch,g(n.begin)),e.starts={ +relevance:0,contains:[Object.assign(n,{endsParent:!0})] +},e.relevance=0,delete n.beforeMatch +},H=["of","and","for","in","not","or","if","then","parent","list","value"] +;function C(e,t,n="keyword"){const i=Object.create(null) +;return"string"==typeof e?s(n,e.split(" ")):Array.isArray(e)?s(n,e):Object.keys(e).forEach((n=>{ +Object.assign(i,C(e[n],t,n))})),i;function s(e,n){ +t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") +;i[n[0]]=[e,$(n[0],n[1])]}))}}function $(e,t){ +return t?Number(t):(e=>H.includes(e.toLowerCase()))(e)?0:1}const U={},z=e=>{ +console.error(e)},W=(e,...t)=>{console.log("WARN: "+e,...t)},X=(e,t)=>{ +U[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),U[`${e}/${t}`]=!0) +},G=Error();function K(e,t,{key:n}){let i=0;const s=e[n],r={},o={} +;for(let e=1;e<=t.length;e++)o[e+i]=s[e],r[e+i]=!0,i+=p(t[e-1]) +;e[n]=o,e[n]._emit=r,e[n]._multi=!0}function F(e){(e=>{ +e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, +delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ +_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope +}),(e=>{if(Array.isArray(e.begin)){ +if(e.skip||e.excludeBegin||e.returnBegin)throw z("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), +G +;if("object"!=typeof e.beginScope||null===e.beginScope)throw z("beginScope must be object"), +G;K(e,e.begin,{key:"beginScope"}),e.begin=m(e.begin,{joinWith:""})}})(e),(e=>{ +if(Array.isArray(e.end)){ +if(e.skip||e.excludeEnd||e.returnEnd)throw z("skip, excludeEnd, returnEnd not compatible with endScope: {}"), +G +;if("object"!=typeof e.endScope||null===e.endScope)throw z("endScope must be object"), +G;K(e,e.end,{key:"endScope"}),e.end=m(e.end,{joinWith:""})}})(e)}function Z(e){ +function t(t,n){ +return RegExp(l(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":"")) +}class n{constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,t){ +t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), +this.matchAt+=p(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=t(m(e,{joinWith:"|" +}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex +;const t=this.matcherRe.exec(e);if(!t)return null +;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] +;return t.splice(0,n),Object.assign(t,i)}}class s{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n +;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), +t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ +this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ +const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex +;let n=t.exec(e) +;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ +const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} +return n&&(this.regexIndex+=n.position+1, +this.regexIndex===this.count&&this.considerAll()),n}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=i(e.classNameAliases||{}),function n(r,o){const a=r +;if(r.isCompiled)return a +;[I,B,F,D].forEach((e=>e(r,o))),e.compilerExtensions.forEach((e=>e(r,o))), +r.__beforeBegin=null,[T,L,P].forEach((e=>e(r,o))),r.isCompiled=!0;let c=null +;return"object"==typeof r.keywords&&r.keywords.$pattern&&(r.keywords=Object.assign({},r.keywords), +c=r.keywords.$pattern, +delete r.keywords.$pattern),c=c||/\w+/,r.keywords&&(r.keywords=C(r.keywords,e.case_insensitive)), +a.keywordPatternRe=t(c,!0), +o&&(r.begin||(r.begin=/\B|\b/),a.beginRe=t(a.begin),r.end||r.endsWithParent||(r.end=/\B|\b/), +r.end&&(a.endRe=t(a.end)), +a.terminatorEnd=l(a.end)||"",r.endsWithParent&&o.terminatorEnd&&(a.terminatorEnd+=(r.end?"|":"")+o.terminatorEnd)), +r.illegal&&(a.illegalRe=t(r.illegal)), +r.contains||(r.contains=[]),r.contains=[].concat(...r.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>i(e,{ +variants:null},t)))),e.cachedVariants?e.cachedVariants:V(e)?i(e,{ +starts:e.starts?i(e.starts):null +}):Object.isFrozen(e)?i(e):e))("self"===e?r:e)))),r.contains.forEach((e=>{n(e,a) +})),r.starts&&n(r.starts,o),a.matcher=(e=>{const t=new s +;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(a),a}(e)}function V(e){ +return!!e&&(e.endsWithParent||V(e.starts))}class q extends Error{ +constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}} +const J=n,Y=i,Q=Symbol("nomatch"),ee=n=>{ +const i=Object.create(null),s=Object.create(null),r=[];let o=!0 +;const a="Could not find the language '{}', did you forget to load/include a language module?",l={ +disableAutodetect:!0,name:"Plain text",contains:[]};let p={ +ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +cssSelector:"pre code",languages:null,__emitter:c};function b(e){ +return p.noHighlightRe.test(e)}function m(e,t,n){let i="",s="" +;"object"==typeof t?(i=e, +n=t.ignoreIllegals,s=t.language):(X("10.7.0","highlight(lang, code, ...args) has been deprecated."), +X("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +s=e,i=t),void 0===n&&(n=!0);const r={code:i,language:s};N("before:highlight",r) +;const o=r.result?r.result:E(r.language,r.code,n) +;return o.code=r.code,N("after:highlight",o),o}function E(e,n,s,r){ +const c=Object.create(null);function l(){if(!N.keywords)return void M.addText(R) +;let e=0;N.keywordPatternRe.lastIndex=0;let t=N.keywordPatternRe.exec(R),n="" +;for(;t;){n+=R.substring(e,t.index) +;const s=w.case_insensitive?t[0].toLowerCase():t[0],r=(i=s,N.keywords[i]);if(r){ +const[e,i]=r +;if(M.addText(n),n="",c[s]=(c[s]||0)+1,c[s]<=7&&(A+=i),e.startsWith("_"))n+=t[0];else{ +const n=w.classNameAliases[e]||e;u(t[0],n)}}else n+=t[0] +;e=N.keywordPatternRe.lastIndex,t=N.keywordPatternRe.exec(R)}var i +;n+=R.substring(e),M.addText(n)}function g(){null!=N.subLanguage?(()=>{ +if(""===R)return;let e=null;if("string"==typeof N.subLanguage){ +if(!i[N.subLanguage])return void M.addText(R) +;e=E(N.subLanguage,R,!0,S[N.subLanguage]),S[N.subLanguage]=e._top +}else e=x(R,N.subLanguage.length?N.subLanguage:null) +;N.relevance>0&&(A+=e.relevance),M.__addSublanguage(e._emitter,e.language) +})():l(),R=""}function u(e,t){ +""!==e&&(M.startScope(t),M.addText(e),M.endScope())}function d(e,t){let n=1 +;const i=t.length-1;for(;n<=i;){if(!e._emit[n]){n++;continue} +const i=w.classNameAliases[e[n]]||e[n],s=t[n];i?u(s,i):(R=s,l(),R=""),n++}} +function h(e,t){ +return e.scope&&"string"==typeof e.scope&&M.openNode(w.classNameAliases[e.scope]||e.scope), +e.beginScope&&(e.beginScope._wrap?(u(R,w.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), +R=""):e.beginScope._multi&&(d(e.beginScope,t),R="")),N=Object.create(e,{parent:{ +value:N}}),N}function f(e,n,i){let s=((e,t)=>{const n=e&&e.exec(t) +;return n&&0===n.index})(e.endRe,i);if(s){if(e["on:end"]){const i=new t(e) +;e["on:end"](n,i),i.isMatchIgnored&&(s=!1)}if(s){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return f(e.parent,n,i)}function b(e){ +return 0===N.matcher.regexIndex?(R+=e[0],1):(T=!0,0)}function m(e){ +const t=e[0],i=n.substring(e.index),s=f(N,e,i);if(!s)return Q;const r=N +;N.endScope&&N.endScope._wrap?(g(), +u(t,N.endScope._wrap)):N.endScope&&N.endScope._multi?(g(), +d(N.endScope,e)):r.skip?R+=t:(r.returnEnd||r.excludeEnd||(R+=t), +g(),r.excludeEnd&&(R=t));do{ +N.scope&&M.closeNode(),N.skip||N.subLanguage||(A+=N.relevance),N=N.parent +}while(N!==s.parent);return s.starts&&h(s.starts,e),r.returnEnd?0:t.length} +let _={};function y(i,r){const a=r&&r[0];if(R+=i,null==a)return g(),0 +;if("begin"===_.type&&"end"===r.type&&_.index===r.index&&""===a){ +if(R+=n.slice(r.index,r.index+1),!o){const t=Error(`0 width match regex (${e})`) +;throw t.languageName=e,t.badRule=_.rule,t}return 1} +if(_=r,"begin"===r.type)return(e=>{ +const n=e[0],i=e.rule,s=new t(i),r=[i.__beforeBegin,i["on:begin"]] +;for(const t of r)if(t&&(t(e,s),s.isMatchIgnored))return b(n) +;return i.skip?R+=n:(i.excludeBegin&&(R+=n), +g(),i.returnBegin||i.excludeBegin||(R=n)),h(i,e),i.returnBegin?0:n.length})(r) +;if("illegal"===r.type&&!s){ +const e=Error('Illegal lexeme "'+a+'" for mode "'+(N.scope||"")+'"') +;throw e.mode=N,e}if("end"===r.type){const e=m(r);if(e!==Q)return e} +if("illegal"===r.type&&""===a)return R+="\n",1 +;if(I>1e5&&I>3*r.index)throw Error("potential infinite loop, way more iterations than matches") +;return R+=a,a.length}const w=O(e) +;if(!w)throw z(a.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const k=Z(w);let v="",N=r||k;const S={},M=new p.__emitter(p);(()=>{const e=[] +;for(let t=N;t!==w;t=t.parent)t.scope&&e.unshift(t.scope) +;e.forEach((e=>M.openNode(e)))})();let R="",A=0,j=0,I=0,T=!1;try{ +if(w.__emitTokens)w.__emitTokens(n,M);else{for(N.matcher.considerAll();;){ +I++,T?T=!1:N.matcher.considerAll(),N.matcher.lastIndex=j +;const e=N.matcher.exec(n);if(!e)break;const t=y(n.substring(j,e.index),e) +;j=e.index+t}y(n.substring(j))}return M.finalize(),v=M.toHTML(),{language:e, +value:v,relevance:A,illegal:!1,_emitter:M,_top:N}}catch(t){ +if(t.message&&t.message.includes("Illegal"))return{language:e,value:J(n), +illegal:!0,relevance:0,_illegalBy:{message:t.message,index:j, +context:n.slice(j-100,j+100),mode:t.mode,resultSoFar:v},_emitter:M};if(o)return{ +language:e,value:J(n),illegal:!1,relevance:0,errorRaised:t,_emitter:M,_top:N} +;throw t}}function x(e,t){t=t||p.languages||Object.keys(i);const n=(e=>{ +const t={value:J(e),illegal:!1,relevance:0,_top:l,_emitter:new p.__emitter(p)} +;return t._emitter.addText(e),t})(e),s=t.filter(O).filter(v).map((t=>E(t,e,!1))) +;s.unshift(n);const r=s.sort(((e,t)=>{ +if(e.relevance!==t.relevance)return t.relevance-e.relevance +;if(e.language&&t.language){if(O(e.language).supersetOf===t.language)return 1 +;if(O(t.language).supersetOf===e.language)return-1}return 0})),[o,a]=r,c=o +;return c.secondBest=a,c}function _(e){let t=null;const n=(e=>{ +let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"" +;const n=p.languageDetectRe.exec(t);if(n){const t=O(n[1]) +;return t||(W(a.replace("{}",n[1])), +W("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"} +return t.split(/\s+/).find((e=>b(e)||O(e)))})(e);if(b(n))return +;if(N("before:highlightElement",{el:e,language:n +}),e.dataset.highlighted)return void console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e) +;if(e.children.length>0&&(p.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), +console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), +console.warn("The element with unescaped HTML:"), +console.warn(e)),p.throwUnescapedHTML))throw new q("One of your code blocks includes unescaped HTML.",e.innerHTML) +;t=e;const i=t.textContent,r=n?m(i,{language:n,ignoreIllegals:!0}):x(i) +;e.innerHTML=r.value,e.dataset.highlighted="yes",((e,t,n)=>{const i=t&&s[t]||n +;e.classList.add("hljs"),e.classList.add("language-"+i) +})(e,n,r.language),e.result={language:r.language,re:r.relevance, +relevance:r.relevance},r.secondBest&&(e.secondBest={ +language:r.secondBest.language,relevance:r.secondBest.relevance +}),N("after:highlightElement",{el:e,result:r,text:i})}let y=!1;function w(){ +if("loading"===document.readyState)return y||window.addEventListener("DOMContentLoaded",(()=>{ +w()}),!1),void(y=!0);document.querySelectorAll(p.cssSelector).forEach(_)} +function O(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]} +function k(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +s[e.toLowerCase()]=t}))}function v(e){const t=O(e) +;return t&&!t.disableAutodetect}function N(e,t){const n=e;r.forEach((e=>{ +e[n]&&e[n](t)}))}Object.assign(n,{highlight:m,highlightAuto:x,highlightAll:w, +highlightElement:_, +highlightBlock:e=>(X("10.7.0","highlightBlock will be removed entirely in v12.0"), +X("10.7.0","Please use highlightElement now."),_(e)),configure:e=>{p=Y(p,e)}, +initHighlighting:()=>{ +w(),X("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, +initHighlightingOnLoad:()=>{ +w(),X("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") +},registerLanguage:(e,t)=>{let s=null;try{s=t(n)}catch(t){ +if(z("Language definition for '{}' could not be registered.".replace("{}",e)), +!o)throw t;z(t),s=l} +s.name||(s.name=e),i[e]=s,s.rawDefinition=t.bind(null,n),s.aliases&&k(s.aliases,{ +languageName:e})},unregisterLanguage:e=>{delete i[e] +;for(const t of Object.keys(s))s[t]===e&&delete s[t]}, +listLanguages:()=>Object.keys(i),getLanguage:O,registerAliases:k, +autoDetection:v,inherit:Y,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ +e["before:highlightBlock"](Object.assign({block:t.el},t)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ +e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),r.push(e)}, +removePlugin:e=>{const t=r.indexOf(e);-1!==t&&r.splice(t,1)}}),n.debugMode=()=>{ +o=!1},n.safeMode=()=>{o=!0},n.versionString="11.11.1",n.regex={concat:h, +lookahead:g,either:f,optional:d,anyNumberOfTimes:u} +;for(const t in A)"object"==typeof A[t]&&e(A[t]);return Object.assign(n,A),n +},te=ee({});te.newInstance=()=>ee({});export{te as default}; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/bash.js b/backend/static/highlight(1)/es/languages/bash.js new file mode 100644 index 0000000..9d0838d --- /dev/null +++ b/backend/static/highlight(1)/es/languages/bash.js @@ -0,0 +1,417 @@ +/*! `bash` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: Bash + Author: vah + Contributrors: Benjamin Pannell + Website: https://www.gnu.org/software/bash/ + Category: common, scripting + */ + + /** @type LanguageFn */ + function bash(hljs) { + const regex = hljs.regex; + const VAR = {}; + const BRACED_VAR = { + begin: /\$\{/, + end: /\}/, + contains: [ + "self", + { + begin: /:-/, + contains: [ VAR ] + } // default values + ] + }; + Object.assign(VAR, { + className: 'variable', + variants: [ + { begin: regex.concat(/\$[\w\d#@][\w\d_]*/, + // negative look-ahead tries to avoid matching patterns that are not + // Perl at all like $ident$, @ident@, etc. + `(?![\\w\\d])(?![$])`) }, + BRACED_VAR + ] + }); + + const SUBST = { + className: 'subst', + begin: /\$\(/, + end: /\)/, + contains: [ hljs.BACKSLASH_ESCAPE ] + }; + const COMMENT = hljs.inherit( + hljs.COMMENT(), + { + match: [ + /(^|\s)/, + /#.*$/ + ], + scope: { + 2: 'comment' + } + } + ); + const HERE_DOC = { + begin: /<<-?\s*(?=\w+)/, + starts: { contains: [ + hljs.END_SAME_AS_BEGIN({ + begin: /(\w+)/, + end: /(\w+)/, + className: 'string' + }) + ] } + }; + const QUOTE_STRING = { + className: 'string', + begin: /"/, + end: /"/, + contains: [ + hljs.BACKSLASH_ESCAPE, + VAR, + SUBST + ] + }; + SUBST.contains.push(QUOTE_STRING); + const ESCAPED_QUOTE = { + match: /\\"/ + }; + const APOS_STRING = { + className: 'string', + begin: /'/, + end: /'/ + }; + const ESCAPED_APOS = { + match: /\\'/ + }; + const ARITHMETIC = { + begin: /\$?\(\(/, + end: /\)\)/, + contains: [ + { + begin: /\d+#[0-9a-f]+/, + className: "number" + }, + hljs.NUMBER_MODE, + VAR + ] + }; + const SH_LIKE_SHELLS = [ + "fish", + "bash", + "zsh", + "sh", + "csh", + "ksh", + "tcsh", + "dash", + "scsh", + ]; + const KNOWN_SHEBANG = hljs.SHEBANG({ + binary: `(${SH_LIKE_SHELLS.join("|")})`, + relevance: 10 + }); + const FUNCTION = { + className: 'function', + begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/, + returnBegin: true, + contains: [ hljs.inherit(hljs.TITLE_MODE, { begin: /\w[\w\d_]*/ }) ], + relevance: 0 + }; + + const KEYWORDS = [ + "if", + "then", + "else", + "elif", + "fi", + "time", + "for", + "while", + "until", + "in", + "do", + "done", + "case", + "esac", + "coproc", + "function", + "select" + ]; + + const LITERALS = [ + "true", + "false" + ]; + + // to consume paths to prevent keyword matches inside them + const PATH_MODE = { match: /(\/[a-z._-]+)+/ }; + + // http://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html + const SHELL_BUILT_INS = [ + "break", + "cd", + "continue", + "eval", + "exec", + "exit", + "export", + "getopts", + "hash", + "pwd", + "readonly", + "return", + "shift", + "test", + "times", + "trap", + "umask", + "unset" + ]; + + const BASH_BUILT_INS = [ + "alias", + "bind", + "builtin", + "caller", + "command", + "declare", + "echo", + "enable", + "help", + "let", + "local", + "logout", + "mapfile", + "printf", + "read", + "readarray", + "source", + "sudo", + "type", + "typeset", + "ulimit", + "unalias" + ]; + + const ZSH_BUILT_INS = [ + "autoload", + "bg", + "bindkey", + "bye", + "cap", + "chdir", + "clone", + "comparguments", + "compcall", + "compctl", + "compdescribe", + "compfiles", + "compgroups", + "compquote", + "comptags", + "comptry", + "compvalues", + "dirs", + "disable", + "disown", + "echotc", + "echoti", + "emulate", + "fc", + "fg", + "float", + "functions", + "getcap", + "getln", + "history", + "integer", + "jobs", + "kill", + "limit", + "log", + "noglob", + "popd", + "print", + "pushd", + "pushln", + "rehash", + "sched", + "setcap", + "setopt", + "stat", + "suspend", + "ttyctl", + "unfunction", + "unhash", + "unlimit", + "unsetopt", + "vared", + "wait", + "whence", + "where", + "which", + "zcompile", + "zformat", + "zftp", + "zle", + "zmodload", + "zparseopts", + "zprof", + "zpty", + "zregexparse", + "zsocket", + "zstyle", + "ztcp" + ]; + + const GNU_CORE_UTILS = [ + "chcon", + "chgrp", + "chown", + "chmod", + "cp", + "dd", + "df", + "dir", + "dircolors", + "ln", + "ls", + "mkdir", + "mkfifo", + "mknod", + "mktemp", + "mv", + "realpath", + "rm", + "rmdir", + "shred", + "sync", + "touch", + "truncate", + "vdir", + "b2sum", + "base32", + "base64", + "cat", + "cksum", + "comm", + "csplit", + "cut", + "expand", + "fmt", + "fold", + "head", + "join", + "md5sum", + "nl", + "numfmt", + "od", + "paste", + "ptx", + "pr", + "sha1sum", + "sha224sum", + "sha256sum", + "sha384sum", + "sha512sum", + "shuf", + "sort", + "split", + "sum", + "tac", + "tail", + "tr", + "tsort", + "unexpand", + "uniq", + "wc", + "arch", + "basename", + "chroot", + "date", + "dirname", + "du", + "echo", + "env", + "expr", + "factor", + // "false", // keyword literal already + "groups", + "hostid", + "id", + "link", + "logname", + "nice", + "nohup", + "nproc", + "pathchk", + "pinky", + "printenv", + "printf", + "pwd", + "readlink", + "runcon", + "seq", + "sleep", + "stat", + "stdbuf", + "stty", + "tee", + "test", + "timeout", + // "true", // keyword literal already + "tty", + "uname", + "unlink", + "uptime", + "users", + "who", + "whoami", + "yes" + ]; + + return { + name: 'Bash', + aliases: [ + 'sh', + 'zsh' + ], + keywords: { + $pattern: /\b[a-z][a-z0-9._-]+\b/, + keyword: KEYWORDS, + literal: LITERALS, + built_in: [ + ...SHELL_BUILT_INS, + ...BASH_BUILT_INS, + // Shell modifiers + "set", + "shopt", + ...ZSH_BUILT_INS, + ...GNU_CORE_UTILS + ] + }, + contains: [ + KNOWN_SHEBANG, // to catch known shells and boost relevancy + hljs.SHEBANG(), // to catch unknown shells but still highlight the shebang + FUNCTION, + ARITHMETIC, + COMMENT, + HERE_DOC, + PATH_MODE, + QUOTE_STRING, + ESCAPED_QUOTE, + APOS_STRING, + ESCAPED_APOS, + VAR + ] + }; + } + + return bash; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/bash.min.js b/backend/static/highlight(1)/es/languages/bash.min.js new file mode 100644 index 0000000..d4a42a9 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/bash.min.js @@ -0,0 +1,21 @@ +/*! `bash` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{const s=e.regex,t={},a={ +begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]} +;Object.assign(t,{className:"variable",variants:[{ +begin:s.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},a]});const n={ +className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE] +},c=e.inherit(e.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),i={ +begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/, +end:/(\w+)/,className:"string"})]}},o={className:"string",begin:/"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,t,n]};n.contains.push(o);const r={begin:/\$?\(\(/, +end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t] +},l=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 +}),m={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, +contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ +name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/, +keyword:["if","then","else","elif","fi","time","for","while","until","in","do","done","case","esac","coproc","function","select"], +literal:["true","false"], +built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"] +},contains:[l,e.SHEBANG(),m,r,c,i,{match:/(\/[a-z._-]+)+/},o,{match:/\\"/},{ +className:"string",begin:/'/,end:/'/},{match:/\\'/},t]}}})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/c.js b/backend/static/highlight(1)/es/languages/c.js new file mode 100644 index 0000000..e22d971 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/c.js @@ -0,0 +1,341 @@ +/*! `c` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: C + Category: common, system + Website: https://en.wikipedia.org/wiki/C_(programming_language) + */ + + /** @type LanguageFn */ + function c(hljs) { + const regex = hljs.regex; + // added for historic reasons because `hljs.C_LINE_COMMENT_MODE` does + // not include such support nor can we be sure all the grammars depending + // on it would desire this behavior + const C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$', { contains: [ { begin: /\\\n/ } ] }); + const DECLTYPE_AUTO_RE = 'decltype\\(auto\\)'; + const NAMESPACE_RE = '[a-zA-Z_]\\w*::'; + const TEMPLATE_ARGUMENT_RE = '<[^<>]+>'; + const FUNCTION_TYPE_RE = '(' + + DECLTYPE_AUTO_RE + '|' + + regex.optional(NAMESPACE_RE) + + '[a-zA-Z_]\\w*' + regex.optional(TEMPLATE_ARGUMENT_RE) + + ')'; + + + const TYPES = { + className: 'type', + variants: [ + { begin: '\\b[a-z\\d_]*_t\\b' }, + { match: /\batomic_[a-z]{3,6}\b/ } + ] + + }; + + // https://en.cppreference.com/w/cpp/language/escape + // \\ \x \xFF \u2837 \u00323747 \374 + const CHARACTER_ESCAPES = '\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)'; + const STRINGS = { + className: 'string', + variants: [ + { + begin: '(u8?|U|L)?"', + end: '"', + illegal: '\\n', + contains: [ hljs.BACKSLASH_ESCAPE ] + }, + { + begin: '(u8?|U|L)?\'(' + CHARACTER_ESCAPES + "|.)", + end: '\'', + illegal: '.' + }, + hljs.END_SAME_AS_BEGIN({ + begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/, + end: /\)([^()\\ ]{0,16})"/ + }) + ] + }; + + const NUMBERS = { + className: 'number', + variants: [ + { match: /\b(0b[01']+)/ }, + { match: /(-?)\b([\d']+(\.[\d']*)?|\.[\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)/ }, + { match: /(-?)\b(0[xX][a-fA-F0-9]+(?:'[a-fA-F0-9]+)*(?:\.[a-fA-F0-9]*(?:'[a-fA-F0-9]*)*)?(?:[pP][-+]?[0-9]+)?(l|L)?(u|U)?)/ }, + { match: /(-?)\b\d+(?:'\d+)*(?:\.\d*(?:'\d*)*)?(?:[eE][-+]?\d+)?/ } + ], + relevance: 0 + }; + + const PREPROCESSOR = { + className: 'meta', + begin: /#\s*[a-z]+\b/, + end: /$/, + keywords: { keyword: + 'if else elif endif define undef warning error line ' + + 'pragma _Pragma ifdef ifndef elifdef elifndef include' }, + contains: [ + { + begin: /\\\n/, + relevance: 0 + }, + hljs.inherit(STRINGS, { className: 'string' }), + { + className: 'string', + begin: /<.*?>/ + }, + C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }; + + const TITLE_MODE = { + className: 'title', + begin: regex.optional(NAMESPACE_RE) + hljs.IDENT_RE, + relevance: 0 + }; + + const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs.IDENT_RE + '\\s*\\('; + + const C_KEYWORDS = [ + "asm", + "auto", + "break", + "case", + "continue", + "default", + "do", + "else", + "enum", + "extern", + "for", + "fortran", + "goto", + "if", + "inline", + "register", + "restrict", + "return", + "sizeof", + "typeof", + "typeof_unqual", + "struct", + "switch", + "typedef", + "union", + "volatile", + "while", + "_Alignas", + "_Alignof", + "_Atomic", + "_Generic", + "_Noreturn", + "_Static_assert", + "_Thread_local", + // aliases + "alignas", + "alignof", + "noreturn", + "static_assert", + "thread_local", + // not a C keyword but is, for all intents and purposes, treated exactly like one. + "_Pragma" + ]; + + const C_TYPES = [ + "float", + "double", + "signed", + "unsigned", + "int", + "short", + "long", + "char", + "void", + "_Bool", + "_BitInt", + "_Complex", + "_Imaginary", + "_Decimal32", + "_Decimal64", + "_Decimal96", + "_Decimal128", + "_Decimal64x", + "_Decimal128x", + "_Float16", + "_Float32", + "_Float64", + "_Float128", + "_Float32x", + "_Float64x", + "_Float128x", + // modifiers + "const", + "static", + "constexpr", + // aliases + "complex", + "bool", + "imaginary" + ]; + + const KEYWORDS = { + keyword: C_KEYWORDS, + type: C_TYPES, + literal: 'true false NULL', + // TODO: apply hinting work similar to what was done in cpp.js + built_in: 'std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream ' + + 'auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set ' + + 'unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos ' + + 'asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp ' + + 'fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper ' + + 'isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow ' + + 'printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp ' + + 'strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan ' + + 'vfprintf vprintf vsprintf endl initializer_list unique_ptr', + }; + + const EXPRESSION_CONTAINS = [ + PREPROCESSOR, + TYPES, + C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + NUMBERS, + STRINGS + ]; + + const EXPRESSION_CONTEXT = { + // This mode covers expression context where we can't expect a function + // definition and shouldn't highlight anything that looks like one: + // `return some()`, `else if()`, `(x*sum(1, 2))` + variants: [ + { + begin: /=/, + end: /;/ + }, + { + begin: /\(/, + end: /\)/ + }, + { + beginKeywords: 'new throw return else', + end: /;/ + } + ], + keywords: KEYWORDS, + contains: EXPRESSION_CONTAINS.concat([ + { + begin: /\(/, + end: /\)/, + keywords: KEYWORDS, + contains: EXPRESSION_CONTAINS.concat([ 'self' ]), + relevance: 0 + } + ]), + relevance: 0 + }; + + const FUNCTION_DECLARATION = { + begin: '(' + FUNCTION_TYPE_RE + '[\\*&\\s]+)+' + FUNCTION_TITLE, + returnBegin: true, + end: /[{;=]/, + excludeEnd: true, + keywords: KEYWORDS, + illegal: /[^\w\s\*&:<>.]/, + contains: [ + { // to prevent it from being confused as the function title + begin: DECLTYPE_AUTO_RE, + keywords: KEYWORDS, + relevance: 0 + }, + { + begin: FUNCTION_TITLE, + returnBegin: true, + contains: [ hljs.inherit(TITLE_MODE, { className: "title.function" }) ], + relevance: 0 + }, + // allow for multiple declarations, e.g.: + // extern void f(int), g(char); + { + relevance: 0, + match: /,/ + }, + { + className: 'params', + begin: /\(/, + end: /\)/, + keywords: KEYWORDS, + relevance: 0, + contains: [ + C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + STRINGS, + NUMBERS, + TYPES, + // Count matching parentheses. + { + begin: /\(/, + end: /\)/, + keywords: KEYWORDS, + relevance: 0, + contains: [ + 'self', + C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + STRINGS, + NUMBERS, + TYPES + ] + } + ] + }, + TYPES, + C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + PREPROCESSOR + ] + }; + + return { + name: "C", + aliases: [ 'h' ], + keywords: KEYWORDS, + // Until differentiations are added between `c` and `cpp`, `c` will + // not be auto-detected to avoid auto-detect conflicts between C and C++ + disableAutodetect: true, + illegal: '=]/, + contains: [ + { beginKeywords: "final class struct" }, + hljs.TITLE_MODE + ] + } + ]), + exports: { + preprocessor: PREPROCESSOR, + strings: STRINGS, + keywords: KEYWORDS + } + }; + } + + return c; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/c.min.js b/backend/static/highlight(1)/es/languages/c.min.js new file mode 100644 index 0000000..d48bafb --- /dev/null +++ b/backend/static/highlight(1)/es/languages/c.min.js @@ -0,0 +1,41 @@ +/*! `c` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{ +const t=e.regex,a=e.COMMENT("//","$",{contains:[{begin:/\\\n/}] +}),n="decltype\\(auto\\)",s="[a-zA-Z_]\\w*::",r="("+n+"|"+t.optional(s)+"[a-zA-Z_]\\w*"+t.optional("<[^<>]+>")+")",i={ +className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{ +match:/\batomic_[a-z]{3,6}\b/}]},l={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ +className:"number",variants:[{match:/\b(0b[01']+)/},{ +match:/(-?)\b([\d']+(\.[\d']*)?|\.[\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)/ +},{ +match:/(-?)\b(0[xX][a-fA-F0-9]+(?:'[a-fA-F0-9]+)*(?:\.[a-fA-F0-9]*(?:'[a-fA-F0-9]*)*)?(?:[pP][-+]?[0-9]+)?(l|L)?(u|U)?)/ +},{match:/(-?)\b\d+(?:'\d+)*(?:\.\d*(?:'\d*)*)?(?:[eE][-+]?\d+)?/}],relevance:0 +},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef elifdef elifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(l,{className:"string"}),{ +className:"string",begin:/<.*?>/},a,e.C_BLOCK_COMMENT_MODE]},d={ +className:"title",begin:t.optional(s)+e.IDENT_RE,relevance:0 +},m=t.optional(s)+e.IDENT_RE+"\\s*\\(",_={ +keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","typeof","typeof_unqual","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"], +type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_BitInt","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal96","_Decimal128","_Decimal64x","_Decimal128x","_Float16","_Float32","_Float64","_Float128","_Float32x","_Float64x","_Float128x","const","static","constexpr","complex","bool","imaginary"], +literal:"true false NULL", +built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr" +},u=[c,i,a,e.C_BLOCK_COMMENT_MODE,o,l],p={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:_,contains:u.concat([{begin:/\(/,end:/\)/,keywords:_, +contains:u.concat(["self"]),relevance:0}]),relevance:0},f={ +begin:"("+r+"[\\*&\\s]+)+"+m,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:_,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:n,keywords:_,relevance:0},{ +begin:m,returnBegin:!0,contains:[e.inherit(d,{className:"title.function"})], +relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/, +keywords:_,relevance:0,contains:[a,e.C_BLOCK_COMMENT_MODE,l,o,i,{begin:/\(/, +end:/\)/,keywords:_,relevance:0,contains:["self",a,e.C_BLOCK_COMMENT_MODE,l,o,i] +}]},i,a,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:_, +disableAutodetect:!0,illegal:"=]/,contains:[{ +beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:c, +strings:l,keywords:_}}}})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/cpp.js b/backend/static/highlight(1)/es/languages/cpp.js new file mode 100644 index 0000000..e77ba7a --- /dev/null +++ b/backend/static/highlight(1)/es/languages/cpp.js @@ -0,0 +1,613 @@ +/*! `cpp` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: C++ + Category: common, system + Website: https://isocpp.org + */ + + /** @type LanguageFn */ + function cpp(hljs) { + const regex = hljs.regex; + // added for historic reasons because `hljs.C_LINE_COMMENT_MODE` does + // not include such support nor can we be sure all the grammars depending + // on it would desire this behavior + const C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$', { contains: [ { begin: /\\\n/ } ] }); + const DECLTYPE_AUTO_RE = 'decltype\\(auto\\)'; + const NAMESPACE_RE = '[a-zA-Z_]\\w*::'; + const TEMPLATE_ARGUMENT_RE = '<[^<>]+>'; + const FUNCTION_TYPE_RE = '(?!struct)(' + + DECLTYPE_AUTO_RE + '|' + + regex.optional(NAMESPACE_RE) + + '[a-zA-Z_]\\w*' + regex.optional(TEMPLATE_ARGUMENT_RE) + + ')'; + + const CPP_PRIMITIVE_TYPES = { + className: 'type', + begin: '\\b[a-z\\d_]*_t\\b' + }; + + // https://en.cppreference.com/w/cpp/language/escape + // \\ \x \xFF \u2837 \u00323747 \374 + const CHARACTER_ESCAPES = '\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)'; + const STRINGS = { + className: 'string', + variants: [ + { + begin: '(u8?|U|L)?"', + end: '"', + illegal: '\\n', + contains: [ hljs.BACKSLASH_ESCAPE ] + }, + { + begin: '(u8?|U|L)?\'(' + CHARACTER_ESCAPES + '|.)', + end: '\'', + illegal: '.' + }, + hljs.END_SAME_AS_BEGIN({ + begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/, + end: /\)([^()\\ ]{0,16})"/ + }) + ] + }; + + const NUMBERS = { + className: 'number', + variants: [ + // Floating-point literal. + { begin: + "[+-]?(?:" // Leading sign. + // Decimal. + + "(?:" + +"[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?" + + "|\\.[0-9](?:'?[0-9])*" + + ")(?:[Ee][+-]?[0-9](?:'?[0-9])*)?" + + "|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*" + // Hexadecimal. + + "|0[Xx](?:" + +"[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?" + + "|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*" + + ")[Pp][+-]?[0-9](?:'?[0-9])*" + + ")(?:" // Literal suffixes. + + "[Ff](?:16|32|64|128)?" + + "|(BF|bf)16" + + "|[Ll]" + + "|" // Literal suffix is optional. + + ")" + }, + // Integer literal. + { begin: + "[+-]?\\b(?:" // Leading sign. + + "0[Bb][01](?:'?[01])*" // Binary. + + "|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*" // Hexadecimal. + + "|0(?:'?[0-7])*" // Octal or just a lone zero. + + "|[1-9](?:'?[0-9])*" // Decimal. + + ")(?:" // Literal suffixes. + + "[Uu](?:LL?|ll?)" + + "|[Uu][Zz]?" + + "|(?:LL?|ll?)[Uu]?" + + "|[Zz][Uu]" + + "|" // Literal suffix is optional. + + ")" + // Note: there are user-defined literal suffixes too, but perhaps having the custom suffix not part of the + // literal highlight actually makes it stand out more. + } + ], + relevance: 0 + }; + + const PREPROCESSOR = { + className: 'meta', + begin: /#\s*[a-z]+\b/, + end: /$/, + keywords: { keyword: + 'if else elif endif define undef warning error line ' + + 'pragma _Pragma ifdef ifndef include' }, + contains: [ + { + begin: /\\\n/, + relevance: 0 + }, + hljs.inherit(STRINGS, { className: 'string' }), + { + className: 'string', + begin: /<.*?>/ + }, + C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }; + + const TITLE_MODE = { + className: 'title', + begin: regex.optional(NAMESPACE_RE) + hljs.IDENT_RE, + relevance: 0 + }; + + const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs.IDENT_RE + '\\s*\\('; + + // https://en.cppreference.com/w/cpp/keyword + const RESERVED_KEYWORDS = [ + 'alignas', + 'alignof', + 'and', + 'and_eq', + 'asm', + 'atomic_cancel', + 'atomic_commit', + 'atomic_noexcept', + 'auto', + 'bitand', + 'bitor', + 'break', + 'case', + 'catch', + 'class', + 'co_await', + 'co_return', + 'co_yield', + 'compl', + 'concept', + 'const_cast|10', + 'consteval', + 'constexpr', + 'constinit', + 'continue', + 'decltype', + 'default', + 'delete', + 'do', + 'dynamic_cast|10', + 'else', + 'enum', + 'explicit', + 'export', + 'extern', + 'false', + 'final', + 'for', + 'friend', + 'goto', + 'if', + 'import', + 'inline', + 'module', + 'mutable', + 'namespace', + 'new', + 'noexcept', + 'not', + 'not_eq', + 'nullptr', + 'operator', + 'or', + 'or_eq', + 'override', + 'private', + 'protected', + 'public', + 'reflexpr', + 'register', + 'reinterpret_cast|10', + 'requires', + 'return', + 'sizeof', + 'static_assert', + 'static_cast|10', + 'struct', + 'switch', + 'synchronized', + 'template', + 'this', + 'thread_local', + 'throw', + 'transaction_safe', + 'transaction_safe_dynamic', + 'true', + 'try', + 'typedef', + 'typeid', + 'typename', + 'union', + 'using', + 'virtual', + 'volatile', + 'while', + 'xor', + 'xor_eq' + ]; + + // https://en.cppreference.com/w/cpp/keyword + const RESERVED_TYPES = [ + 'bool', + 'char', + 'char16_t', + 'char32_t', + 'char8_t', + 'double', + 'float', + 'int', + 'long', + 'short', + 'void', + 'wchar_t', + 'unsigned', + 'signed', + 'const', + 'static' + ]; + + const TYPE_HINTS = [ + 'any', + 'auto_ptr', + 'barrier', + 'binary_semaphore', + 'bitset', + 'complex', + 'condition_variable', + 'condition_variable_any', + 'counting_semaphore', + 'deque', + 'false_type', + 'flat_map', + 'flat_set', + 'future', + 'imaginary', + 'initializer_list', + 'istringstream', + 'jthread', + 'latch', + 'lock_guard', + 'multimap', + 'multiset', + 'mutex', + 'optional', + 'ostringstream', + 'packaged_task', + 'pair', + 'promise', + 'priority_queue', + 'queue', + 'recursive_mutex', + 'recursive_timed_mutex', + 'scoped_lock', + 'set', + 'shared_future', + 'shared_lock', + 'shared_mutex', + 'shared_timed_mutex', + 'shared_ptr', + 'stack', + 'string_view', + 'stringstream', + 'timed_mutex', + 'thread', + 'true_type', + 'tuple', + 'unique_lock', + 'unique_ptr', + 'unordered_map', + 'unordered_multimap', + 'unordered_multiset', + 'unordered_set', + 'variant', + 'vector', + 'weak_ptr', + 'wstring', + 'wstring_view' + ]; + + const FUNCTION_HINTS = [ + 'abort', + 'abs', + 'acos', + 'apply', + 'as_const', + 'asin', + 'atan', + 'atan2', + 'calloc', + 'ceil', + 'cerr', + 'cin', + 'clog', + 'cos', + 'cosh', + 'cout', + 'declval', + 'endl', + 'exchange', + 'exit', + 'exp', + 'fabs', + 'floor', + 'fmod', + 'forward', + 'fprintf', + 'fputs', + 'free', + 'frexp', + 'fscanf', + 'future', + 'invoke', + 'isalnum', + 'isalpha', + 'iscntrl', + 'isdigit', + 'isgraph', + 'islower', + 'isprint', + 'ispunct', + 'isspace', + 'isupper', + 'isxdigit', + 'labs', + 'launder', + 'ldexp', + 'log', + 'log10', + 'make_pair', + 'make_shared', + 'make_shared_for_overwrite', + 'make_tuple', + 'make_unique', + 'malloc', + 'memchr', + 'memcmp', + 'memcpy', + 'memset', + 'modf', + 'move', + 'pow', + 'printf', + 'putchar', + 'puts', + 'realloc', + 'scanf', + 'sin', + 'sinh', + 'snprintf', + 'sprintf', + 'sqrt', + 'sscanf', + 'std', + 'stderr', + 'stdin', + 'stdout', + 'strcat', + 'strchr', + 'strcmp', + 'strcpy', + 'strcspn', + 'strlen', + 'strncat', + 'strncmp', + 'strncpy', + 'strpbrk', + 'strrchr', + 'strspn', + 'strstr', + 'swap', + 'tan', + 'tanh', + 'terminate', + 'to_underlying', + 'tolower', + 'toupper', + 'vfprintf', + 'visit', + 'vprintf', + 'vsprintf' + ]; + + const LITERALS = [ + 'NULL', + 'false', + 'nullopt', + 'nullptr', + 'true' + ]; + + // https://en.cppreference.com/w/cpp/keyword + const BUILT_IN = [ '_Pragma' ]; + + const CPP_KEYWORDS = { + type: RESERVED_TYPES, + keyword: RESERVED_KEYWORDS, + literal: LITERALS, + built_in: BUILT_IN, + _type_hints: TYPE_HINTS + }; + + const FUNCTION_DISPATCH = { + className: 'function.dispatch', + relevance: 0, + keywords: { + // Only for relevance, not highlighting. + _hint: FUNCTION_HINTS }, + begin: regex.concat( + /\b/, + /(?!decltype)/, + /(?!if)/, + /(?!for)/, + /(?!switch)/, + /(?!while)/, + hljs.IDENT_RE, + regex.lookahead(/(<[^<>]+>|)\s*\(/)) + }; + + const EXPRESSION_CONTAINS = [ + FUNCTION_DISPATCH, + PREPROCESSOR, + CPP_PRIMITIVE_TYPES, + C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + NUMBERS, + STRINGS + ]; + + const EXPRESSION_CONTEXT = { + // This mode covers expression context where we can't expect a function + // definition and shouldn't highlight anything that looks like one: + // `return some()`, `else if()`, `(x*sum(1, 2))` + variants: [ + { + begin: /=/, + end: /;/ + }, + { + begin: /\(/, + end: /\)/ + }, + { + beginKeywords: 'new throw return else', + end: /;/ + } + ], + keywords: CPP_KEYWORDS, + contains: EXPRESSION_CONTAINS.concat([ + { + begin: /\(/, + end: /\)/, + keywords: CPP_KEYWORDS, + contains: EXPRESSION_CONTAINS.concat([ 'self' ]), + relevance: 0 + } + ]), + relevance: 0 + }; + + const FUNCTION_DECLARATION = { + className: 'function', + begin: '(' + FUNCTION_TYPE_RE + '[\\*&\\s]+)+' + FUNCTION_TITLE, + returnBegin: true, + end: /[{;=]/, + excludeEnd: true, + keywords: CPP_KEYWORDS, + illegal: /[^\w\s\*&:<>.]/, + contains: [ + { // to prevent it from being confused as the function title + begin: DECLTYPE_AUTO_RE, + keywords: CPP_KEYWORDS, + relevance: 0 + }, + { + begin: FUNCTION_TITLE, + returnBegin: true, + contains: [ TITLE_MODE ], + relevance: 0 + }, + // needed because we do not have look-behind on the below rule + // to prevent it from grabbing the final : in a :: pair + { + begin: /::/, + relevance: 0 + }, + // initializers + { + begin: /:/, + endsWithParent: true, + contains: [ + STRINGS, + NUMBERS + ] + }, + // allow for multiple declarations, e.g.: + // extern void f(int), g(char); + { + relevance: 0, + match: /,/ + }, + { + className: 'params', + begin: /\(/, + end: /\)/, + keywords: CPP_KEYWORDS, + relevance: 0, + contains: [ + C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + STRINGS, + NUMBERS, + CPP_PRIMITIVE_TYPES, + // Count matching parentheses. + { + begin: /\(/, + end: /\)/, + keywords: CPP_KEYWORDS, + relevance: 0, + contains: [ + 'self', + C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + STRINGS, + NUMBERS, + CPP_PRIMITIVE_TYPES + ] + } + ] + }, + CPP_PRIMITIVE_TYPES, + C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + PREPROCESSOR + ] + }; + + return { + name: 'C++', + aliases: [ + 'cc', + 'c++', + 'h++', + 'hpp', + 'hh', + 'hxx', + 'cxx' + ], + keywords: CPP_KEYWORDS, + illegal: ' rooms (9);` + begin: '\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array|tuple|optional|variant|function|flat_map|flat_set)\\s*<(?!<)', + end: '>', + keywords: CPP_KEYWORDS, + contains: [ + 'self', + CPP_PRIMITIVE_TYPES + ] + }, + { + begin: hljs.IDENT_RE + '::', + keywords: CPP_KEYWORDS + }, + { + match: [ + // extra complexity to deal with `enum class` and `enum struct` + /\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/, + /\s+/, + /\w+/ + ], + className: { + 1: 'keyword', + 3: 'title.class' + } + } + ]) + }; + } + + return cpp; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/cpp.min.js b/backend/static/highlight(1)/es/languages/cpp.min.js new file mode 100644 index 0000000..69d5b3e --- /dev/null +++ b/backend/static/highlight(1)/es/languages/cpp.min.js @@ -0,0 +1,46 @@ +/*! `cpp` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{ +const t=e.regex,a=e.COMMENT("//","$",{contains:[{begin:/\\\n/}] +}),n="decltype\\(auto\\)",r="[a-zA-Z_]\\w*::",i="(?!struct)("+n+"|"+t.optional(r)+"[a-zA-Z_]\\w*"+t.optional("<[^<>]+>")+")",s={ +className:"type",begin:"\\b[a-z\\d_]*_t\\b"},c={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ +className:"number",variants:[{ +begin:"[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)" +},{ +begin:"[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)" +}],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(c,{className:"string"}),{ +className:"string",begin:/<.*?>/},a,e.C_BLOCK_COMMENT_MODE]},u={ +className:"title",begin:t.optional(r)+e.IDENT_RE,relevance:0 +},d=t.optional(r)+e.IDENT_RE+"\\s*\\(",_={ +type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"], +keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"], +literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"], +_type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","flat_map","flat_set","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"] +},p={className:"function.dispatch",relevance:0,keywords:{ +_hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"] +}, +begin:t.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,t.lookahead(/(<[^<>]+>|)\s*\(/)) +},m=[p,l,s,a,e.C_BLOCK_COMMENT_MODE,o,c],f={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:_,contains:m.concat([{begin:/\(/,end:/\)/,keywords:_, +contains:m.concat(["self"]),relevance:0}]),relevance:0},g={className:"function", +begin:"("+i+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:_,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:n,keywords:_,relevance:0},{ +begin:d,returnBegin:!0,contains:[u],relevance:0},{begin:/::/,relevance:0},{ +begin:/:/,endsWithParent:!0,contains:[c,o]},{relevance:0,match:/,/},{ +className:"params",begin:/\(/,end:/\)/,keywords:_,relevance:0, +contains:[a,e.C_BLOCK_COMMENT_MODE,c,o,s,{begin:/\(/,end:/\)/,keywords:_, +relevance:0,contains:["self",a,e.C_BLOCK_COMMENT_MODE,c,o,s]}] +},s,a,e.C_BLOCK_COMMENT_MODE,l]};return{name:"C++", +aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:_,illegal:"",keywords:_,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:_},{ +match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/], +className:{1:"keyword",3:"title.class"}}])}}})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/csharp.js b/backend/static/highlight(1)/es/languages/csharp.js new file mode 100644 index 0000000..197249f --- /dev/null +++ b/backend/static/highlight(1)/es/languages/csharp.js @@ -0,0 +1,420 @@ +/*! `csharp` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: C# + Author: Jason Diamond + Contributor: Nicolas LLOBERA , Pieter Vantorre , David Pine + Website: https://docs.microsoft.com/dotnet/csharp/ + Category: common + */ + + /** @type LanguageFn */ + function csharp(hljs) { + const BUILT_IN_KEYWORDS = [ + 'bool', + 'byte', + 'char', + 'decimal', + 'delegate', + 'double', + 'dynamic', + 'enum', + 'float', + 'int', + 'long', + 'nint', + 'nuint', + 'object', + 'sbyte', + 'short', + 'string', + 'ulong', + 'uint', + 'ushort' + ]; + const FUNCTION_MODIFIERS = [ + 'public', + 'private', + 'protected', + 'static', + 'internal', + 'protected', + 'abstract', + 'async', + 'extern', + 'override', + 'unsafe', + 'virtual', + 'new', + 'sealed', + 'partial' + ]; + const LITERAL_KEYWORDS = [ + 'default', + 'false', + 'null', + 'true' + ]; + const NORMAL_KEYWORDS = [ + 'abstract', + 'as', + 'base', + 'break', + 'case', + 'catch', + 'class', + 'const', + 'continue', + 'do', + 'else', + 'event', + 'explicit', + 'extern', + 'finally', + 'fixed', + 'for', + 'foreach', + 'goto', + 'if', + 'implicit', + 'in', + 'interface', + 'internal', + 'is', + 'lock', + 'namespace', + 'new', + 'operator', + 'out', + 'override', + 'params', + 'private', + 'protected', + 'public', + 'readonly', + 'record', + 'ref', + 'return', + 'scoped', + 'sealed', + 'sizeof', + 'stackalloc', + 'static', + 'struct', + 'switch', + 'this', + 'throw', + 'try', + 'typeof', + 'unchecked', + 'unsafe', + 'using', + 'virtual', + 'void', + 'volatile', + 'while' + ]; + const CONTEXTUAL_KEYWORDS = [ + 'add', + 'alias', + 'and', + 'ascending', + 'args', + 'async', + 'await', + 'by', + 'descending', + 'dynamic', + 'equals', + 'file', + 'from', + 'get', + 'global', + 'group', + 'init', + 'into', + 'join', + 'let', + 'nameof', + 'not', + 'notnull', + 'on', + 'or', + 'orderby', + 'partial', + 'record', + 'remove', + 'required', + 'scoped', + 'select', + 'set', + 'unmanaged', + 'value|0', + 'var', + 'when', + 'where', + 'with', + 'yield' + ]; + + const KEYWORDS = { + keyword: NORMAL_KEYWORDS.concat(CONTEXTUAL_KEYWORDS), + built_in: BUILT_IN_KEYWORDS, + literal: LITERAL_KEYWORDS + }; + const TITLE_MODE = hljs.inherit(hljs.TITLE_MODE, { begin: '[a-zA-Z](\\.?\\w)*' }); + const NUMBERS = { + className: 'number', + variants: [ + { begin: '\\b(0b[01\']+)' }, + { begin: '(-?)\\b([\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)(u|U|l|L|ul|UL|f|F|b|B)' }, + { begin: '(-?)(\\b0[xX][a-fA-F0-9\']+|(\\b[\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)([eE][-+]?[\\d\']+)?)' } + ], + relevance: 0 + }; + const RAW_STRING = { + className: 'string', + begin: /"""("*)(?!")(.|\n)*?"""\1/, + relevance: 1 + }; + const VERBATIM_STRING = { + className: 'string', + begin: '@"', + end: '"', + contains: [ { begin: '""' } ] + }; + const VERBATIM_STRING_NO_LF = hljs.inherit(VERBATIM_STRING, { illegal: /\n/ }); + const SUBST = { + className: 'subst', + begin: /\{/, + end: /\}/, + keywords: KEYWORDS + }; + const SUBST_NO_LF = hljs.inherit(SUBST, { illegal: /\n/ }); + const INTERPOLATED_STRING = { + className: 'string', + begin: /\$"/, + end: '"', + illegal: /\n/, + contains: [ + { begin: /\{\{/ }, + { begin: /\}\}/ }, + hljs.BACKSLASH_ESCAPE, + SUBST_NO_LF + ] + }; + const INTERPOLATED_VERBATIM_STRING = { + className: 'string', + begin: /\$@"/, + end: '"', + contains: [ + { begin: /\{\{/ }, + { begin: /\}\}/ }, + { begin: '""' }, + SUBST + ] + }; + const INTERPOLATED_VERBATIM_STRING_NO_LF = hljs.inherit(INTERPOLATED_VERBATIM_STRING, { + illegal: /\n/, + contains: [ + { begin: /\{\{/ }, + { begin: /\}\}/ }, + { begin: '""' }, + SUBST_NO_LF + ] + }); + SUBST.contains = [ + INTERPOLATED_VERBATIM_STRING, + INTERPOLATED_STRING, + VERBATIM_STRING, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + NUMBERS, + hljs.C_BLOCK_COMMENT_MODE + ]; + SUBST_NO_LF.contains = [ + INTERPOLATED_VERBATIM_STRING_NO_LF, + INTERPOLATED_STRING, + VERBATIM_STRING_NO_LF, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + NUMBERS, + hljs.inherit(hljs.C_BLOCK_COMMENT_MODE, { illegal: /\n/ }) + ]; + const STRING = { variants: [ + RAW_STRING, + INTERPOLATED_VERBATIM_STRING, + INTERPOLATED_STRING, + VERBATIM_STRING, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE + ] }; + + const GENERIC_MODIFIER = { + begin: "<", + end: ">", + contains: [ + { beginKeywords: "in out" }, + TITLE_MODE + ] + }; + const TYPE_IDENT_RE = hljs.IDENT_RE + '(<' + hljs.IDENT_RE + '(\\s*,\\s*' + hljs.IDENT_RE + ')*>)?(\\[\\])?'; + const AT_IDENTIFIER = { + // prevents expressions like `@class` from incorrect flagging + // `class` as a keyword + begin: "@" + hljs.IDENT_RE, + relevance: 0 + }; + + return { + name: 'C#', + aliases: [ + 'cs', + 'c#' + ], + keywords: KEYWORDS, + illegal: /::/, + contains: [ + hljs.COMMENT( + '///', + '$', + { + returnBegin: true, + contains: [ + { + className: 'doctag', + variants: [ + { + begin: '///', + relevance: 0 + }, + { begin: '' }, + { + begin: '' + } + ] + } + ] + } + ), + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + { + className: 'meta', + begin: '#', + end: '$', + keywords: { keyword: 'if else elif endif define undef warning error line region endregion pragma checksum' } + }, + STRING, + NUMBERS, + { + beginKeywords: 'class interface', + relevance: 0, + end: /[{;=]/, + illegal: /[^\s:,]/, + contains: [ + { beginKeywords: "where class" }, + TITLE_MODE, + GENERIC_MODIFIER, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + { + beginKeywords: 'namespace', + relevance: 0, + end: /[{;=]/, + illegal: /[^\s:]/, + contains: [ + TITLE_MODE, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + { + beginKeywords: 'record', + relevance: 0, + end: /[{;=]/, + illegal: /[^\s:]/, + contains: [ + TITLE_MODE, + GENERIC_MODIFIER, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + { + // [Attributes("")] + className: 'meta', + begin: '^\\s*\\[(?=[\\w])', + excludeBegin: true, + end: '\\]', + excludeEnd: true, + contains: [ + { + className: 'string', + begin: /"/, + end: /"/ + } + ] + }, + { + // Expression keywords prevent 'keyword Name(...)' from being + // recognized as a function definition + beginKeywords: 'new return throw await else', + relevance: 0 + }, + { + className: 'function', + begin: '(' + TYPE_IDENT_RE + '\\s+)+' + hljs.IDENT_RE + '\\s*(<[^=]+>\\s*)?\\(', + returnBegin: true, + end: /\s*[{;=]/, + excludeEnd: true, + keywords: KEYWORDS, + contains: [ + // prevents these from being highlighted `title` + { + beginKeywords: FUNCTION_MODIFIERS.join(" "), + relevance: 0 + }, + { + begin: hljs.IDENT_RE + '\\s*(<[^=]+>\\s*)?\\(', + returnBegin: true, + contains: [ + hljs.TITLE_MODE, + GENERIC_MODIFIER + ], + relevance: 0 + }, + { match: /\(\)/ }, + { + className: 'params', + begin: /\(/, + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS, + relevance: 0, + contains: [ + STRING, + NUMBERS, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + AT_IDENTIFIER + ] + }; + } + + return csharp; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/csharp.min.js b/backend/static/highlight(1)/es/languages/csharp.min.js new file mode 100644 index 0000000..d021fcc --- /dev/null +++ b/backend/static/highlight(1)/es/languages/csharp.min.js @@ -0,0 +1,49 @@ +/*! `csharp` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{const n={ +keyword:["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","args","async","await","by","descending","dynamic","equals","file","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","record","remove","required","scoped","select","set","unmanaged","value|0","var","when","where","with","yield"]), +built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"], +literal:["default","false","null","true"]},a=e.inherit(e.TITLE_MODE,{ +begin:"[a-zA-Z](\\.?\\w)*"}),i={className:"number",variants:[{ +begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}] +},r=e.inherit(s,{illegal:/\n/}),t={className:"subst",begin:/\{/,end:/\}/, +keywords:n},l=e.inherit(t,{illegal:/\n/}),c={className:"string",begin:/\$"/, +end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/ +},e.BACKSLASH_ESCAPE,l]},o={className:"string",begin:/\$@"/,end:'"',contains:[{ +begin:/\{\{/},{begin:/\}\}/},{begin:'""'},t]},d=e.inherit(o,{illegal:/\n/, +contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},l]}) +;t.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.C_BLOCK_COMMENT_MODE], +l.contains=[d,c,r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.inherit(e.C_BLOCK_COMMENT_MODE,{ +illegal:/\n/})];const g={variants:[{className:"string", +begin:/"""("*)(?!")(.|\n)*?"""\1/,relevance:1 +},o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">", +contains:[{beginKeywords:"in out"},a] +},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={ +begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"], +keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0, +contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{ +begin:"\x3c!--|--\x3e"},{begin:""}]}] +}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#", +end:"$",keywords:{ +keyword:"if else elif endif define undef warning error line region endregion pragma checksum" +}},g,i,{beginKeywords:"class interface",relevance:0,end:/[{;=]/, +illegal:/[^\s:,]/,contains:[{beginKeywords:"where class" +},a,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace", +relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[a,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[a,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta", +begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{ +className:"string",begin:/"/,end:/"/}]},{ +beginKeywords:"new return throw await else",relevance:0},{className:"function", +begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, +end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{ +beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial", +relevance:0},{begin:e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, +contains:[e.TITLE_MODE,E],relevance:0},{match:/\(\)/},{className:"params", +begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0, +contains:[g,i,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/css.js b/backend/static/highlight(1)/es/languages/css.js new file mode 100644 index 0000000..fc1c08e --- /dev/null +++ b/backend/static/highlight(1)/es/languages/css.js @@ -0,0 +1,957 @@ +/*! `css` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + const MODES = (hljs) => { + return { + IMPORTANT: { + scope: 'meta', + begin: '!important' + }, + BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE, + HEXCOLOR: { + scope: 'number', + begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/ + }, + FUNCTION_DISPATCH: { + className: "built_in", + begin: /[\w-]+(?=\()/ + }, + ATTRIBUTE_SELECTOR_MODE: { + scope: 'selector-attr', + begin: /\[/, + end: /\]/, + illegal: '$', + contains: [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE + ] + }, + CSS_NUMBER_MODE: { + scope: 'number', + begin: hljs.NUMBER_RE + '(' + + '%|em|ex|ch|rem' + + '|vw|vh|vmin|vmax' + + '|cm|mm|in|pt|pc|px' + + '|deg|grad|rad|turn' + + '|s|ms' + + '|Hz|kHz' + + '|dpi|dpcm|dppx' + + ')?', + relevance: 0 + }, + CSS_VARIABLE: { + className: "attr", + begin: /--[A-Za-z_][A-Za-z0-9_-]*/ + } + }; + }; + + const HTML_TAGS = [ + 'a', + 'abbr', + 'address', + 'article', + 'aside', + 'audio', + 'b', + 'blockquote', + 'body', + 'button', + 'canvas', + 'caption', + 'cite', + 'code', + 'dd', + 'del', + 'details', + 'dfn', + 'div', + 'dl', + 'dt', + 'em', + 'fieldset', + 'figcaption', + 'figure', + 'footer', + 'form', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'header', + 'hgroup', + 'html', + 'i', + 'iframe', + 'img', + 'input', + 'ins', + 'kbd', + 'label', + 'legend', + 'li', + 'main', + 'mark', + 'menu', + 'nav', + 'object', + 'ol', + 'optgroup', + 'option', + 'p', + 'picture', + 'q', + 'quote', + 'samp', + 'section', + 'select', + 'source', + 'span', + 'strong', + 'summary', + 'sup', + 'table', + 'tbody', + 'td', + 'textarea', + 'tfoot', + 'th', + 'thead', + 'time', + 'tr', + 'ul', + 'var', + 'video' + ]; + + const SVG_TAGS = [ + 'defs', + 'g', + 'marker', + 'mask', + 'pattern', + 'svg', + 'switch', + 'symbol', + 'feBlend', + 'feColorMatrix', + 'feComponentTransfer', + 'feComposite', + 'feConvolveMatrix', + 'feDiffuseLighting', + 'feDisplacementMap', + 'feFlood', + 'feGaussianBlur', + 'feImage', + 'feMerge', + 'feMorphology', + 'feOffset', + 'feSpecularLighting', + 'feTile', + 'feTurbulence', + 'linearGradient', + 'radialGradient', + 'stop', + 'circle', + 'ellipse', + 'image', + 'line', + 'path', + 'polygon', + 'polyline', + 'rect', + 'text', + 'use', + 'textPath', + 'tspan', + 'foreignObject', + 'clipPath' + ]; + + const TAGS = [ + ...HTML_TAGS, + ...SVG_TAGS, + ]; + + // Sorting, then reversing makes sure longer attributes/elements like + // `font-weight` are matched fully instead of getting false positives on say `font` + + const MEDIA_FEATURES = [ + 'any-hover', + 'any-pointer', + 'aspect-ratio', + 'color', + 'color-gamut', + 'color-index', + 'device-aspect-ratio', + 'device-height', + 'device-width', + 'display-mode', + 'forced-colors', + 'grid', + 'height', + 'hover', + 'inverted-colors', + 'monochrome', + 'orientation', + 'overflow-block', + 'overflow-inline', + 'pointer', + 'prefers-color-scheme', + 'prefers-contrast', + 'prefers-reduced-motion', + 'prefers-reduced-transparency', + 'resolution', + 'scan', + 'scripting', + 'update', + 'width', + // TODO: find a better solution? + 'min-width', + 'max-width', + 'min-height', + 'max-height' + ].sort().reverse(); + + // https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes + const PSEUDO_CLASSES = [ + 'active', + 'any-link', + 'blank', + 'checked', + 'current', + 'default', + 'defined', + 'dir', // dir() + 'disabled', + 'drop', + 'empty', + 'enabled', + 'first', + 'first-child', + 'first-of-type', + 'fullscreen', + 'future', + 'focus', + 'focus-visible', + 'focus-within', + 'has', // has() + 'host', // host or host() + 'host-context', // host-context() + 'hover', + 'indeterminate', + 'in-range', + 'invalid', + 'is', // is() + 'lang', // lang() + 'last-child', + 'last-of-type', + 'left', + 'link', + 'local-link', + 'not', // not() + 'nth-child', // nth-child() + 'nth-col', // nth-col() + 'nth-last-child', // nth-last-child() + 'nth-last-col', // nth-last-col() + 'nth-last-of-type', //nth-last-of-type() + 'nth-of-type', //nth-of-type() + 'only-child', + 'only-of-type', + 'optional', + 'out-of-range', + 'past', + 'placeholder-shown', + 'read-only', + 'read-write', + 'required', + 'right', + 'root', + 'scope', + 'target', + 'target-within', + 'user-invalid', + 'valid', + 'visited', + 'where' // where() + ].sort().reverse(); + + // https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements + const PSEUDO_ELEMENTS = [ + 'after', + 'backdrop', + 'before', + 'cue', + 'cue-region', + 'first-letter', + 'first-line', + 'grammar-error', + 'marker', + 'part', + 'placeholder', + 'selection', + 'slotted', + 'spelling-error' + ].sort().reverse(); + + const ATTRIBUTES = [ + 'accent-color', + 'align-content', + 'align-items', + 'align-self', + 'alignment-baseline', + 'all', + 'anchor-name', + 'animation', + 'animation-composition', + 'animation-delay', + 'animation-direction', + 'animation-duration', + 'animation-fill-mode', + 'animation-iteration-count', + 'animation-name', + 'animation-play-state', + 'animation-range', + 'animation-range-end', + 'animation-range-start', + 'animation-timeline', + 'animation-timing-function', + 'appearance', + 'aspect-ratio', + 'backdrop-filter', + 'backface-visibility', + 'background', + 'background-attachment', + 'background-blend-mode', + 'background-clip', + 'background-color', + 'background-image', + 'background-origin', + 'background-position', + 'background-position-x', + 'background-position-y', + 'background-repeat', + 'background-size', + 'baseline-shift', + 'block-size', + 'border', + 'border-block', + 'border-block-color', + 'border-block-end', + 'border-block-end-color', + 'border-block-end-style', + 'border-block-end-width', + 'border-block-start', + 'border-block-start-color', + 'border-block-start-style', + 'border-block-start-width', + 'border-block-style', + 'border-block-width', + 'border-bottom', + 'border-bottom-color', + 'border-bottom-left-radius', + 'border-bottom-right-radius', + 'border-bottom-style', + 'border-bottom-width', + 'border-collapse', + 'border-color', + 'border-end-end-radius', + 'border-end-start-radius', + 'border-image', + 'border-image-outset', + 'border-image-repeat', + 'border-image-slice', + 'border-image-source', + 'border-image-width', + 'border-inline', + 'border-inline-color', + 'border-inline-end', + 'border-inline-end-color', + 'border-inline-end-style', + 'border-inline-end-width', + 'border-inline-start', + 'border-inline-start-color', + 'border-inline-start-style', + 'border-inline-start-width', + 'border-inline-style', + 'border-inline-width', + 'border-left', + 'border-left-color', + 'border-left-style', + 'border-left-width', + 'border-radius', + 'border-right', + 'border-right-color', + 'border-right-style', + 'border-right-width', + 'border-spacing', + 'border-start-end-radius', + 'border-start-start-radius', + 'border-style', + 'border-top', + 'border-top-color', + 'border-top-left-radius', + 'border-top-right-radius', + 'border-top-style', + 'border-top-width', + 'border-width', + 'bottom', + 'box-align', + 'box-decoration-break', + 'box-direction', + 'box-flex', + 'box-flex-group', + 'box-lines', + 'box-ordinal-group', + 'box-orient', + 'box-pack', + 'box-shadow', + 'box-sizing', + 'break-after', + 'break-before', + 'break-inside', + 'caption-side', + 'caret-color', + 'clear', + 'clip', + 'clip-path', + 'clip-rule', + 'color', + 'color-interpolation', + 'color-interpolation-filters', + 'color-profile', + 'color-rendering', + 'color-scheme', + 'column-count', + 'column-fill', + 'column-gap', + 'column-rule', + 'column-rule-color', + 'column-rule-style', + 'column-rule-width', + 'column-span', + 'column-width', + 'columns', + 'contain', + 'contain-intrinsic-block-size', + 'contain-intrinsic-height', + 'contain-intrinsic-inline-size', + 'contain-intrinsic-size', + 'contain-intrinsic-width', + 'container', + 'container-name', + 'container-type', + 'content', + 'content-visibility', + 'counter-increment', + 'counter-reset', + 'counter-set', + 'cue', + 'cue-after', + 'cue-before', + 'cursor', + 'cx', + 'cy', + 'direction', + 'display', + 'dominant-baseline', + 'empty-cells', + 'enable-background', + 'field-sizing', + 'fill', + 'fill-opacity', + 'fill-rule', + 'filter', + 'flex', + 'flex-basis', + 'flex-direction', + 'flex-flow', + 'flex-grow', + 'flex-shrink', + 'flex-wrap', + 'float', + 'flood-color', + 'flood-opacity', + 'flow', + 'font', + 'font-display', + 'font-family', + 'font-feature-settings', + 'font-kerning', + 'font-language-override', + 'font-optical-sizing', + 'font-palette', + 'font-size', + 'font-size-adjust', + 'font-smooth', + 'font-smoothing', + 'font-stretch', + 'font-style', + 'font-synthesis', + 'font-synthesis-position', + 'font-synthesis-small-caps', + 'font-synthesis-style', + 'font-synthesis-weight', + 'font-variant', + 'font-variant-alternates', + 'font-variant-caps', + 'font-variant-east-asian', + 'font-variant-emoji', + 'font-variant-ligatures', + 'font-variant-numeric', + 'font-variant-position', + 'font-variation-settings', + 'font-weight', + 'forced-color-adjust', + 'gap', + 'glyph-orientation-horizontal', + 'glyph-orientation-vertical', + 'grid', + 'grid-area', + 'grid-auto-columns', + 'grid-auto-flow', + 'grid-auto-rows', + 'grid-column', + 'grid-column-end', + 'grid-column-start', + 'grid-gap', + 'grid-row', + 'grid-row-end', + 'grid-row-start', + 'grid-template', + 'grid-template-areas', + 'grid-template-columns', + 'grid-template-rows', + 'hanging-punctuation', + 'height', + 'hyphenate-character', + 'hyphenate-limit-chars', + 'hyphens', + 'icon', + 'image-orientation', + 'image-rendering', + 'image-resolution', + 'ime-mode', + 'initial-letter', + 'initial-letter-align', + 'inline-size', + 'inset', + 'inset-area', + 'inset-block', + 'inset-block-end', + 'inset-block-start', + 'inset-inline', + 'inset-inline-end', + 'inset-inline-start', + 'isolation', + 'justify-content', + 'justify-items', + 'justify-self', + 'kerning', + 'left', + 'letter-spacing', + 'lighting-color', + 'line-break', + 'line-height', + 'line-height-step', + 'list-style', + 'list-style-image', + 'list-style-position', + 'list-style-type', + 'margin', + 'margin-block', + 'margin-block-end', + 'margin-block-start', + 'margin-bottom', + 'margin-inline', + 'margin-inline-end', + 'margin-inline-start', + 'margin-left', + 'margin-right', + 'margin-top', + 'margin-trim', + 'marker', + 'marker-end', + 'marker-mid', + 'marker-start', + 'marks', + 'mask', + 'mask-border', + 'mask-border-mode', + 'mask-border-outset', + 'mask-border-repeat', + 'mask-border-slice', + 'mask-border-source', + 'mask-border-width', + 'mask-clip', + 'mask-composite', + 'mask-image', + 'mask-mode', + 'mask-origin', + 'mask-position', + 'mask-repeat', + 'mask-size', + 'mask-type', + 'masonry-auto-flow', + 'math-depth', + 'math-shift', + 'math-style', + 'max-block-size', + 'max-height', + 'max-inline-size', + 'max-width', + 'min-block-size', + 'min-height', + 'min-inline-size', + 'min-width', + 'mix-blend-mode', + 'nav-down', + 'nav-index', + 'nav-left', + 'nav-right', + 'nav-up', + 'none', + 'normal', + 'object-fit', + 'object-position', + 'offset', + 'offset-anchor', + 'offset-distance', + 'offset-path', + 'offset-position', + 'offset-rotate', + 'opacity', + 'order', + 'orphans', + 'outline', + 'outline-color', + 'outline-offset', + 'outline-style', + 'outline-width', + 'overflow', + 'overflow-anchor', + 'overflow-block', + 'overflow-clip-margin', + 'overflow-inline', + 'overflow-wrap', + 'overflow-x', + 'overflow-y', + 'overlay', + 'overscroll-behavior', + 'overscroll-behavior-block', + 'overscroll-behavior-inline', + 'overscroll-behavior-x', + 'overscroll-behavior-y', + 'padding', + 'padding-block', + 'padding-block-end', + 'padding-block-start', + 'padding-bottom', + 'padding-inline', + 'padding-inline-end', + 'padding-inline-start', + 'padding-left', + 'padding-right', + 'padding-top', + 'page', + 'page-break-after', + 'page-break-before', + 'page-break-inside', + 'paint-order', + 'pause', + 'pause-after', + 'pause-before', + 'perspective', + 'perspective-origin', + 'place-content', + 'place-items', + 'place-self', + 'pointer-events', + 'position', + 'position-anchor', + 'position-visibility', + 'print-color-adjust', + 'quotes', + 'r', + 'resize', + 'rest', + 'rest-after', + 'rest-before', + 'right', + 'rotate', + 'row-gap', + 'ruby-align', + 'ruby-position', + 'scale', + 'scroll-behavior', + 'scroll-margin', + 'scroll-margin-block', + 'scroll-margin-block-end', + 'scroll-margin-block-start', + 'scroll-margin-bottom', + 'scroll-margin-inline', + 'scroll-margin-inline-end', + 'scroll-margin-inline-start', + 'scroll-margin-left', + 'scroll-margin-right', + 'scroll-margin-top', + 'scroll-padding', + 'scroll-padding-block', + 'scroll-padding-block-end', + 'scroll-padding-block-start', + 'scroll-padding-bottom', + 'scroll-padding-inline', + 'scroll-padding-inline-end', + 'scroll-padding-inline-start', + 'scroll-padding-left', + 'scroll-padding-right', + 'scroll-padding-top', + 'scroll-snap-align', + 'scroll-snap-stop', + 'scroll-snap-type', + 'scroll-timeline', + 'scroll-timeline-axis', + 'scroll-timeline-name', + 'scrollbar-color', + 'scrollbar-gutter', + 'scrollbar-width', + 'shape-image-threshold', + 'shape-margin', + 'shape-outside', + 'shape-rendering', + 'speak', + 'speak-as', + 'src', // @font-face + 'stop-color', + 'stop-opacity', + 'stroke', + 'stroke-dasharray', + 'stroke-dashoffset', + 'stroke-linecap', + 'stroke-linejoin', + 'stroke-miterlimit', + 'stroke-opacity', + 'stroke-width', + 'tab-size', + 'table-layout', + 'text-align', + 'text-align-all', + 'text-align-last', + 'text-anchor', + 'text-combine-upright', + 'text-decoration', + 'text-decoration-color', + 'text-decoration-line', + 'text-decoration-skip', + 'text-decoration-skip-ink', + 'text-decoration-style', + 'text-decoration-thickness', + 'text-emphasis', + 'text-emphasis-color', + 'text-emphasis-position', + 'text-emphasis-style', + 'text-indent', + 'text-justify', + 'text-orientation', + 'text-overflow', + 'text-rendering', + 'text-shadow', + 'text-size-adjust', + 'text-transform', + 'text-underline-offset', + 'text-underline-position', + 'text-wrap', + 'text-wrap-mode', + 'text-wrap-style', + 'timeline-scope', + 'top', + 'touch-action', + 'transform', + 'transform-box', + 'transform-origin', + 'transform-style', + 'transition', + 'transition-behavior', + 'transition-delay', + 'transition-duration', + 'transition-property', + 'transition-timing-function', + 'translate', + 'unicode-bidi', + 'user-modify', + 'user-select', + 'vector-effect', + 'vertical-align', + 'view-timeline', + 'view-timeline-axis', + 'view-timeline-inset', + 'view-timeline-name', + 'view-transition-name', + 'visibility', + 'voice-balance', + 'voice-duration', + 'voice-family', + 'voice-pitch', + 'voice-range', + 'voice-rate', + 'voice-stress', + 'voice-volume', + 'white-space', + 'white-space-collapse', + 'widows', + 'width', + 'will-change', + 'word-break', + 'word-spacing', + 'word-wrap', + 'writing-mode', + 'x', + 'y', + 'z-index', + 'zoom' + ].sort().reverse(); + + /* + Language: CSS + Category: common, css, web + Website: https://developer.mozilla.org/en-US/docs/Web/CSS + */ + + + /** @type LanguageFn */ + function css(hljs) { + const regex = hljs.regex; + const modes = MODES(hljs); + const VENDOR_PREFIX = { begin: /-(webkit|moz|ms|o)-(?=[a-z])/ }; + const AT_MODIFIERS = "and or not only"; + const AT_PROPERTY_RE = /@-?\w[\w]*(-\w+)*/; // @-webkit-keyframes + const IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*'; + const STRINGS = [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE + ]; + + return { + name: 'CSS', + case_insensitive: true, + illegal: /[=|'\$]/, + keywords: { keyframePosition: "from to" }, + classNameAliases: { + // for visual continuity with `tag {}` and because we + // don't have a great class for this? + keyframePosition: "selector-tag" }, + contains: [ + modes.BLOCK_COMMENT, + VENDOR_PREFIX, + // to recognize keyframe 40% etc which are outside the scope of our + // attribute value mode + modes.CSS_NUMBER_MODE, + { + className: 'selector-id', + begin: /#[A-Za-z0-9_-]+/, + relevance: 0 + }, + { + className: 'selector-class', + begin: '\\.' + IDENT_RE, + relevance: 0 + }, + modes.ATTRIBUTE_SELECTOR_MODE, + { + className: 'selector-pseudo', + variants: [ + { begin: ':(' + PSEUDO_CLASSES.join('|') + ')' }, + { begin: ':(:)?(' + PSEUDO_ELEMENTS.join('|') + ')' } + ] + }, + // we may actually need this (12/2020) + // { // pseudo-selector params + // begin: /\(/, + // end: /\)/, + // contains: [ hljs.CSS_NUMBER_MODE ] + // }, + modes.CSS_VARIABLE, + { + className: 'attribute', + begin: '\\b(' + ATTRIBUTES.join('|') + ')\\b' + }, + // attribute values + { + begin: /:/, + end: /[;}{]/, + contains: [ + modes.BLOCK_COMMENT, + modes.HEXCOLOR, + modes.IMPORTANT, + modes.CSS_NUMBER_MODE, + ...STRINGS, + // needed to highlight these as strings and to avoid issues with + // illegal characters that might be inside urls that would tigger the + // languages illegal stack + { + begin: /(url|data-uri)\(/, + end: /\)/, + relevance: 0, // from keywords + keywords: { built_in: "url data-uri" }, + contains: [ + ...STRINGS, + { + className: "string", + // any character other than `)` as in `url()` will be the start + // of a string, which ends with `)` (from the parent mode) + begin: /[^)]/, + endsWithParent: true, + excludeEnd: true + } + ] + }, + modes.FUNCTION_DISPATCH + ] + }, + { + begin: regex.lookahead(/@/), + end: '[{;]', + relevance: 0, + illegal: /:/, // break on Less variables @var: ... + contains: [ + { + className: 'keyword', + begin: AT_PROPERTY_RE + }, + { + begin: /\s/, + endsWithParent: true, + excludeEnd: true, + relevance: 0, + keywords: { + $pattern: /[a-z-]+/, + keyword: AT_MODIFIERS, + attribute: MEDIA_FEATURES.join(" ") + }, + contains: [ + { + begin: /[a-z-]+(?=:)/, + className: "attribute" + }, + ...STRINGS, + modes.CSS_NUMBER_MODE + ] + } + ] + }, + { + className: 'selector-tag', + begin: '\\b(' + TAGS.join('|') + ')\\b' + } + ] + }; + } + + return css; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/css.min.js b/backend/static/highlight(1)/es/languages/css.min.js new file mode 100644 index 0000000..0b96574 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/css.min.js @@ -0,0 +1,31 @@ +/*! `css` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict" +;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video","defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],i=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),t=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),r=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse() +;return n=>{const a=n.regex,l=(e=>({IMPORTANT:{scope:"meta",begin:"!important"}, +BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number", +begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{ +className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{ +scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", +contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ +scope:"number", +begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", +relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/} +}))(n),s=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE];return{name:"CSS", +case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"}, +classNameAliases:{keyframePosition:"selector-tag"},contains:[l.BLOCK_COMMENT,{ +begin:/-(webkit|moz|ms|o)-(?=[a-z])/},l.CSS_NUMBER_MODE,{ +className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{ +className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 +},l.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ +begin:":("+t.join("|")+")"},{begin:":(:)?("+o.join("|")+")"}]},l.CSS_VARIABLE,{ +className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{begin:/:/,end:/[;}{]/, +contains:[l.BLOCK_COMMENT,l.HEXCOLOR,l.IMPORTANT,l.CSS_NUMBER_MODE,...s,{ +begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" +},contains:[...s,{className:"string",begin:/[^)]/,endsWithParent:!0, +excludeEnd:!0}]},l.FUNCTION_DISPATCH]},{begin:a.lookahead(/@/),end:"[{;]", +relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/ +},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{ +$pattern:/[a-z-]+/,keyword:"and or not only",attribute:i.join(" ")},contains:[{ +begin:/[a-z-]+(?=:)/,className:"attribute"},...s,l.CSS_NUMBER_MODE]}]},{ +className:"selector-tag",begin:"\\b("+e.join("|")+")\\b"}]}}})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/diff.js b/backend/static/highlight(1)/es/languages/diff.js new file mode 100644 index 0000000..7bb7e8c --- /dev/null +++ b/backend/static/highlight(1)/es/languages/diff.js @@ -0,0 +1,70 @@ +/*! `diff` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: Diff + Description: Unified and context diff + Author: Vasily Polovnyov + Website: https://www.gnu.org/software/diffutils/ + Category: common + */ + + /** @type LanguageFn */ + function diff(hljs) { + const regex = hljs.regex; + return { + name: 'Diff', + aliases: [ 'patch' ], + contains: [ + { + className: 'meta', + relevance: 10, + match: regex.either( + /^@@ +-\d+,\d+ +\+\d+,\d+ +@@/, + /^\*\*\* +\d+,\d+ +\*\*\*\*$/, + /^--- +\d+,\d+ +----$/ + ) + }, + { + className: 'comment', + variants: [ + { + begin: regex.either( + /Index: /, + /^index/, + /={3,}/, + /^-{3}/, + /^\*{3} /, + /^\+{3}/, + /^diff --git/ + ), + end: /$/ + }, + { match: /^\*{15}$/ } + ] + }, + { + className: 'addition', + begin: /^\+/, + end: /$/ + }, + { + className: 'deletion', + begin: /^-/, + end: /$/ + }, + { + className: 'addition', + begin: /^!/, + end: /$/ + } + ] + }; + } + + return diff; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/diff.min.js b/backend/static/highlight(1)/es/languages/diff.min.js new file mode 100644 index 0000000..17bea9a --- /dev/null +++ b/backend/static/highlight(1)/es/languages/diff.min.js @@ -0,0 +1,9 @@ +/*! `diff` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{const a=e.regex;return{ +name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10, +match:a.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/) +},{className:"comment",variants:[{ +begin:a.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/), +end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{ +className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, +end:/$/}]}}})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/go.js b/backend/static/highlight(1)/es/languages/go.js new file mode 100644 index 0000000..0b22e13 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/go.js @@ -0,0 +1,164 @@ +/*! `go` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: Go + Author: Stephan Kountso aka StepLg + Contributors: Evgeny Stepanischev + Description: Google go language (golang). For info about language + Website: http://golang.org/ + Category: common, system + */ + + function go(hljs) { + const LITERALS = [ + "true", + "false", + "iota", + "nil" + ]; + const BUILT_INS = [ + "append", + "cap", + "close", + "complex", + "copy", + "imag", + "len", + "make", + "new", + "panic", + "print", + "println", + "real", + "recover", + "delete" + ]; + const TYPES = [ + "bool", + "byte", + "complex64", + "complex128", + "error", + "float32", + "float64", + "int8", + "int16", + "int32", + "int64", + "string", + "uint8", + "uint16", + "uint32", + "uint64", + "int", + "uint", + "uintptr", + "rune" + ]; + const KWS = [ + "break", + "case", + "chan", + "const", + "continue", + "default", + "defer", + "else", + "fallthrough", + "for", + "func", + "go", + "goto", + "if", + "import", + "interface", + "map", + "package", + "range", + "return", + "select", + "struct", + "switch", + "type", + "var", + ]; + const KEYWORDS = { + keyword: KWS, + type: TYPES, + literal: LITERALS, + built_in: BUILT_INS + }; + return { + name: 'Go', + aliases: [ 'golang' ], + keywords: KEYWORDS, + illegal: '{"use strict";return e=>{const a={ +keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"], +type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"], +literal:["true","false","iota","nil"], +built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"] +};return{name:"Go",aliases:["golang"],keywords:a,illegal:"{"use strict";return e=>{const a=e.regex;return{ +name:"GraphQL",aliases:["gql"],case_insensitive:!0,disableAutodetect:!1, +keywords:{ +keyword:["query","mutation","subscription","type","input","schema","directive","interface","union","scalar","fragment","enum","on"], +literal:["true","false","null"]}, +contains:[e.HASH_COMMENT_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,{ +scope:"punctuation",match:/[.]{3}/,relevance:0},{scope:"punctuation", +begin:/[\!\(\)\:\=\[\]\{\|\}]{1}/,relevance:0},{scope:"variable",begin:/\$/, +end:/\W/,excludeEnd:!0,relevance:0},{scope:"meta",match:/@\w+/,excludeEnd:!0},{ +scope:"symbol",begin:a.concat(/[_A-Za-z][_0-9A-Za-z]*/,a.lookahead(/\s*:/)), +relevance:0}],illegal:[/[;<']/,/BEGIN/]}}})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/ini.js b/backend/static/highlight(1)/es/languages/ini.js new file mode 100644 index 0000000..ccfc004 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/ini.js @@ -0,0 +1,129 @@ +/*! `ini` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: TOML, also INI + Description: TOML aims to be a minimal configuration file format that's easy to read due to obvious semantics. + Contributors: Guillaume Gomez + Category: common, config + Website: https://github.com/toml-lang/toml + */ + + function ini(hljs) { + const regex = hljs.regex; + const NUMBERS = { + className: 'number', + relevance: 0, + variants: [ + { begin: /([+-]+)?[\d]+_[\d_]+/ }, + { begin: hljs.NUMBER_RE } + ] + }; + const COMMENTS = hljs.COMMENT(); + COMMENTS.variants = [ + { + begin: /;/, + end: /$/ + }, + { + begin: /#/, + end: /$/ + } + ]; + const VARIABLES = { + className: 'variable', + variants: [ + { begin: /\$[\w\d"][\w\d_]*/ }, + { begin: /\$\{(.*?)\}/ } + ] + }; + const LITERALS = { + className: 'literal', + begin: /\bon|off|true|false|yes|no\b/ + }; + const STRINGS = { + className: "string", + contains: [ hljs.BACKSLASH_ESCAPE ], + variants: [ + { + begin: "'''", + end: "'''", + relevance: 10 + }, + { + begin: '"""', + end: '"""', + relevance: 10 + }, + { + begin: '"', + end: '"' + }, + { + begin: "'", + end: "'" + } + ] + }; + const ARRAY = { + begin: /\[/, + end: /\]/, + contains: [ + COMMENTS, + LITERALS, + VARIABLES, + STRINGS, + NUMBERS, + 'self' + ], + relevance: 0 + }; + + const BARE_KEY = /[A-Za-z0-9_-]+/; + const QUOTED_KEY_DOUBLE_QUOTE = /"(\\"|[^"])*"/; + const QUOTED_KEY_SINGLE_QUOTE = /'[^']*'/; + const ANY_KEY = regex.either( + BARE_KEY, QUOTED_KEY_DOUBLE_QUOTE, QUOTED_KEY_SINGLE_QUOTE + ); + const DOTTED_KEY = regex.concat( + ANY_KEY, '(\\s*\\.\\s*', ANY_KEY, ')*', + regex.lookahead(/\s*=\s*[^#\s]/) + ); + + return { + name: 'TOML, also INI', + aliases: [ 'toml' ], + case_insensitive: true, + illegal: /\S/, + contains: [ + COMMENTS, + { + className: 'section', + begin: /\[+/, + end: /\]+/ + }, + { + begin: DOTTED_KEY, + className: 'attr', + starts: { + end: /$/, + contains: [ + COMMENTS, + ARRAY, + LITERALS, + VARIABLES, + STRINGS, + NUMBERS + ] + } + } + ] + }; + } + + return ini; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/ini.min.js b/backend/static/highlight(1)/es/languages/ini.min.js new file mode 100644 index 0000000..cdd6c9e --- /dev/null +++ b/backend/static/highlight(1)/es/languages/ini.min.js @@ -0,0 +1,16 @@ +/*! `ini` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{const n=e.regex,a={ +className:"number",relevance:0,variants:[{begin:/([+-]+)?[\d]+_[\d_]+/},{ +begin:e.NUMBER_RE}]},s=e.COMMENT();s.variants=[{begin:/;/,end:/$/},{begin:/#/, +end:/$/}];const i={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{ +begin:/\$\{(.*?)\}/}]},r={className:"literal", +begin:/\bon|off|true|false|yes|no\b/},t={className:"string", +contains:[e.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{ +begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}] +},l={begin:/\[/,end:/\]/,contains:[s,r,i,t,a,"self"],relevance:0 +},c=n.either(/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/);return{ +name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/, +contains:[s,{className:"section",begin:/\[+/,end:/\]+/},{ +begin:n.concat(c,"(\\s*\\.\\s*",c,")*",n.lookahead(/\s*=\s*[^#\s]/)), +className:"attr",starts:{end:/$/,contains:[s,l,r,i,t,a]}}]}}})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/java.js b/backend/static/highlight(1)/es/languages/java.js new file mode 100644 index 0000000..7bdfc2f --- /dev/null +++ b/backend/static/highlight(1)/es/languages/java.js @@ -0,0 +1,299 @@ +/*! `java` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + // https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10 + var decimalDigits = '[0-9](_*[0-9])*'; + var frac = `\\.(${decimalDigits})`; + var hexDigits = '[0-9a-fA-F](_*[0-9a-fA-F])*'; + var NUMERIC = { + className: 'number', + variants: [ + // DecimalFloatingPointLiteral + // including ExponentPart + { begin: `(\\b(${decimalDigits})((${frac})|\\.)?|(${frac}))` + + `[eE][+-]?(${decimalDigits})[fFdD]?\\b` }, + // excluding ExponentPart + { begin: `\\b(${decimalDigits})((${frac})[fFdD]?\\b|\\.([fFdD]\\b)?)` }, + { begin: `(${frac})[fFdD]?\\b` }, + { begin: `\\b(${decimalDigits})[fFdD]\\b` }, + + // HexadecimalFloatingPointLiteral + { begin: `\\b0[xX]((${hexDigits})\\.?|(${hexDigits})?\\.(${hexDigits}))` + + `[pP][+-]?(${decimalDigits})[fFdD]?\\b` }, + + // DecimalIntegerLiteral + { begin: '\\b(0|[1-9](_*[0-9])*)[lL]?\\b' }, + + // HexIntegerLiteral + { begin: `\\b0[xX](${hexDigits})[lL]?\\b` }, + + // OctalIntegerLiteral + { begin: '\\b0(_*[0-7])*[lL]?\\b' }, + + // BinaryIntegerLiteral + { begin: '\\b0[bB][01](_*[01])*[lL]?\\b' }, + ], + relevance: 0 + }; + + /* + Language: Java + Author: Vsevolod Solovyov + Category: common, enterprise + Website: https://www.java.com/ + */ + + + /** + * Allows recursive regex expressions to a given depth + * + * ie: recurRegex("(abc~~~)", /~~~/g, 2) becomes: + * (abc(abc(abc))) + * + * @param {string} re + * @param {RegExp} substitution (should be a g mode regex) + * @param {number} depth + * @returns {string}`` + */ + function recurRegex(re, substitution, depth) { + if (depth === -1) return ""; + + return re.replace(substitution, _ => { + return recurRegex(re, substitution, depth - 1); + }); + } + + /** @type LanguageFn */ + function java(hljs) { + const regex = hljs.regex; + const JAVA_IDENT_RE = '[\u00C0-\u02B8a-zA-Z_$][\u00C0-\u02B8a-zA-Z_$0-9]*'; + const GENERIC_IDENT_RE = JAVA_IDENT_RE + + recurRegex('(?:<' + JAVA_IDENT_RE + '~~~(?:\\s*,\\s*' + JAVA_IDENT_RE + '~~~)*>)?', /~~~/g, 2); + const MAIN_KEYWORDS = [ + 'synchronized', + 'abstract', + 'private', + 'var', + 'static', + 'if', + 'const ', + 'for', + 'while', + 'strictfp', + 'finally', + 'protected', + 'import', + 'native', + 'final', + 'void', + 'enum', + 'else', + 'break', + 'transient', + 'catch', + 'instanceof', + 'volatile', + 'case', + 'assert', + 'package', + 'default', + 'public', + 'try', + 'switch', + 'continue', + 'throws', + 'protected', + 'public', + 'private', + 'module', + 'requires', + 'exports', + 'do', + 'sealed', + 'yield', + 'permits', + 'goto', + 'when' + ]; + + const BUILT_INS = [ + 'super', + 'this' + ]; + + const LITERALS = [ + 'false', + 'true', + 'null' + ]; + + const TYPES = [ + 'char', + 'boolean', + 'long', + 'float', + 'int', + 'byte', + 'short', + 'double' + ]; + + const KEYWORDS = { + keyword: MAIN_KEYWORDS, + literal: LITERALS, + type: TYPES, + built_in: BUILT_INS + }; + + const ANNOTATION = { + className: 'meta', + begin: '@' + JAVA_IDENT_RE, + contains: [ + { + begin: /\(/, + end: /\)/, + contains: [ "self" ] // allow nested () inside our annotation + } + ] + }; + const PARAMS = { + className: 'params', + begin: /\(/, + end: /\)/, + keywords: KEYWORDS, + relevance: 0, + contains: [ hljs.C_BLOCK_COMMENT_MODE ], + endsParent: true + }; + + return { + name: 'Java', + aliases: [ 'jsp' ], + keywords: KEYWORDS, + illegal: /<\/|#/, + contains: [ + hljs.COMMENT( + '/\\*\\*', + '\\*/', + { + relevance: 0, + contains: [ + { + // eat up @'s in emails to prevent them to be recognized as doctags + begin: /\w+@/, + relevance: 0 + }, + { + className: 'doctag', + begin: '@[A-Za-z]+' + } + ] + } + ), + // relevance boost + { + begin: /import java\.[a-z]+\./, + keywords: "import", + relevance: 2 + }, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + { + begin: /"""/, + end: /"""/, + className: "string", + contains: [ hljs.BACKSLASH_ESCAPE ] + }, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + { + match: [ + /\b(?:class|interface|enum|extends|implements|new)/, + /\s+/, + JAVA_IDENT_RE + ], + className: { + 1: "keyword", + 3: "title.class" + } + }, + { + // Exceptions for hyphenated keywords + match: /non-sealed/, + scope: "keyword" + }, + { + begin: [ + regex.concat(/(?!else)/, JAVA_IDENT_RE), + /\s+/, + JAVA_IDENT_RE, + /\s+/, + /=(?!=)/ + ], + className: { + 1: "type", + 3: "variable", + 5: "operator" + } + }, + { + begin: [ + /record/, + /\s+/, + JAVA_IDENT_RE + ], + className: { + 1: "keyword", + 3: "title.class" + }, + contains: [ + PARAMS, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + { + // Expression keywords prevent 'keyword Name(...)' from being + // recognized as a function definition + beginKeywords: 'new throw return else', + relevance: 0 + }, + { + begin: [ + '(?:' + GENERIC_IDENT_RE + '\\s+)', + hljs.UNDERSCORE_IDENT_RE, + /\s*(?=\()/ + ], + className: { 2: "title.function" }, + keywords: KEYWORDS, + contains: [ + { + className: 'params', + begin: /\(/, + end: /\)/, + keywords: KEYWORDS, + relevance: 0, + contains: [ + ANNOTATION, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + NUMERIC, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + NUMERIC, + ANNOTATION + ] + }; + } + + return java; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/java.min.js b/backend/static/highlight(1)/es/languages/java.min.js new file mode 100644 index 0000000..47f8fb3 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/java.min.js @@ -0,0 +1,38 @@ +/*! `java` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict" +;var e="[0-9](_*[0-9])*",a=`\\.(${e})`,n="[0-9a-fA-F](_*[0-9a-fA-F])*",s={ +className:"number",variants:[{ +begin:`(\\b(${e})((${a})|\\.)?|(${a}))[eE][+-]?(${e})[fFdD]?\\b`},{ +begin:`\\b(${e})((${a})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{begin:`(${a})[fFdD]?\\b` +},{begin:`\\b(${e})[fFdD]\\b`},{ +begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?(${e})[fFdD]?\\b`},{ +begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};function t(e,a,n){return-1===n?"":e.replace(a,(s=>t(e,a,n-1)))} +return e=>{ +const a=e.regex,n="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",r=n+t("(?:<"+n+"~~~(?:\\s*,\\s*"+n+"~~~)*>)?",/~~~/g,2),i={ +keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits","goto","when"], +literal:["false","true","null"], +type:["char","boolean","long","float","int","byte","short","double"], +built_in:["super","this"]},l={className:"meta",begin:"@"+n,contains:[{ +begin:/\(/,end:/\)/,contains:["self"]}]},c={className:"params",begin:/\(/, +end:/\)/,keywords:i,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0} +;return{name:"Java",aliases:["jsp"],keywords:i,illegal:/<\/|#/, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, +relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ +begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/, +className:"string",contains:[e.BACKSLASH_ESCAPE] +},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ +match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,n],className:{ +1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{ +begin:[a.concat(/(?!else)/,n),/\s+/,n,/\s+/,/=(?!=)/],className:{1:"type", +3:"variable",5:"operator"}},{begin:[/record/,/\s+/,n],className:{1:"keyword", +3:"title.class"},contains:[c,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"new throw return else",relevance:0},{ +begin:["(?:"+r+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{ +2:"title.function"},keywords:i,contains:[{className:"params",begin:/\(/, +end:/\)/,keywords:i,relevance:0, +contains:[l,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,s,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},s,l]}}})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/javascript.js b/backend/static/highlight(1)/es/languages/javascript.js new file mode 100644 index 0000000..cde5d69 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/javascript.js @@ -0,0 +1,777 @@ +/*! `javascript` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*'; + const KEYWORDS = [ + "as", // for exports + "in", + "of", + "if", + "for", + "while", + "finally", + "var", + "new", + "function", + "do", + "return", + "void", + "else", + "break", + "catch", + "instanceof", + "with", + "throw", + "case", + "default", + "try", + "switch", + "continue", + "typeof", + "delete", + "let", + "yield", + "const", + "class", + // JS handles these with a special rule + // "get", + // "set", + "debugger", + "async", + "await", + "static", + "import", + "from", + "export", + "extends", + // It's reached stage 3, which is "recommended for implementation": + "using" + ]; + const LITERALS = [ + "true", + "false", + "null", + "undefined", + "NaN", + "Infinity" + ]; + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects + const TYPES = [ + // Fundamental objects + "Object", + "Function", + "Boolean", + "Symbol", + // numbers and dates + "Math", + "Date", + "Number", + "BigInt", + // text + "String", + "RegExp", + // Indexed collections + "Array", + "Float32Array", + "Float64Array", + "Int8Array", + "Uint8Array", + "Uint8ClampedArray", + "Int16Array", + "Int32Array", + "Uint16Array", + "Uint32Array", + "BigInt64Array", + "BigUint64Array", + // Keyed collections + "Set", + "Map", + "WeakSet", + "WeakMap", + // Structured data + "ArrayBuffer", + "SharedArrayBuffer", + "Atomics", + "DataView", + "JSON", + // Control abstraction objects + "Promise", + "Generator", + "GeneratorFunction", + "AsyncFunction", + // Reflection + "Reflect", + "Proxy", + // Internationalization + "Intl", + // WebAssembly + "WebAssembly" + ]; + + const ERROR_TYPES = [ + "Error", + "EvalError", + "InternalError", + "RangeError", + "ReferenceError", + "SyntaxError", + "TypeError", + "URIError" + ]; + + const BUILT_IN_GLOBALS = [ + "setInterval", + "setTimeout", + "clearInterval", + "clearTimeout", + + "require", + "exports", + + "eval", + "isFinite", + "isNaN", + "parseFloat", + "parseInt", + "decodeURI", + "decodeURIComponent", + "encodeURI", + "encodeURIComponent", + "escape", + "unescape" + ]; + + const BUILT_IN_VARIABLES = [ + "arguments", + "this", + "super", + "console", + "window", + "document", + "localStorage", + "sessionStorage", + "module", + "global" // Node.js + ]; + + const BUILT_INS = [].concat( + BUILT_IN_GLOBALS, + TYPES, + ERROR_TYPES + ); + + /* + Language: JavaScript + Description: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions. + Category: common, scripting, web + Website: https://developer.mozilla.org/en-US/docs/Web/JavaScript + */ + + + /** @type LanguageFn */ + function javascript(hljs) { + const regex = hljs.regex; + /** + * Takes a string like " { + const tag = "', + end: '' + }; + // to avoid some special cases inside isTrulyOpeningTag + const XML_SELF_CLOSING = /<[A-Za-z0-9\\._:-]+\s*\/>/; + const XML_TAG = { + begin: /<[A-Za-z0-9\\._:-]+/, + end: /\/[A-Za-z0-9\\._:-]+>|\/>/, + /** + * @param {RegExpMatchArray} match + * @param {CallbackResponse} response + */ + isTrulyOpeningTag: (match, response) => { + const afterMatchIndex = match[0].length + match.index; + const nextChar = match.input[afterMatchIndex]; + if ( + // HTML should not include another raw `<` inside a tag + // nested type? + // `>`, etc. + nextChar === "<" || + // the , gives away that this is not HTML + // `` + nextChar === "," + ) { + response.ignoreMatch(); + return; + } + + // `` + // Quite possibly a tag, lets look for a matching closing tag... + if (nextChar === ">") { + // if we cannot find a matching closing tag, then we + // will ignore it + if (!hasClosingTag(match, { after: afterMatchIndex })) { + response.ignoreMatch(); + } + } + + // `` (self-closing) + // handled by simpleSelfClosing rule + + let m; + const afterMatch = match.input.substring(afterMatchIndex); + + // some more template typing stuff + // (key?: string) => Modify< + if ((m = afterMatch.match(/^\s*=/))) { + response.ignoreMatch(); + return; + } + + // `` + // technically this could be HTML, but it smells like a type + // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276 + if ((m = afterMatch.match(/^\s+extends\s+/))) { + if (m.index === 0) { + response.ignoreMatch(); + // eslint-disable-next-line no-useless-return + return; + } + } + } + }; + const KEYWORDS$1 = { + $pattern: IDENT_RE, + keyword: KEYWORDS, + literal: LITERALS, + built_in: BUILT_INS, + "variable.language": BUILT_IN_VARIABLES + }; + + // https://tc39.es/ecma262/#sec-literals-numeric-literals + const decimalDigits = '[0-9](_?[0-9])*'; + const frac = `\\.(${decimalDigits})`; + // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral + // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals + const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`; + const NUMBER = { + className: 'number', + variants: [ + // DecimalLiteral + { begin: `(\\b(${decimalInteger})((${frac})|\\.)?|(${frac}))` + + `[eE][+-]?(${decimalDigits})\\b` }, + { begin: `\\b(${decimalInteger})\\b((${frac})\\b|\\.)?|(${frac})\\b` }, + + // DecimalBigIntegerLiteral + { begin: `\\b(0|[1-9](_?[0-9])*)n\\b` }, + + // NonDecimalIntegerLiteral + { begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b" }, + { begin: "\\b0[bB][0-1](_?[0-1])*n?\\b" }, + { begin: "\\b0[oO][0-7](_?[0-7])*n?\\b" }, + + // LegacyOctalIntegerLiteral (does not include underscore separators) + // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals + { begin: "\\b0[0-7]+n?\\b" }, + ], + relevance: 0 + }; + + const SUBST = { + className: 'subst', + begin: '\\$\\{', + end: '\\}', + keywords: KEYWORDS$1, + contains: [] // defined later + }; + const HTML_TEMPLATE = { + begin: '\.?html`', + end: '', + starts: { + end: '`', + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + subLanguage: 'xml' + } + }; + const CSS_TEMPLATE = { + begin: '\.?css`', + end: '', + starts: { + end: '`', + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + subLanguage: 'css' + } + }; + const GRAPHQL_TEMPLATE = { + begin: '\.?gql`', + end: '', + starts: { + end: '`', + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + subLanguage: 'graphql' + } + }; + const TEMPLATE_STRING = { + className: 'string', + begin: '`', + end: '`', + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ] + }; + const JSDOC_COMMENT = hljs.COMMENT( + /\/\*\*(?!\/)/, + '\\*/', + { + relevance: 0, + contains: [ + { + begin: '(?=@[A-Za-z]+)', + relevance: 0, + contains: [ + { + className: 'doctag', + begin: '@[A-Za-z]+' + }, + { + className: 'type', + begin: '\\{', + end: '\\}', + excludeEnd: true, + excludeBegin: true, + relevance: 0 + }, + { + className: 'variable', + begin: IDENT_RE$1 + '(?=\\s*(-)|$)', + endsParent: true, + relevance: 0 + }, + // eat spaces (not newlines) so we can find + // types or variables + { + begin: /(?=[^\n])\s/, + relevance: 0 + } + ] + } + ] + } + ); + const COMMENT = { + className: "comment", + variants: [ + JSDOC_COMMENT, + hljs.C_BLOCK_COMMENT_MODE, + hljs.C_LINE_COMMENT_MODE + ] + }; + const SUBST_INTERNALS = [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + HTML_TEMPLATE, + CSS_TEMPLATE, + GRAPHQL_TEMPLATE, + TEMPLATE_STRING, + // Skip numbers when they are part of a variable name + { match: /\$\d+/ }, + NUMBER, + // This is intentional: + // See https://github.com/highlightjs/highlight.js/issues/3288 + // hljs.REGEXP_MODE + ]; + SUBST.contains = SUBST_INTERNALS + .concat({ + // we need to pair up {} inside our subst to prevent + // it from ending too early by matching another } + begin: /\{/, + end: /\}/, + keywords: KEYWORDS$1, + contains: [ + "self" + ].concat(SUBST_INTERNALS) + }); + const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains); + const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([ + // eat recursive parens in sub expressions + { + begin: /(\s*)\(/, + end: /\)/, + keywords: KEYWORDS$1, + contains: ["self"].concat(SUBST_AND_COMMENTS) + } + ]); + const PARAMS = { + className: 'params', + // convert this to negative lookbehind in v12 + begin: /(\s*)\(/, // to match the parms with + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS$1, + contains: PARAMS_CONTAINS + }; + + // ES6 classes + const CLASS_OR_EXTENDS = { + variants: [ + // class Car extends vehicle + { + match: [ + /class/, + /\s+/, + IDENT_RE$1, + /\s+/, + /extends/, + /\s+/, + regex.concat(IDENT_RE$1, "(", regex.concat(/\./, IDENT_RE$1), ")*") + ], + scope: { + 1: "keyword", + 3: "title.class", + 5: "keyword", + 7: "title.class.inherited" + } + }, + // class Car + { + match: [ + /class/, + /\s+/, + IDENT_RE$1 + ], + scope: { + 1: "keyword", + 3: "title.class" + } + }, + + ] + }; + + const CLASS_REFERENCE = { + relevance: 0, + match: + regex.either( + // Hard coded exceptions + /\bJSON/, + // Float32Array, OutT + /\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/, + // CSSFactory, CSSFactoryT + /\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/, + // FPs, FPsT + /\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/, + // P + // single letters are not highlighted + // BLAH + // this will be flagged as a UPPER_CASE_CONSTANT instead + ), + className: "title.class", + keywords: { + _: [ + // se we still get relevance credit for JS library classes + ...TYPES, + ...ERROR_TYPES + ] + } + }; + + const USE_STRICT = { + label: "use_strict", + className: 'meta', + relevance: 10, + begin: /^\s*['"]use (strict|asm)['"]/ + }; + + const FUNCTION_DEFINITION = { + variants: [ + { + match: [ + /function/, + /\s+/, + IDENT_RE$1, + /(?=\s*\()/ + ] + }, + // anonymous function + { + match: [ + /function/, + /\s*(?=\()/ + ] + } + ], + className: { + 1: "keyword", + 3: "title.function" + }, + label: "func.def", + contains: [ PARAMS ], + illegal: /%/ + }; + + const UPPER_CASE_CONSTANT = { + relevance: 0, + match: /\b[A-Z][A-Z_0-9]+\b/, + className: "variable.constant" + }; + + function noneOf(list) { + return regex.concat("(?!", list.join("|"), ")"); + } + + const FUNCTION_CALL = { + match: regex.concat( + /\b/, + noneOf([ + ...BUILT_IN_GLOBALS, + "super", + "import" + ].map(x => `${x}\\s*\\(`)), + IDENT_RE$1, regex.lookahead(/\s*\(/)), + className: "title.function", + relevance: 0 + }; + + const PROPERTY_ACCESS = { + begin: regex.concat(/\./, regex.lookahead( + regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/) + )), + end: IDENT_RE$1, + excludeBegin: true, + keywords: "prototype", + className: "property", + relevance: 0 + }; + + const GETTER_OR_SETTER = { + match: [ + /get|set/, + /\s+/, + IDENT_RE$1, + /(?=\()/ + ], + className: { + 1: "keyword", + 3: "title.function" + }, + contains: [ + { // eat to avoid empty params + begin: /\(\)/ + }, + PARAMS + ] + }; + + const FUNC_LEAD_IN_RE = '(\\(' + + '[^()]*(\\(' + + '[^()]*(\\(' + + '[^()]*' + + '\\)[^()]*)*' + + '\\)[^()]*)*' + + '\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\s*=>'; + + const FUNCTION_VARIABLE = { + match: [ + /const|var|let/, /\s+/, + IDENT_RE$1, /\s*/, + /=\s*/, + /(async\s*)?/, // async is optional + regex.lookahead(FUNC_LEAD_IN_RE) + ], + keywords: "async", + className: { + 1: "keyword", + 3: "title.function" + }, + contains: [ + PARAMS + ] + }; + + return { + name: 'JavaScript', + aliases: ['js', 'jsx', 'mjs', 'cjs'], + keywords: KEYWORDS$1, + // this will be extended by TypeScript + exports: { PARAMS_CONTAINS, CLASS_REFERENCE }, + illegal: /#(?![$_A-z])/, + contains: [ + hljs.SHEBANG({ + label: "shebang", + binary: "node", + relevance: 5 + }), + USE_STRICT, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + HTML_TEMPLATE, + CSS_TEMPLATE, + GRAPHQL_TEMPLATE, + TEMPLATE_STRING, + COMMENT, + // Skip numbers when they are part of a variable name + { match: /\$\d+/ }, + NUMBER, + CLASS_REFERENCE, + { + scope: 'attr', + match: IDENT_RE$1 + regex.lookahead(':'), + relevance: 0 + }, + FUNCTION_VARIABLE, + { // "value" container + begin: '(' + hljs.RE_STARTERS_RE + '|\\b(case|return|throw)\\b)\\s*', + keywords: 'return throw case', + relevance: 0, + contains: [ + COMMENT, + hljs.REGEXP_MODE, + { + className: 'function', + // we have to count the parens to make sure we actually have the + // correct bounding ( ) before the =>. There could be any number of + // sub-expressions inside also surrounded by parens. + begin: FUNC_LEAD_IN_RE, + returnBegin: true, + end: '\\s*=>', + contains: [ + { + className: 'params', + variants: [ + { + begin: hljs.UNDERSCORE_IDENT_RE, + relevance: 0 + }, + { + className: null, + begin: /\(\s*\)/, + skip: true + }, + { + begin: /(\s*)\(/, + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS$1, + contains: PARAMS_CONTAINS + } + ] + } + ] + }, + { // could be a comma delimited list of params to a function call + begin: /,/, + relevance: 0 + }, + { + match: /\s+/, + relevance: 0 + }, + { // JSX + variants: [ + { begin: FRAGMENT.begin, end: FRAGMENT.end }, + { match: XML_SELF_CLOSING }, + { + begin: XML_TAG.begin, + // we carefully check the opening tag to see if it truly + // is a tag and not a false positive + 'on:begin': XML_TAG.isTrulyOpeningTag, + end: XML_TAG.end + } + ], + subLanguage: 'xml', + contains: [ + { + begin: XML_TAG.begin, + end: XML_TAG.end, + skip: true, + contains: ['self'] + } + ] + } + ], + }, + FUNCTION_DEFINITION, + { + // prevent this from getting swallowed up by function + // since they appear "function like" + beginKeywords: "while if switch catch for" + }, + { + // we have to count the parens to make sure we actually have the correct + // bounding ( ). There could be any number of sub-expressions inside + // also surrounded by parens. + begin: '\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE + + '\\(' + // first parens + '[^()]*(\\(' + + '[^()]*(\\(' + + '[^()]*' + + '\\)[^()]*)*' + + '\\)[^()]*)*' + + '\\)\\s*\\{', // end parens + returnBegin:true, + label: "func.def", + contains: [ + PARAMS, + hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: "title.function" }) + ] + }, + // catch ... so it won't trigger the property rule below + { + match: /\.\.\./, + relevance: 0 + }, + PROPERTY_ACCESS, + // hack: prevents detection of keywords in some circumstances + // .keyword() + // $keyword = x + { + match: '\\$' + IDENT_RE$1, + relevance: 0 + }, + { + match: [ /\bconstructor(?=\s*\()/ ], + className: { 1: "title.function" }, + contains: [ PARAMS ] + }, + FUNCTION_CALL, + UPPER_CASE_CONSTANT, + CLASS_OR_EXTENDS, + GETTER_OR_SETTER, + { + match: /\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something` + } + ] + }; + } + + return javascript; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/javascript.min.js b/backend/static/highlight(1)/es/languages/javascript.min.js new file mode 100644 index 0000000..471254f --- /dev/null +++ b/backend/static/highlight(1)/es/languages/javascript.min.js @@ -0,0 +1,81 @@ +/*! `javascript` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict" +;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],a=["true","false","null","undefined","NaN","Infinity"],t=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],s=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],r=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],c=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],i=[].concat(r,t,s) +;return o=>{const l=o.regex,d=e,b={begin:/<[A-Za-z0-9\\._:-]+/, +end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ +const a=e[0].length+e.index,t=e.input[a] +;if("<"===t||","===t)return void n.ignoreMatch();let s +;">"===t&&(((e,{after:n})=>{const a="e+"\\s*\\(")), +l.concat("(?!",T.join("|"),")")),d,l.lookahead(/\s*\(/)), +className:"title.function",relevance:0};var T;const C={ +begin:l.concat(/\./,l.lookahead(l.concat(d,/(?![0-9A-Za-z$_(])/))),end:d, +excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},M={ +match:[/get|set/,/\s+/,d,/(?=\()/],className:{1:"keyword",3:"title.function"}, +contains:[{begin:/\(\)/},R] +},B="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+o.UNDERSCORE_IDENT_RE+")\\s*=>",$={ +match:[/const|var|let/,/\s+/,d,/\s*/,/=\s*/,/(async\s*)?/,l.lookahead(B)], +keywords:"async",className:{1:"keyword",3:"title.function"},contains:[R]} +;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:g,exports:{ +PARAMS_CONTAINS:w,CLASS_REFERENCE:k},illegal:/#(?![$_A-z])/, +contains:[o.SHEBANG({label:"shebang",binary:"node",relevance:5}),{ +label:"use_strict",className:"meta",relevance:10, +begin:/^\s*['"]use (strict|asm)['"]/ +},o.APOS_STRING_MODE,o.QUOTE_STRING_MODE,h,_,N,f,p,{match:/\$\d+/},A,k,{ +scope:"attr",match:d+l.lookahead(":"),relevance:0},$,{ +begin:"("+o.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*", +keywords:"return throw case",relevance:0,contains:[p,o.REGEXP_MODE,{ +className:"function",begin:B,returnBegin:!0,end:"\\s*=>",contains:[{ +className:"params",variants:[{begin:o.UNDERSCORE_IDENT_RE,relevance:0},{ +className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/, +excludeBegin:!0,excludeEnd:!0,keywords:g,contains:w}]}]},{begin:/,/,relevance:0 +},{match:/\s+/,relevance:0},{variants:[{begin:"<>",end:""},{ +match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:b.begin, +"on:begin":b.isTrulyOpeningTag,end:b.end}],subLanguage:"xml",contains:[{ +begin:b.begin,end:b.end,skip:!0,contains:["self"]}]}]},I,{ +beginKeywords:"while if switch catch for"},{ +begin:"\\b(?!function)"+o.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,label:"func.def",contains:[R,o.inherit(o.TITLE_MODE,{begin:d, +className:"title.function"})]},{match:/\.\.\./,relevance:0},C,{match:"\\$"+d, +relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"}, +contains:[R]},x,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},O,M,{match:/\$[(.]/}]}}})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/json.js b/backend/static/highlight(1)/es/languages/json.js new file mode 100644 index 0000000..f954cc5 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/json.js @@ -0,0 +1,62 @@ +/*! `json` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: JSON + Description: JSON (JavaScript Object Notation) is a lightweight data-interchange format. + Author: Ivan Sagalaev + Website: http://www.json.org + Category: common, protocols, web + */ + + function json(hljs) { + const ATTRIBUTE = { + className: 'attr', + begin: /"(\\.|[^\\"\r\n])*"(?=\s*:)/, + relevance: 1.01 + }; + const PUNCTUATION = { + match: /[{}[\],:]/, + className: "punctuation", + relevance: 0 + }; + const LITERALS = [ + "true", + "false", + "null" + ]; + // NOTE: normally we would rely on `keywords` for this but using a mode here allows us + // - to use the very tight `illegal: \S` rule later to flag any other character + // - as illegal indicating that despite looking like JSON we do not truly have + // - JSON and thus improve false-positively greatly since JSON will try and claim + // - all sorts of JSON looking stuff + const LITERALS_MODE = { + scope: "literal", + beginKeywords: LITERALS.join(" "), + }; + + return { + name: 'JSON', + aliases: ['jsonc'], + keywords:{ + literal: LITERALS, + }, + contains: [ + ATTRIBUTE, + PUNCTUATION, + hljs.QUOTE_STRING_MODE, + LITERALS_MODE, + hljs.C_NUMBER_MODE, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ], + illegal: '\\S' + }; + } + + return json; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/json.min.js b/backend/static/highlight(1)/es/languages/json.min.js new file mode 100644 index 0000000..49f3acf --- /dev/null +++ b/backend/static/highlight(1)/es/languages/json.min.js @@ -0,0 +1,8 @@ +/*! `json` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{ +const a=["true","false","null"],r={scope:"literal",beginKeywords:a.join(" ")} +;return{name:"JSON",aliases:["jsonc"],keywords:{literal:a},contains:[{ +className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{ +match:/[{}[\],:]/,className:"punctuation",relevance:0 +},e.QUOTE_STRING_MODE,r,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE], +illegal:"\\S"}}})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/kotlin.js b/backend/static/highlight(1)/es/languages/kotlin.js new file mode 100644 index 0000000..cab9852 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/kotlin.js @@ -0,0 +1,294 @@ +/*! `kotlin` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + // https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10 + var decimalDigits = '[0-9](_*[0-9])*'; + var frac = `\\.(${decimalDigits})`; + var hexDigits = '[0-9a-fA-F](_*[0-9a-fA-F])*'; + var NUMERIC = { + className: 'number', + variants: [ + // DecimalFloatingPointLiteral + // including ExponentPart + { begin: `(\\b(${decimalDigits})((${frac})|\\.)?|(${frac}))` + + `[eE][+-]?(${decimalDigits})[fFdD]?\\b` }, + // excluding ExponentPart + { begin: `\\b(${decimalDigits})((${frac})[fFdD]?\\b|\\.([fFdD]\\b)?)` }, + { begin: `(${frac})[fFdD]?\\b` }, + { begin: `\\b(${decimalDigits})[fFdD]\\b` }, + + // HexadecimalFloatingPointLiteral + { begin: `\\b0[xX]((${hexDigits})\\.?|(${hexDigits})?\\.(${hexDigits}))` + + `[pP][+-]?(${decimalDigits})[fFdD]?\\b` }, + + // DecimalIntegerLiteral + { begin: '\\b(0|[1-9](_*[0-9])*)[lL]?\\b' }, + + // HexIntegerLiteral + { begin: `\\b0[xX](${hexDigits})[lL]?\\b` }, + + // OctalIntegerLiteral + { begin: '\\b0(_*[0-7])*[lL]?\\b' }, + + // BinaryIntegerLiteral + { begin: '\\b0[bB][01](_*[01])*[lL]?\\b' }, + ], + relevance: 0 + }; + + /* + Language: Kotlin + Description: Kotlin is an OSS statically typed programming language that targets the JVM, Android, JavaScript and Native. + Author: Sergey Mashkov + Website: https://kotlinlang.org + Category: common + */ + + + function kotlin(hljs) { + const KEYWORDS = { + keyword: + 'abstract as val var vararg get set class object open private protected public noinline ' + + 'crossinline dynamic final enum if else do while for when throw try catch finally ' + + 'import package is in fun override companion reified inline lateinit init ' + + 'interface annotation data sealed internal infix operator out by constructor super ' + + 'tailrec where const inner suspend typealias external expect actual', + built_in: + 'Byte Short Char Int Long Boolean Float Double Void Unit Nothing', + literal: + 'true false null' + }; + const KEYWORDS_WITH_LABEL = { + className: 'keyword', + begin: /\b(break|continue|return|this)\b/, + starts: { contains: [ + { + className: 'symbol', + begin: /@\w+/ + } + ] } + }; + const LABEL = { + className: 'symbol', + begin: hljs.UNDERSCORE_IDENT_RE + '@' + }; + + // for string templates + const SUBST = { + className: 'subst', + begin: /\$\{/, + end: /\}/, + contains: [ hljs.C_NUMBER_MODE ] + }; + const VARIABLE = { + className: 'variable', + begin: '\\$' + hljs.UNDERSCORE_IDENT_RE + }; + const STRING = { + className: 'string', + variants: [ + { + begin: '"""', + end: '"""(?=[^"])', + contains: [ + VARIABLE, + SUBST + ] + }, + // Can't use built-in modes easily, as we want to use STRING in the meta + // context as 'meta-string' and there's no syntax to remove explicitly set + // classNames in built-in modes. + { + begin: '\'', + end: '\'', + illegal: /\n/, + contains: [ hljs.BACKSLASH_ESCAPE ] + }, + { + begin: '"', + end: '"', + illegal: /\n/, + contains: [ + hljs.BACKSLASH_ESCAPE, + VARIABLE, + SUBST + ] + } + ] + }; + SUBST.contains.push(STRING); + + const ANNOTATION_USE_SITE = { + className: 'meta', + begin: '@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*' + hljs.UNDERSCORE_IDENT_RE + ')?' + }; + const ANNOTATION = { + className: 'meta', + begin: '@' + hljs.UNDERSCORE_IDENT_RE, + contains: [ + { + begin: /\(/, + end: /\)/, + contains: [ + hljs.inherit(STRING, { className: 'string' }), + "self" + ] + } + ] + }; + + // https://kotlinlang.org/docs/reference/whatsnew11.html#underscores-in-numeric-literals + // According to the doc above, the number mode of kotlin is the same as java 8, + // so the code below is copied from java.js + const KOTLIN_NUMBER_MODE = NUMERIC; + const KOTLIN_NESTED_COMMENT = hljs.COMMENT( + '/\\*', '\\*/', + { contains: [ hljs.C_BLOCK_COMMENT_MODE ] } + ); + const KOTLIN_PAREN_TYPE = { variants: [ + { + className: 'type', + begin: hljs.UNDERSCORE_IDENT_RE + }, + { + begin: /\(/, + end: /\)/, + contains: [] // defined later + } + ] }; + const KOTLIN_PAREN_TYPE2 = KOTLIN_PAREN_TYPE; + KOTLIN_PAREN_TYPE2.variants[1].contains = [ KOTLIN_PAREN_TYPE ]; + KOTLIN_PAREN_TYPE.variants[1].contains = [ KOTLIN_PAREN_TYPE2 ]; + + return { + name: 'Kotlin', + aliases: [ + 'kt', + 'kts' + ], + keywords: KEYWORDS, + contains: [ + hljs.COMMENT( + '/\\*\\*', + '\\*/', + { + relevance: 0, + contains: [ + { + className: 'doctag', + begin: '@[A-Za-z]+' + } + ] + } + ), + hljs.C_LINE_COMMENT_MODE, + KOTLIN_NESTED_COMMENT, + KEYWORDS_WITH_LABEL, + LABEL, + ANNOTATION_USE_SITE, + ANNOTATION, + { + className: 'function', + beginKeywords: 'fun', + end: '[(]|$', + returnBegin: true, + excludeEnd: true, + keywords: KEYWORDS, + relevance: 5, + contains: [ + { + begin: hljs.UNDERSCORE_IDENT_RE + '\\s*\\(', + returnBegin: true, + relevance: 0, + contains: [ hljs.UNDERSCORE_TITLE_MODE ] + }, + { + className: 'type', + begin: //, + keywords: 'reified', + relevance: 0 + }, + { + className: 'params', + begin: /\(/, + end: /\)/, + endsParent: true, + keywords: KEYWORDS, + relevance: 0, + contains: [ + { + begin: /:/, + end: /[=,\/]/, + endsWithParent: true, + contains: [ + KOTLIN_PAREN_TYPE, + hljs.C_LINE_COMMENT_MODE, + KOTLIN_NESTED_COMMENT + ], + relevance: 0 + }, + hljs.C_LINE_COMMENT_MODE, + KOTLIN_NESTED_COMMENT, + ANNOTATION_USE_SITE, + ANNOTATION, + STRING, + hljs.C_NUMBER_MODE + ] + }, + KOTLIN_NESTED_COMMENT + ] + }, + { + begin: [ + /class|interface|trait/, + /\s+/, + hljs.UNDERSCORE_IDENT_RE + ], + beginScope: { + 3: "title.class" + }, + keywords: 'class interface trait', + end: /[:\{(]|$/, + excludeEnd: true, + illegal: 'extends implements', + contains: [ + { beginKeywords: 'public protected internal private constructor' }, + hljs.UNDERSCORE_TITLE_MODE, + { + className: 'type', + begin: //, + excludeBegin: true, + excludeEnd: true, + relevance: 0 + }, + { + className: 'type', + begin: /[,:]\s*/, + end: /[<\(,){\s]|$/, + excludeBegin: true, + returnEnd: true + }, + ANNOTATION_USE_SITE, + ANNOTATION + ] + }, + STRING, + { + className: 'meta', + begin: "^#!/usr/bin/env", + end: '$', + illegal: '\n' + }, + KOTLIN_NUMBER_MODE + ] + }; + } + + return kotlin; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/kotlin.min.js b/backend/static/highlight(1)/es/languages/kotlin.min.js new file mode 100644 index 0000000..74b5b47 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/kotlin.min.js @@ -0,0 +1,46 @@ +/*! `kotlin` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict" +;var e="[0-9](_*[0-9])*",n=`\\.(${e})`,a="[0-9a-fA-F](_*[0-9a-fA-F])*",i={ +className:"number",variants:[{ +begin:`(\\b(${e})((${n})|\\.)?|(${n}))[eE][+-]?(${e})[fFdD]?\\b`},{ +begin:`\\b(${e})((${n})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{begin:`(${n})[fFdD]?\\b` +},{begin:`\\b(${e})[fFdD]\\b`},{ +begin:`\\b0[xX]((${a})\\.?|(${a})?\\.(${a}))[pP][+-]?(${e})[fFdD]?\\b`},{ +begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${a})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};return e=>{const n={ +keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", +built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", +literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" +},s={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},t={ +className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", +variants:[{begin:'"""',end:'"""(?=[^"])',contains:[t,s]},{begin:"'",end:"'", +illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, +contains:[e.BACKSLASH_ESCAPE,t,s]}]};s.contains.push(r);const l={ +className:"meta", +begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" +},c={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, +end:/\)/,contains:[e.inherit(r,{className:"string"}),"self"]}] +},o=i,b=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),E={ +variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, +contains:[]}]},d=E;return d.variants[1].contains=[E],E.variants[1].contains=[d], +{name:"Kotlin",aliases:["kt","kts"],keywords:n, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag", +begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,b,{className:"keyword", +begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", +begin:/@\w+/}]}},a,l,c,{className:"function",beginKeywords:"fun",end:"[(]|$", +returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, +keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, +endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, +endsWithParent:!0,contains:[E,e.C_LINE_COMMENT_MODE,b],relevance:0 +},e.C_LINE_COMMENT_MODE,b,l,c,r,e.C_NUMBER_MODE]},b]},{ +begin:[/class|interface|trait/,/\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{ +3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, +illegal:"extends implements",contains:[{ +beginKeywords:"public protected internal private constructor" +},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, +excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/, +excludeBegin:!0,returnEnd:!0},l,c]},r,{className:"meta",begin:"^#!/usr/bin/env", +end:"$",illegal:"\n"},o]}}})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/less.js b/backend/static/highlight(1)/es/languages/less.js new file mode 100644 index 0000000..3e82040 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/less.js @@ -0,0 +1,1058 @@ +/*! `less` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + const MODES = (hljs) => { + return { + IMPORTANT: { + scope: 'meta', + begin: '!important' + }, + BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE, + HEXCOLOR: { + scope: 'number', + begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/ + }, + FUNCTION_DISPATCH: { + className: "built_in", + begin: /[\w-]+(?=\()/ + }, + ATTRIBUTE_SELECTOR_MODE: { + scope: 'selector-attr', + begin: /\[/, + end: /\]/, + illegal: '$', + contains: [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE + ] + }, + CSS_NUMBER_MODE: { + scope: 'number', + begin: hljs.NUMBER_RE + '(' + + '%|em|ex|ch|rem' + + '|vw|vh|vmin|vmax' + + '|cm|mm|in|pt|pc|px' + + '|deg|grad|rad|turn' + + '|s|ms' + + '|Hz|kHz' + + '|dpi|dpcm|dppx' + + ')?', + relevance: 0 + }, + CSS_VARIABLE: { + className: "attr", + begin: /--[A-Za-z_][A-Za-z0-9_-]*/ + } + }; + }; + + const HTML_TAGS = [ + 'a', + 'abbr', + 'address', + 'article', + 'aside', + 'audio', + 'b', + 'blockquote', + 'body', + 'button', + 'canvas', + 'caption', + 'cite', + 'code', + 'dd', + 'del', + 'details', + 'dfn', + 'div', + 'dl', + 'dt', + 'em', + 'fieldset', + 'figcaption', + 'figure', + 'footer', + 'form', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'header', + 'hgroup', + 'html', + 'i', + 'iframe', + 'img', + 'input', + 'ins', + 'kbd', + 'label', + 'legend', + 'li', + 'main', + 'mark', + 'menu', + 'nav', + 'object', + 'ol', + 'optgroup', + 'option', + 'p', + 'picture', + 'q', + 'quote', + 'samp', + 'section', + 'select', + 'source', + 'span', + 'strong', + 'summary', + 'sup', + 'table', + 'tbody', + 'td', + 'textarea', + 'tfoot', + 'th', + 'thead', + 'time', + 'tr', + 'ul', + 'var', + 'video' + ]; + + const SVG_TAGS = [ + 'defs', + 'g', + 'marker', + 'mask', + 'pattern', + 'svg', + 'switch', + 'symbol', + 'feBlend', + 'feColorMatrix', + 'feComponentTransfer', + 'feComposite', + 'feConvolveMatrix', + 'feDiffuseLighting', + 'feDisplacementMap', + 'feFlood', + 'feGaussianBlur', + 'feImage', + 'feMerge', + 'feMorphology', + 'feOffset', + 'feSpecularLighting', + 'feTile', + 'feTurbulence', + 'linearGradient', + 'radialGradient', + 'stop', + 'circle', + 'ellipse', + 'image', + 'line', + 'path', + 'polygon', + 'polyline', + 'rect', + 'text', + 'use', + 'textPath', + 'tspan', + 'foreignObject', + 'clipPath' + ]; + + const TAGS = [ + ...HTML_TAGS, + ...SVG_TAGS, + ]; + + // Sorting, then reversing makes sure longer attributes/elements like + // `font-weight` are matched fully instead of getting false positives on say `font` + + const MEDIA_FEATURES = [ + 'any-hover', + 'any-pointer', + 'aspect-ratio', + 'color', + 'color-gamut', + 'color-index', + 'device-aspect-ratio', + 'device-height', + 'device-width', + 'display-mode', + 'forced-colors', + 'grid', + 'height', + 'hover', + 'inverted-colors', + 'monochrome', + 'orientation', + 'overflow-block', + 'overflow-inline', + 'pointer', + 'prefers-color-scheme', + 'prefers-contrast', + 'prefers-reduced-motion', + 'prefers-reduced-transparency', + 'resolution', + 'scan', + 'scripting', + 'update', + 'width', + // TODO: find a better solution? + 'min-width', + 'max-width', + 'min-height', + 'max-height' + ].sort().reverse(); + + // https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes + const PSEUDO_CLASSES = [ + 'active', + 'any-link', + 'blank', + 'checked', + 'current', + 'default', + 'defined', + 'dir', // dir() + 'disabled', + 'drop', + 'empty', + 'enabled', + 'first', + 'first-child', + 'first-of-type', + 'fullscreen', + 'future', + 'focus', + 'focus-visible', + 'focus-within', + 'has', // has() + 'host', // host or host() + 'host-context', // host-context() + 'hover', + 'indeterminate', + 'in-range', + 'invalid', + 'is', // is() + 'lang', // lang() + 'last-child', + 'last-of-type', + 'left', + 'link', + 'local-link', + 'not', // not() + 'nth-child', // nth-child() + 'nth-col', // nth-col() + 'nth-last-child', // nth-last-child() + 'nth-last-col', // nth-last-col() + 'nth-last-of-type', //nth-last-of-type() + 'nth-of-type', //nth-of-type() + 'only-child', + 'only-of-type', + 'optional', + 'out-of-range', + 'past', + 'placeholder-shown', + 'read-only', + 'read-write', + 'required', + 'right', + 'root', + 'scope', + 'target', + 'target-within', + 'user-invalid', + 'valid', + 'visited', + 'where' // where() + ].sort().reverse(); + + // https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements + const PSEUDO_ELEMENTS = [ + 'after', + 'backdrop', + 'before', + 'cue', + 'cue-region', + 'first-letter', + 'first-line', + 'grammar-error', + 'marker', + 'part', + 'placeholder', + 'selection', + 'slotted', + 'spelling-error' + ].sort().reverse(); + + const ATTRIBUTES = [ + 'accent-color', + 'align-content', + 'align-items', + 'align-self', + 'alignment-baseline', + 'all', + 'anchor-name', + 'animation', + 'animation-composition', + 'animation-delay', + 'animation-direction', + 'animation-duration', + 'animation-fill-mode', + 'animation-iteration-count', + 'animation-name', + 'animation-play-state', + 'animation-range', + 'animation-range-end', + 'animation-range-start', + 'animation-timeline', + 'animation-timing-function', + 'appearance', + 'aspect-ratio', + 'backdrop-filter', + 'backface-visibility', + 'background', + 'background-attachment', + 'background-blend-mode', + 'background-clip', + 'background-color', + 'background-image', + 'background-origin', + 'background-position', + 'background-position-x', + 'background-position-y', + 'background-repeat', + 'background-size', + 'baseline-shift', + 'block-size', + 'border', + 'border-block', + 'border-block-color', + 'border-block-end', + 'border-block-end-color', + 'border-block-end-style', + 'border-block-end-width', + 'border-block-start', + 'border-block-start-color', + 'border-block-start-style', + 'border-block-start-width', + 'border-block-style', + 'border-block-width', + 'border-bottom', + 'border-bottom-color', + 'border-bottom-left-radius', + 'border-bottom-right-radius', + 'border-bottom-style', + 'border-bottom-width', + 'border-collapse', + 'border-color', + 'border-end-end-radius', + 'border-end-start-radius', + 'border-image', + 'border-image-outset', + 'border-image-repeat', + 'border-image-slice', + 'border-image-source', + 'border-image-width', + 'border-inline', + 'border-inline-color', + 'border-inline-end', + 'border-inline-end-color', + 'border-inline-end-style', + 'border-inline-end-width', + 'border-inline-start', + 'border-inline-start-color', + 'border-inline-start-style', + 'border-inline-start-width', + 'border-inline-style', + 'border-inline-width', + 'border-left', + 'border-left-color', + 'border-left-style', + 'border-left-width', + 'border-radius', + 'border-right', + 'border-right-color', + 'border-right-style', + 'border-right-width', + 'border-spacing', + 'border-start-end-radius', + 'border-start-start-radius', + 'border-style', + 'border-top', + 'border-top-color', + 'border-top-left-radius', + 'border-top-right-radius', + 'border-top-style', + 'border-top-width', + 'border-width', + 'bottom', + 'box-align', + 'box-decoration-break', + 'box-direction', + 'box-flex', + 'box-flex-group', + 'box-lines', + 'box-ordinal-group', + 'box-orient', + 'box-pack', + 'box-shadow', + 'box-sizing', + 'break-after', + 'break-before', + 'break-inside', + 'caption-side', + 'caret-color', + 'clear', + 'clip', + 'clip-path', + 'clip-rule', + 'color', + 'color-interpolation', + 'color-interpolation-filters', + 'color-profile', + 'color-rendering', + 'color-scheme', + 'column-count', + 'column-fill', + 'column-gap', + 'column-rule', + 'column-rule-color', + 'column-rule-style', + 'column-rule-width', + 'column-span', + 'column-width', + 'columns', + 'contain', + 'contain-intrinsic-block-size', + 'contain-intrinsic-height', + 'contain-intrinsic-inline-size', + 'contain-intrinsic-size', + 'contain-intrinsic-width', + 'container', + 'container-name', + 'container-type', + 'content', + 'content-visibility', + 'counter-increment', + 'counter-reset', + 'counter-set', + 'cue', + 'cue-after', + 'cue-before', + 'cursor', + 'cx', + 'cy', + 'direction', + 'display', + 'dominant-baseline', + 'empty-cells', + 'enable-background', + 'field-sizing', + 'fill', + 'fill-opacity', + 'fill-rule', + 'filter', + 'flex', + 'flex-basis', + 'flex-direction', + 'flex-flow', + 'flex-grow', + 'flex-shrink', + 'flex-wrap', + 'float', + 'flood-color', + 'flood-opacity', + 'flow', + 'font', + 'font-display', + 'font-family', + 'font-feature-settings', + 'font-kerning', + 'font-language-override', + 'font-optical-sizing', + 'font-palette', + 'font-size', + 'font-size-adjust', + 'font-smooth', + 'font-smoothing', + 'font-stretch', + 'font-style', + 'font-synthesis', + 'font-synthesis-position', + 'font-synthesis-small-caps', + 'font-synthesis-style', + 'font-synthesis-weight', + 'font-variant', + 'font-variant-alternates', + 'font-variant-caps', + 'font-variant-east-asian', + 'font-variant-emoji', + 'font-variant-ligatures', + 'font-variant-numeric', + 'font-variant-position', + 'font-variation-settings', + 'font-weight', + 'forced-color-adjust', + 'gap', + 'glyph-orientation-horizontal', + 'glyph-orientation-vertical', + 'grid', + 'grid-area', + 'grid-auto-columns', + 'grid-auto-flow', + 'grid-auto-rows', + 'grid-column', + 'grid-column-end', + 'grid-column-start', + 'grid-gap', + 'grid-row', + 'grid-row-end', + 'grid-row-start', + 'grid-template', + 'grid-template-areas', + 'grid-template-columns', + 'grid-template-rows', + 'hanging-punctuation', + 'height', + 'hyphenate-character', + 'hyphenate-limit-chars', + 'hyphens', + 'icon', + 'image-orientation', + 'image-rendering', + 'image-resolution', + 'ime-mode', + 'initial-letter', + 'initial-letter-align', + 'inline-size', + 'inset', + 'inset-area', + 'inset-block', + 'inset-block-end', + 'inset-block-start', + 'inset-inline', + 'inset-inline-end', + 'inset-inline-start', + 'isolation', + 'justify-content', + 'justify-items', + 'justify-self', + 'kerning', + 'left', + 'letter-spacing', + 'lighting-color', + 'line-break', + 'line-height', + 'line-height-step', + 'list-style', + 'list-style-image', + 'list-style-position', + 'list-style-type', + 'margin', + 'margin-block', + 'margin-block-end', + 'margin-block-start', + 'margin-bottom', + 'margin-inline', + 'margin-inline-end', + 'margin-inline-start', + 'margin-left', + 'margin-right', + 'margin-top', + 'margin-trim', + 'marker', + 'marker-end', + 'marker-mid', + 'marker-start', + 'marks', + 'mask', + 'mask-border', + 'mask-border-mode', + 'mask-border-outset', + 'mask-border-repeat', + 'mask-border-slice', + 'mask-border-source', + 'mask-border-width', + 'mask-clip', + 'mask-composite', + 'mask-image', + 'mask-mode', + 'mask-origin', + 'mask-position', + 'mask-repeat', + 'mask-size', + 'mask-type', + 'masonry-auto-flow', + 'math-depth', + 'math-shift', + 'math-style', + 'max-block-size', + 'max-height', + 'max-inline-size', + 'max-width', + 'min-block-size', + 'min-height', + 'min-inline-size', + 'min-width', + 'mix-blend-mode', + 'nav-down', + 'nav-index', + 'nav-left', + 'nav-right', + 'nav-up', + 'none', + 'normal', + 'object-fit', + 'object-position', + 'offset', + 'offset-anchor', + 'offset-distance', + 'offset-path', + 'offset-position', + 'offset-rotate', + 'opacity', + 'order', + 'orphans', + 'outline', + 'outline-color', + 'outline-offset', + 'outline-style', + 'outline-width', + 'overflow', + 'overflow-anchor', + 'overflow-block', + 'overflow-clip-margin', + 'overflow-inline', + 'overflow-wrap', + 'overflow-x', + 'overflow-y', + 'overlay', + 'overscroll-behavior', + 'overscroll-behavior-block', + 'overscroll-behavior-inline', + 'overscroll-behavior-x', + 'overscroll-behavior-y', + 'padding', + 'padding-block', + 'padding-block-end', + 'padding-block-start', + 'padding-bottom', + 'padding-inline', + 'padding-inline-end', + 'padding-inline-start', + 'padding-left', + 'padding-right', + 'padding-top', + 'page', + 'page-break-after', + 'page-break-before', + 'page-break-inside', + 'paint-order', + 'pause', + 'pause-after', + 'pause-before', + 'perspective', + 'perspective-origin', + 'place-content', + 'place-items', + 'place-self', + 'pointer-events', + 'position', + 'position-anchor', + 'position-visibility', + 'print-color-adjust', + 'quotes', + 'r', + 'resize', + 'rest', + 'rest-after', + 'rest-before', + 'right', + 'rotate', + 'row-gap', + 'ruby-align', + 'ruby-position', + 'scale', + 'scroll-behavior', + 'scroll-margin', + 'scroll-margin-block', + 'scroll-margin-block-end', + 'scroll-margin-block-start', + 'scroll-margin-bottom', + 'scroll-margin-inline', + 'scroll-margin-inline-end', + 'scroll-margin-inline-start', + 'scroll-margin-left', + 'scroll-margin-right', + 'scroll-margin-top', + 'scroll-padding', + 'scroll-padding-block', + 'scroll-padding-block-end', + 'scroll-padding-block-start', + 'scroll-padding-bottom', + 'scroll-padding-inline', + 'scroll-padding-inline-end', + 'scroll-padding-inline-start', + 'scroll-padding-left', + 'scroll-padding-right', + 'scroll-padding-top', + 'scroll-snap-align', + 'scroll-snap-stop', + 'scroll-snap-type', + 'scroll-timeline', + 'scroll-timeline-axis', + 'scroll-timeline-name', + 'scrollbar-color', + 'scrollbar-gutter', + 'scrollbar-width', + 'shape-image-threshold', + 'shape-margin', + 'shape-outside', + 'shape-rendering', + 'speak', + 'speak-as', + 'src', // @font-face + 'stop-color', + 'stop-opacity', + 'stroke', + 'stroke-dasharray', + 'stroke-dashoffset', + 'stroke-linecap', + 'stroke-linejoin', + 'stroke-miterlimit', + 'stroke-opacity', + 'stroke-width', + 'tab-size', + 'table-layout', + 'text-align', + 'text-align-all', + 'text-align-last', + 'text-anchor', + 'text-combine-upright', + 'text-decoration', + 'text-decoration-color', + 'text-decoration-line', + 'text-decoration-skip', + 'text-decoration-skip-ink', + 'text-decoration-style', + 'text-decoration-thickness', + 'text-emphasis', + 'text-emphasis-color', + 'text-emphasis-position', + 'text-emphasis-style', + 'text-indent', + 'text-justify', + 'text-orientation', + 'text-overflow', + 'text-rendering', + 'text-shadow', + 'text-size-adjust', + 'text-transform', + 'text-underline-offset', + 'text-underline-position', + 'text-wrap', + 'text-wrap-mode', + 'text-wrap-style', + 'timeline-scope', + 'top', + 'touch-action', + 'transform', + 'transform-box', + 'transform-origin', + 'transform-style', + 'transition', + 'transition-behavior', + 'transition-delay', + 'transition-duration', + 'transition-property', + 'transition-timing-function', + 'translate', + 'unicode-bidi', + 'user-modify', + 'user-select', + 'vector-effect', + 'vertical-align', + 'view-timeline', + 'view-timeline-axis', + 'view-timeline-inset', + 'view-timeline-name', + 'view-transition-name', + 'visibility', + 'voice-balance', + 'voice-duration', + 'voice-family', + 'voice-pitch', + 'voice-range', + 'voice-rate', + 'voice-stress', + 'voice-volume', + 'white-space', + 'white-space-collapse', + 'widows', + 'width', + 'will-change', + 'word-break', + 'word-spacing', + 'word-wrap', + 'writing-mode', + 'x', + 'y', + 'z-index', + 'zoom' + ].sort().reverse(); + + // some grammars use them all as a single group + const PSEUDO_SELECTORS = PSEUDO_CLASSES.concat(PSEUDO_ELEMENTS).sort().reverse(); + + /* + Language: Less + Description: It's CSS, with just a little more. + Author: Max Mikhailov + Website: http://lesscss.org + Category: common, css, web + */ + + + /** @type LanguageFn */ + function less(hljs) { + const modes = MODES(hljs); + const PSEUDO_SELECTORS$1 = PSEUDO_SELECTORS; + + const AT_MODIFIERS = "and or not only"; + const IDENT_RE = '[\\w-]+'; // yes, Less identifiers may begin with a digit + const INTERP_IDENT_RE = '(' + IDENT_RE + '|@\\{' + IDENT_RE + '\\})'; + + /* Generic Modes */ + + const RULES = []; const VALUE_MODES = []; // forward def. for recursive modes + + const STRING_MODE = function(c) { + return { + // Less strings are not multiline (also include '~' for more consistent coloring of "escaped" strings) + className: 'string', + begin: '~?' + c + '.*?' + c + }; + }; + + const IDENT_MODE = function(name, begin, relevance) { + return { + className: name, + begin: begin, + relevance: relevance + }; + }; + + const AT_KEYWORDS = { + $pattern: /[a-z-]+/, + keyword: AT_MODIFIERS, + attribute: MEDIA_FEATURES.join(" ") + }; + + const PARENS_MODE = { + // used only to properly balance nested parens inside mixin call, def. arg list + begin: '\\(', + end: '\\)', + contains: VALUE_MODES, + keywords: AT_KEYWORDS, + relevance: 0 + }; + + // generic Less highlighter (used almost everywhere except selectors): + VALUE_MODES.push( + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + STRING_MODE("'"), + STRING_MODE('"'), + modes.CSS_NUMBER_MODE, // fixme: it does not include dot for numbers like .5em :( + { + begin: '(url|data-uri)\\(', + starts: { + className: 'string', + end: '[\\)\\n]', + excludeEnd: true + } + }, + modes.HEXCOLOR, + PARENS_MODE, + IDENT_MODE('variable', '@@?' + IDENT_RE, 10), + IDENT_MODE('variable', '@\\{' + IDENT_RE + '\\}'), + IDENT_MODE('built_in', '~?`[^`]*?`'), // inline javascript (or whatever host language) *multiline* string + { // @media features (it’s here to not duplicate things in AT_RULE_MODE with extra PARENS_MODE overriding): + className: 'attribute', + begin: IDENT_RE + '\\s*:', + end: ':', + returnBegin: true, + excludeEnd: true + }, + modes.IMPORTANT, + { beginKeywords: 'and not' }, + modes.FUNCTION_DISPATCH + ); + + const VALUE_WITH_RULESETS = VALUE_MODES.concat({ + begin: /\{/, + end: /\}/, + contains: RULES + }); + + const MIXIN_GUARD_MODE = { + beginKeywords: 'when', + endsWithParent: true, + contains: [ { beginKeywords: 'and not' } ].concat(VALUE_MODES) // using this form to override VALUE’s 'function' match + }; + + /* Rule-Level Modes */ + + const RULE_MODE = { + begin: INTERP_IDENT_RE + '\\s*:', + returnBegin: true, + end: /[;}]/, + relevance: 0, + contains: [ + { begin: /-(webkit|moz|ms|o)-/ }, + modes.CSS_VARIABLE, + { + className: 'attribute', + begin: '\\b(' + ATTRIBUTES.join('|') + ')\\b', + end: /(?=:)/, + starts: { + endsWithParent: true, + illegal: '[<=$]', + relevance: 0, + contains: VALUE_MODES + } + } + ] + }; + + const AT_RULE_MODE = { + className: 'keyword', + begin: '@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b', + starts: { + end: '[;{}]', + keywords: AT_KEYWORDS, + returnEnd: true, + contains: VALUE_MODES, + relevance: 0 + } + }; + + // variable definitions and calls + const VAR_RULE_MODE = { + className: 'variable', + variants: [ + // using more strict pattern for higher relevance to increase chances of Less detection. + // this is *the only* Less specific statement used in most of the sources, so... + // (we’ll still often loose to the css-parser unless there's '//' comment, + // simply because 1 variable just can't beat 99 properties :) + { + begin: '@' + IDENT_RE + '\\s*:', + relevance: 15 + }, + { begin: '@' + IDENT_RE } + ], + starts: { + end: '[;}]', + returnEnd: true, + contains: VALUE_WITH_RULESETS + } + }; + + const SELECTOR_MODE = { + // first parse unambiguous selectors (i.e. those not starting with tag) + // then fall into the scary lookahead-discriminator variant. + // this mode also handles mixin definitions and calls + variants: [ + { + begin: '[\\.#:&\\[>]', + end: '[;{}]' // mixin calls end with ';' + }, + { + begin: INTERP_IDENT_RE, + end: /\{/ + } + ], + returnBegin: true, + returnEnd: true, + illegal: '[<=\'$"]', + relevance: 0, + contains: [ + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + MIXIN_GUARD_MODE, + IDENT_MODE('keyword', 'all\\b'), + IDENT_MODE('variable', '@\\{' + IDENT_RE + '\\}'), // otherwise it’s identified as tag + + { + begin: '\\b(' + TAGS.join('|') + ')\\b', + className: 'selector-tag' + }, + modes.CSS_NUMBER_MODE, + IDENT_MODE('selector-tag', INTERP_IDENT_RE, 0), + IDENT_MODE('selector-id', '#' + INTERP_IDENT_RE), + IDENT_MODE('selector-class', '\\.' + INTERP_IDENT_RE, 0), + IDENT_MODE('selector-tag', '&', 0), + modes.ATTRIBUTE_SELECTOR_MODE, + { + className: 'selector-pseudo', + begin: ':(' + PSEUDO_CLASSES.join('|') + ')' + }, + { + className: 'selector-pseudo', + begin: ':(:)?(' + PSEUDO_ELEMENTS.join('|') + ')' + }, + { + begin: /\(/, + end: /\)/, + relevance: 0, + contains: VALUE_WITH_RULESETS + }, // argument list of parametric mixins + { begin: '!important' }, // eat !important after mixin call or it will be colored as tag + modes.FUNCTION_DISPATCH + ] + }; + + const PSEUDO_SELECTOR_MODE = { + begin: IDENT_RE + ':(:)?' + `(${PSEUDO_SELECTORS$1.join('|')})`, + returnBegin: true, + contains: [ SELECTOR_MODE ] + }; + + RULES.push( + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + AT_RULE_MODE, + VAR_RULE_MODE, + PSEUDO_SELECTOR_MODE, + RULE_MODE, + SELECTOR_MODE, + MIXIN_GUARD_MODE, + modes.FUNCTION_DISPATCH + ); + + return { + name: 'Less', + case_insensitive: true, + illegal: '[=>\'/<($"]', + contains: RULES + }; + } + + return less; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/less.min.js b/backend/static/highlight(1)/es/languages/less.min.js new file mode 100644 index 0000000..bb4e7c9 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/less.min.js @@ -0,0 +1,45 @@ +/*! `less` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict" +;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video","defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),r=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse(),n=i.concat(o).sort().reverse() +;return a=>{const l=(e=>({IMPORTANT:{scope:"meta",begin:"!important"}, +BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number", +begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{ +className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{ +scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", +contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ +scope:"number", +begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", +relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/} +}))(a),s=n,c="[\\w-]+",d="("+c+"|@\\{"+c+"\\})",m=[],b=[],g=e=>({ +className:"string",begin:"~?"+e+".*?"+e}),p=(e,t,i)=>({className:e,begin:t, +relevance:i}),f={$pattern:/[a-z-]+/,keyword:"and or not only", +attribute:t.join(" ")},h={begin:"\\(",end:"\\)",contains:b,keywords:f, +relevance:0} +;b.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,g("'"),g('"'),l.CSS_NUMBER_MODE,{ +begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]", +excludeEnd:!0} +},l.HEXCOLOR,h,p("variable","@@?"+c,10),p("variable","@\\{"+c+"\\}"),p("built_in","~?`[^`]*?`"),{ +className:"attribute",begin:c+"\\s*:",end:":",returnBegin:!0,excludeEnd:!0 +},l.IMPORTANT,{beginKeywords:"and not"},l.FUNCTION_DISPATCH);const u=b.concat({ +begin:/\{/,end:/\}/,contains:m}),k={beginKeywords:"when",endsWithParent:!0, +contains:[{beginKeywords:"and not"}].concat(b)},v={begin:d+"\\s*:", +returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/ +},l.CSS_VARIABLE,{className:"attribute",begin:"\\b("+r.join("|")+")\\b", +end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:b}}] +},y={className:"keyword", +begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", +starts:{end:"[;{}]",keywords:f,returnEnd:!0,contains:b,relevance:0}},w={ +className:"variable",variants:[{begin:"@"+c+"\\s*:",relevance:15},{begin:"@"+c +}],starts:{end:"[;}]",returnEnd:!0,contains:u}},x={variants:[{ +begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:d,end:/\{/}],returnBegin:!0, +returnEnd:!0,illegal:"[<='$\"]",relevance:0, +contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,k,p("keyword","all\\b"),p("variable","@\\{"+c+"\\}"),{ +begin:"\\b("+e.join("|")+")\\b",className:"selector-tag" +},l.CSS_NUMBER_MODE,p("selector-tag",d,0),p("selector-id","#"+d),p("selector-class","\\."+d,0),p("selector-tag","&",0),l.ATTRIBUTE_SELECTOR_MODE,{ +className:"selector-pseudo",begin:":("+i.join("|")+")"},{ +className:"selector-pseudo",begin:":(:)?("+o.join("|")+")"},{begin:/\(/, +end:/\)/,relevance:0,contains:u},{begin:"!important"},l.FUNCTION_DISPATCH]},_={ +begin:c+":(:)?"+`(${s.join("|")})`,returnBegin:!0,contains:[x]} +;return m.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,y,w,_,v,x,k,l.FUNCTION_DISPATCH), +{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:m}}})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/lua.js b/backend/static/highlight(1)/es/languages/lua.js new file mode 100644 index 0000000..9db1a40 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/lua.js @@ -0,0 +1,89 @@ +/*! `lua` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: Lua + Description: Lua is a powerful, efficient, lightweight, embeddable scripting language. + Author: Andrew Fedorov + Category: common, gaming, scripting + Website: https://www.lua.org + */ + + function lua(hljs) { + const OPENING_LONG_BRACKET = '\\[=*\\['; + const CLOSING_LONG_BRACKET = '\\]=*\\]'; + const LONG_BRACKETS = { + begin: OPENING_LONG_BRACKET, + end: CLOSING_LONG_BRACKET, + contains: [ 'self' ] + }; + const COMMENTS = [ + hljs.COMMENT('--(?!' + OPENING_LONG_BRACKET + ')', '$'), + hljs.COMMENT( + '--' + OPENING_LONG_BRACKET, + CLOSING_LONG_BRACKET, + { + contains: [ LONG_BRACKETS ], + relevance: 10 + } + ) + ]; + return { + name: 'Lua', + aliases: ['pluto'], + keywords: { + $pattern: hljs.UNDERSCORE_IDENT_RE, + literal: "true false nil", + keyword: "and break do else elseif end for goto if in local not or repeat return then until while", + built_in: + // Metatags and globals: + '_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len ' + + '__gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert ' + // Standard methods and properties: + + 'collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring ' + + 'module next pairs pcall print rawequal rawget rawset require select setfenv ' + + 'setmetatable tonumber tostring type unpack xpcall arg self ' + // Library methods and properties (one line per library): + + 'coroutine resume yield status wrap create running debug getupvalue ' + + 'debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv ' + + 'io lines write close flush open output type read stderr stdin input stdout popen tmpfile ' + + 'math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan ' + + 'os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall ' + + 'string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower ' + + 'table setn insert getn foreachi maxn foreach concat sort remove' + }, + contains: COMMENTS.concat([ + { + className: 'function', + beginKeywords: 'function', + end: '\\)', + contains: [ + hljs.inherit(hljs.TITLE_MODE, { begin: '([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*' }), + { + className: 'params', + begin: '\\(', + endsWithParent: true, + contains: COMMENTS + } + ].concat(COMMENTS) + }, + hljs.C_NUMBER_MODE, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + { + className: 'string', + begin: OPENING_LONG_BRACKET, + end: CLOSING_LONG_BRACKET, + contains: [ LONG_BRACKETS ], + relevance: 5 + } + ]) + }; + } + + return lua; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/lua.min.js b/backend/static/highlight(1)/es/languages/lua.min.js new file mode 100644 index 0000000..937067e --- /dev/null +++ b/backend/static/highlight(1)/es/languages/lua.min.js @@ -0,0 +1,14 @@ +/*! `lua` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{ +const t="\\[=*\\[",a="\\]=*\\]",n={begin:t,end:a,contains:["self"] +},r=[e.COMMENT("--(?!"+t+")","$"),e.COMMENT("--"+t,a,{contains:[n],relevance:10 +})];return{name:"Lua",aliases:["pluto"],keywords:{ +$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil", +keyword:"and break do else elseif end for goto if in local not or repeat return then until while", +built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" +},contains:r.concat([{className:"function",beginKeywords:"function",end:"\\)", +contains:[e.inherit(e.TITLE_MODE,{ +begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params", +begin:"\\(",endsWithParent:!0,contains:r}].concat(r) +},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string", +begin:t,end:a,contains:[n],relevance:5}])}}})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/makefile.js b/backend/static/highlight(1)/es/languages/makefile.js new file mode 100644 index 0000000..8bbdb9a --- /dev/null +++ b/backend/static/highlight(1)/es/languages/makefile.js @@ -0,0 +1,97 @@ +/*! `makefile` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: Makefile + Author: Ivan Sagalaev + Contributors: Joël Porquet + Website: https://www.gnu.org/software/make/manual/html_node/Introduction.html + Category: common, build-system + */ + + function makefile(hljs) { + /* Variables: simple (eg $(var)) and special (eg $@) */ + const VARIABLE = { + className: 'variable', + variants: [ + { + begin: '\\$\\(' + hljs.UNDERSCORE_IDENT_RE + '\\)', + contains: [ hljs.BACKSLASH_ESCAPE ] + }, + { begin: /\$[@%{"use strict";return e=>{const a={className:"variable", +variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@% + Website: https://daringfireball.net/projects/markdown/ + Category: common, markup + */ + + function markdown(hljs) { + const regex = hljs.regex; + const INLINE_HTML = { + begin: /<\/?[A-Za-z_]/, + end: '>', + subLanguage: 'xml', + relevance: 0 + }; + const HORIZONTAL_RULE = { + begin: '^[-\\*]{3,}', + end: '$' + }; + const CODE = { + className: 'code', + variants: [ + // TODO: fix to allow these to work with sublanguage also + { begin: '(`{3,})[^`](.|\\n)*?\\1`*[ ]*' }, + { begin: '(~{3,})[^~](.|\\n)*?\\1~*[ ]*' }, + // needed to allow markdown as a sublanguage to work + { + begin: '```', + end: '```+[ ]*$' + }, + { + begin: '~~~', + end: '~~~+[ ]*$' + }, + { begin: '`.+?`' }, + { + begin: '(?=^( {4}|\\t))', + // use contains to gobble up multiple lines to allow the block to be whatever size + // but only have a single open/close tag vs one per line + contains: [ + { + begin: '^( {4}|\\t)', + end: '(\\n)$' + } + ], + relevance: 0 + } + ] + }; + const LIST = { + className: 'bullet', + begin: '^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)', + end: '\\s+', + excludeEnd: true + }; + const LINK_REFERENCE = { + begin: /^\[[^\n]+\]:/, + returnBegin: true, + contains: [ + { + className: 'symbol', + begin: /\[/, + end: /\]/, + excludeBegin: true, + excludeEnd: true + }, + { + className: 'link', + begin: /:\s*/, + end: /$/, + excludeBegin: true + } + ] + }; + const URL_SCHEME = /[A-Za-z][A-Za-z0-9+.-]*/; + const LINK = { + variants: [ + // too much like nested array access in so many languages + // to have any real relevance + { + begin: /\[.+?\]\[.*?\]/, + relevance: 0 + }, + // popular internet URLs + { + begin: /\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, + relevance: 2 + }, + { + begin: regex.concat(/\[.+?\]\(/, URL_SCHEME, /:\/\/.*?\)/), + relevance: 2 + }, + // relative urls + { + begin: /\[.+?\]\([./?&#].*?\)/, + relevance: 1 + }, + // whatever else, lower relevance (might not be a link at all) + { + begin: /\[.*?\]\(.*?\)/, + relevance: 0 + } + ], + returnBegin: true, + contains: [ + { + // empty strings for alt or link text + match: /\[(?=\])/ }, + { + className: 'string', + relevance: 0, + begin: '\\[', + end: '\\]', + excludeBegin: true, + returnEnd: true + }, + { + className: 'link', + relevance: 0, + begin: '\\]\\(', + end: '\\)', + excludeBegin: true, + excludeEnd: true + }, + { + className: 'symbol', + relevance: 0, + begin: '\\]\\[', + end: '\\]', + excludeBegin: true, + excludeEnd: true + } + ] + }; + const BOLD = { + className: 'strong', + contains: [], // defined later + variants: [ + { + begin: /_{2}(?!\s)/, + end: /_{2}/ + }, + { + begin: /\*{2}(?!\s)/, + end: /\*{2}/ + } + ] + }; + const ITALIC = { + className: 'emphasis', + contains: [], // defined later + variants: [ + { + begin: /\*(?![*\s])/, + end: /\*/ + }, + { + begin: /_(?![_\s])/, + end: /_/, + relevance: 0 + } + ] + }; + + // 3 level deep nesting is not allowed because it would create confusion + // in cases like `***testing***` because where we don't know if the last + // `***` is starting a new bold/italic or finishing the last one + const BOLD_WITHOUT_ITALIC = hljs.inherit(BOLD, { contains: [] }); + const ITALIC_WITHOUT_BOLD = hljs.inherit(ITALIC, { contains: [] }); + BOLD.contains.push(ITALIC_WITHOUT_BOLD); + ITALIC.contains.push(BOLD_WITHOUT_ITALIC); + + let CONTAINABLE = [ + INLINE_HTML, + LINK + ]; + + [ + BOLD, + ITALIC, + BOLD_WITHOUT_ITALIC, + ITALIC_WITHOUT_BOLD + ].forEach(m => { + m.contains = m.contains.concat(CONTAINABLE); + }); + + CONTAINABLE = CONTAINABLE.concat(BOLD, ITALIC); + + const HEADER = { + className: 'section', + variants: [ + { + begin: '^#{1,6}', + end: '$', + contains: CONTAINABLE + }, + { + begin: '(?=^.+?\\n[=-]{2,}$)', + contains: [ + { begin: '^[=-]*$' }, + { + begin: '^', + end: "\\n", + contains: CONTAINABLE + } + ] + } + ] + }; + + const BLOCKQUOTE = { + className: 'quote', + begin: '^>\\s+', + contains: CONTAINABLE, + end: '$' + }; + + const ENTITY = { + //https://spec.commonmark.org/0.31.2/#entity-references + scope: 'literal', + match: /&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/ + }; + + return { + name: 'Markdown', + aliases: [ + 'md', + 'mkdown', + 'mkd' + ], + contains: [ + HEADER, + INLINE_HTML, + LIST, + BOLD, + ITALIC, + BLOCKQUOTE, + CODE, + HORIZONTAL_RULE, + LINK, + LINK_REFERENCE, + ENTITY + ] + }; + } + + return markdown; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/markdown.min.js b/backend/static/highlight(1)/es/languages/markdown.min.js new file mode 100644 index 0000000..326b0bf --- /dev/null +++ b/backend/static/highlight(1)/es/languages/markdown.min.js @@ -0,0 +1,32 @@ +/*! `markdown` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{const n={begin:/<\/?[A-Za-z_]/, +end:">",subLanguage:"xml",relevance:0},a={variants:[{begin:/\[.+?\]\[.*?\]/, +relevance:0},{ +begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, +relevance:2},{ +begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), +relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ +begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/ +},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, +returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", +end:"\\]",excludeBegin:!0,excludeEnd:!0}]},i={className:"strong",contains:[], +variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}] +},s={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{ +begin:/_(?![_\s])/,end:/_/,relevance:0}]},c=e.inherit(i,{contains:[] +}),t=e.inherit(s,{contains:[]});i.contains.push(t),s.contains.push(c) +;let l=[n,a];return[i,s,c,t].forEach((e=>{e.contains=e.contains.concat(l) +})),l=l.concat(i,s),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:l},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:l}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:l, +end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ +begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ +begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", +contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ +begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ +className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ +className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},{scope:"literal", +match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/objectivec.js b/backend/static/highlight(1)/es/languages/objectivec.js new file mode 100644 index 0000000..f5f214e --- /dev/null +++ b/backend/static/highlight(1)/es/languages/objectivec.js @@ -0,0 +1,261 @@ +/*! `objectivec` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: Objective-C + Author: Valerii Hiora + Contributors: Angel G. Olloqui , Matt Diephouse , Andrew Farmer , Minh Nguyễn + Website: https://developer.apple.com/documentation/objectivec + Category: common + */ + + function objectivec(hljs) { + const API_CLASS = { + className: 'built_in', + begin: '\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+' + }; + const IDENTIFIER_RE = /[a-zA-Z@][a-zA-Z0-9_]*/; + const TYPES = [ + "int", + "float", + "char", + "unsigned", + "signed", + "short", + "long", + "double", + "wchar_t", + "unichar", + "void", + "bool", + "BOOL", + "id|0", + "_Bool" + ]; + const KWS = [ + "while", + "export", + "sizeof", + "typedef", + "const", + "struct", + "for", + "union", + "volatile", + "static", + "mutable", + "if", + "do", + "return", + "goto", + "enum", + "else", + "break", + "extern", + "asm", + "case", + "default", + "register", + "explicit", + "typename", + "switch", + "continue", + "inline", + "readonly", + "assign", + "readwrite", + "self", + "@synchronized", + "id", + "typeof", + "nonatomic", + "IBOutlet", + "IBAction", + "strong", + "weak", + "copy", + "in", + "out", + "inout", + "bycopy", + "byref", + "oneway", + "__strong", + "__weak", + "__block", + "__autoreleasing", + "@private", + "@protected", + "@public", + "@try", + "@property", + "@end", + "@throw", + "@catch", + "@finally", + "@autoreleasepool", + "@synthesize", + "@dynamic", + "@selector", + "@optional", + "@required", + "@encode", + "@package", + "@import", + "@defs", + "@compatibility_alias", + "__bridge", + "__bridge_transfer", + "__bridge_retained", + "__bridge_retain", + "__covariant", + "__contravariant", + "__kindof", + "_Nonnull", + "_Nullable", + "_Null_unspecified", + "__FUNCTION__", + "__PRETTY_FUNCTION__", + "__attribute__", + "getter", + "setter", + "retain", + "unsafe_unretained", + "nonnull", + "nullable", + "null_unspecified", + "null_resettable", + "class", + "instancetype", + "NS_DESIGNATED_INITIALIZER", + "NS_UNAVAILABLE", + "NS_REQUIRES_SUPER", + "NS_RETURNS_INNER_POINTER", + "NS_INLINE", + "NS_AVAILABLE", + "NS_DEPRECATED", + "NS_ENUM", + "NS_OPTIONS", + "NS_SWIFT_UNAVAILABLE", + "NS_ASSUME_NONNULL_BEGIN", + "NS_ASSUME_NONNULL_END", + "NS_REFINED_FOR_SWIFT", + "NS_SWIFT_NAME", + "NS_SWIFT_NOTHROW", + "NS_DURING", + "NS_HANDLER", + "NS_ENDHANDLER", + "NS_VALUERETURN", + "NS_VOIDRETURN" + ]; + const LITERALS = [ + "false", + "true", + "FALSE", + "TRUE", + "nil", + "YES", + "NO", + "NULL" + ]; + const BUILT_INS = [ + "dispatch_once_t", + "dispatch_queue_t", + "dispatch_sync", + "dispatch_async", + "dispatch_once" + ]; + const KEYWORDS = { + "variable.language": [ + "this", + "super" + ], + $pattern: IDENTIFIER_RE, + keyword: KWS, + literal: LITERALS, + built_in: BUILT_INS, + type: TYPES + }; + const CLASS_KEYWORDS = { + $pattern: IDENTIFIER_RE, + keyword: [ + "@interface", + "@class", + "@protocol", + "@implementation" + ] + }; + return { + name: 'Objective-C', + aliases: [ + 'mm', + 'objc', + 'obj-c', + 'obj-c++', + 'objective-c++' + ], + keywords: KEYWORDS, + illegal: '/, + end: /$/, + illegal: '\\n' + }, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + { + className: 'class', + begin: '(' + CLASS_KEYWORDS.keyword.join('|') + ')\\b', + end: /(\{|$)/, + excludeEnd: true, + keywords: CLASS_KEYWORDS, + contains: [ hljs.UNDERSCORE_TITLE_MODE ] + }, + { + begin: '\\.' + hljs.UNDERSCORE_IDENT_RE, + relevance: 0 + } + ] + }; + } + + return objectivec; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/objectivec.min.js b/backend/static/highlight(1)/es/languages/objectivec.min.js new file mode 100644 index 0000000..68df5a0 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/objectivec.min.js @@ -0,0 +1,23 @@ +/*! `objectivec` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{ +const _=/[a-zA-Z@][a-zA-Z0-9_]*/,n={$pattern:_, +keyword:["@interface","@class","@protocol","@implementation"]};return{ +name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], +keywords:{"variable.language":["this","super"],$pattern:_, +keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"], +literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"], +built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"], +type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"] +},illegal:"/,end:/$/,illegal:"\\n" +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class", +begin:"("+n.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:n, +contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE, +relevance:0}]}}})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/perl.js b/backend/static/highlight(1)/es/languages/perl.js new file mode 100644 index 0000000..d6aadbf --- /dev/null +++ b/backend/static/highlight(1)/es/languages/perl.js @@ -0,0 +1,512 @@ +/*! `perl` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: Perl + Author: Peter Leonov + Website: https://www.perl.org + Category: common + */ + + /** @type LanguageFn */ + function perl(hljs) { + const regex = hljs.regex; + const KEYWORDS = [ + 'abs', + 'accept', + 'alarm', + 'and', + 'atan2', + 'bind', + 'binmode', + 'bless', + 'break', + 'caller', + 'chdir', + 'chmod', + 'chomp', + 'chop', + 'chown', + 'chr', + 'chroot', + 'class', + 'close', + 'closedir', + 'connect', + 'continue', + 'cos', + 'crypt', + 'dbmclose', + 'dbmopen', + 'defined', + 'delete', + 'die', + 'do', + 'dump', + 'each', + 'else', + 'elsif', + 'endgrent', + 'endhostent', + 'endnetent', + 'endprotoent', + 'endpwent', + 'endservent', + 'eof', + 'eval', + 'exec', + 'exists', + 'exit', + 'exp', + 'fcntl', + 'field', + 'fileno', + 'flock', + 'for', + 'foreach', + 'fork', + 'format', + 'formline', + 'getc', + 'getgrent', + 'getgrgid', + 'getgrnam', + 'gethostbyaddr', + 'gethostbyname', + 'gethostent', + 'getlogin', + 'getnetbyaddr', + 'getnetbyname', + 'getnetent', + 'getpeername', + 'getpgrp', + 'getpriority', + 'getprotobyname', + 'getprotobynumber', + 'getprotoent', + 'getpwent', + 'getpwnam', + 'getpwuid', + 'getservbyname', + 'getservbyport', + 'getservent', + 'getsockname', + 'getsockopt', + 'given', + 'glob', + 'gmtime', + 'goto', + 'grep', + 'gt', + 'hex', + 'if', + 'index', + 'int', + 'ioctl', + 'join', + 'keys', + 'kill', + 'last', + 'lc', + 'lcfirst', + 'length', + 'link', + 'listen', + 'local', + 'localtime', + 'log', + 'lstat', + 'lt', + 'ma', + 'map', + 'method', + 'mkdir', + 'msgctl', + 'msgget', + 'msgrcv', + 'msgsnd', + 'my', + 'ne', + 'next', + 'no', + 'not', + 'oct', + 'open', + 'opendir', + 'or', + 'ord', + 'our', + 'pack', + 'package', + 'pipe', + 'pop', + 'pos', + 'print', + 'printf', + 'prototype', + 'push', + 'q|0', + 'qq', + 'quotemeta', + 'qw', + 'qx', + 'rand', + 'read', + 'readdir', + 'readline', + 'readlink', + 'readpipe', + 'recv', + 'redo', + 'ref', + 'rename', + 'require', + 'reset', + 'return', + 'reverse', + 'rewinddir', + 'rindex', + 'rmdir', + 'say', + 'scalar', + 'seek', + 'seekdir', + 'select', + 'semctl', + 'semget', + 'semop', + 'send', + 'setgrent', + 'sethostent', + 'setnetent', + 'setpgrp', + 'setpriority', + 'setprotoent', + 'setpwent', + 'setservent', + 'setsockopt', + 'shift', + 'shmctl', + 'shmget', + 'shmread', + 'shmwrite', + 'shutdown', + 'sin', + 'sleep', + 'socket', + 'socketpair', + 'sort', + 'splice', + 'split', + 'sprintf', + 'sqrt', + 'srand', + 'stat', + 'state', + 'study', + 'sub', + 'substr', + 'symlink', + 'syscall', + 'sysopen', + 'sysread', + 'sysseek', + 'system', + 'syswrite', + 'tell', + 'telldir', + 'tie', + 'tied', + 'time', + 'times', + 'tr', + 'truncate', + 'uc', + 'ucfirst', + 'umask', + 'undef', + 'unless', + 'unlink', + 'unpack', + 'unshift', + 'untie', + 'until', + 'use', + 'utime', + 'values', + 'vec', + 'wait', + 'waitpid', + 'wantarray', + 'warn', + 'when', + 'while', + 'write', + 'x|0', + 'xor', + 'y|0' + ]; + + // https://perldoc.perl.org/perlre#Modifiers + const REGEX_MODIFIERS = /[dualxmsipngr]{0,12}/; // aa and xx are valid, making max length 12 + const PERL_KEYWORDS = { + $pattern: /[\w.]+/, + keyword: KEYWORDS.join(" ") + }; + const SUBST = { + className: 'subst', + begin: '[$@]\\{', + end: '\\}', + keywords: PERL_KEYWORDS + }; + const METHOD = { + begin: /->\{/, + end: /\}/ + // contains defined later + }; + const ATTR = { + scope: 'attr', + match: /\s+:\s*\w+(\s*\(.*?\))?/, + }; + const VAR = { + scope: 'variable', + variants: [ + { begin: /\$\d/ }, + { begin: regex.concat( + /[$%@](?!")(\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/, + // negative look-ahead tries to avoid matching patterns that are not + // Perl at all like $ident$, @ident@, etc. + `(?![A-Za-z])(?![@$%])` + ) + }, + { + // Only $= is a special Perl variable and one can't declare @= or %=. + begin: /[$%@](?!")[^\s\w{=]|\$=/, + relevance: 0 + } + ], + contains: [ ATTR ], + }; + const NUMBER = { + className: 'number', + variants: [ + // decimal numbers: + // include the case where a number starts with a dot (eg. .9), and + // the leading 0? avoids mixing the first and second match on 0.x cases + { match: /0?\.[0-9][0-9_]+\b/ }, + // include the special versioned number (eg. v5.38) + { match: /\bv?(0|[1-9][0-9_]*(\.[0-9_]+)?|[1-9][0-9_]*)\b/ }, + // non-decimal numbers: + { match: /\b0[0-7][0-7_]*\b/ }, + { match: /\b0x[0-9a-fA-F][0-9a-fA-F_]*\b/ }, + { match: /\b0b[0-1][0-1_]*\b/ }, + ], + relevance: 0 + }; + const STRING_CONTAINS = [ + hljs.BACKSLASH_ESCAPE, + SUBST, + VAR + ]; + const REGEX_DELIMS = [ + /!/, + /\//, + /\|/, + /\?/, + /'/, + /"/, // valid but infrequent and weird + /#/ // valid but infrequent and weird + ]; + /** + * @param {string|RegExp} prefix + * @param {string|RegExp} open + * @param {string|RegExp} close + */ + const PAIRED_DOUBLE_RE = (prefix, open, close = '\\1') => { + const middle = (close === '\\1') + ? close + : regex.concat(close, open); + return regex.concat( + regex.concat("(?:", prefix, ")"), + open, + /(?:\\.|[^\\\/])*?/, + middle, + /(?:\\.|[^\\\/])*?/, + close, + REGEX_MODIFIERS + ); + }; + /** + * @param {string|RegExp} prefix + * @param {string|RegExp} open + * @param {string|RegExp} close + */ + const PAIRED_RE = (prefix, open, close) => { + return regex.concat( + regex.concat("(?:", prefix, ")"), + open, + /(?:\\.|[^\\\/])*?/, + close, + REGEX_MODIFIERS + ); + }; + const PERL_DEFAULT_CONTAINS = [ + VAR, + hljs.HASH_COMMENT_MODE, + hljs.COMMENT( + /^=\w/, + /=cut/, + { endsWithParent: true } + ), + METHOD, + { + className: 'string', + contains: STRING_CONTAINS, + variants: [ + { + begin: 'q[qwxr]?\\s*\\(', + end: '\\)', + relevance: 5 + }, + { + begin: 'q[qwxr]?\\s*\\[', + end: '\\]', + relevance: 5 + }, + { + begin: 'q[qwxr]?\\s*\\{', + end: '\\}', + relevance: 5 + }, + { + begin: 'q[qwxr]?\\s*\\|', + end: '\\|', + relevance: 5 + }, + { + begin: 'q[qwxr]?\\s*<', + end: '>', + relevance: 5 + }, + { + begin: 'qw\\s+q', + end: 'q', + relevance: 5 + }, + { + begin: '\'', + end: '\'', + contains: [ hljs.BACKSLASH_ESCAPE ] + }, + { + begin: '"', + end: '"' + }, + { + begin: '`', + end: '`', + contains: [ hljs.BACKSLASH_ESCAPE ] + }, + { + begin: /\{\w+\}/, + relevance: 0 + }, + { + begin: '-?\\w+\\s*=>', + relevance: 0 + } + ] + }, + NUMBER, + { // regexp container + begin: '(\\/\\/|' + hljs.RE_STARTERS_RE + '|\\b(split|return|print|reverse|grep)\\b)\\s*', + keywords: 'split return print reverse grep', + relevance: 0, + contains: [ + hljs.HASH_COMMENT_MODE, + { + className: 'regexp', + variants: [ + // allow matching common delimiters + { begin: PAIRED_DOUBLE_RE("s|tr|y", regex.either(...REGEX_DELIMS, { capture: true })) }, + // and then paired delmis + { begin: PAIRED_DOUBLE_RE("s|tr|y", "\\(", "\\)") }, + { begin: PAIRED_DOUBLE_RE("s|tr|y", "\\[", "\\]") }, + { begin: PAIRED_DOUBLE_RE("s|tr|y", "\\{", "\\}") } + ], + relevance: 2 + }, + { + className: 'regexp', + variants: [ + { + // could be a comment in many languages so do not count + // as relevant + begin: /(m|qr)\/\//, + relevance: 0 + }, + // prefix is optional with /regex/ + { begin: PAIRED_RE("(?:m|qr)?", /\//, /\//) }, + // allow matching common delimiters + { begin: PAIRED_RE("m|qr", regex.either(...REGEX_DELIMS, { capture: true }), /\1/) }, + // allow common paired delmins + { begin: PAIRED_RE("m|qr", /\(/, /\)/) }, + { begin: PAIRED_RE("m|qr", /\[/, /\]/) }, + { begin: PAIRED_RE("m|qr", /\{/, /\}/) } + ] + } + ] + }, + { + className: 'function', + beginKeywords: 'sub method', + end: '(\\s*\\(.*?\\))?[;{]', + excludeEnd: true, + relevance: 5, + contains: [ hljs.TITLE_MODE, ATTR ] + }, + { + className: 'class', + beginKeywords: 'class', + end: '[;{]', + excludeEnd: true, + relevance: 5, + contains: [ hljs.TITLE_MODE, ATTR, NUMBER ] + }, + { + begin: '-\\w\\b', + relevance: 0 + }, + { + begin: "^__DATA__$", + end: "^__END__$", + subLanguage: 'mojolicious', + contains: [ + { + begin: "^@@.*", + end: "$", + className: "comment" + } + ] + } + ]; + SUBST.contains = PERL_DEFAULT_CONTAINS; + METHOD.contains = PERL_DEFAULT_CONTAINS; + + return { + name: 'Perl', + aliases: [ + 'pl', + 'pm' + ], + keywords: PERL_KEYWORDS, + contains: PERL_DEFAULT_CONTAINS + }; + } + + return perl; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/perl.min.js b/backend/static/highlight(1)/es/languages/perl.min.js new file mode 100644 index 0000000..13956dd --- /dev/null +++ b/backend/static/highlight(1)/es/languages/perl.min.js @@ -0,0 +1,40 @@ +/*! `perl` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{ +const n=e.regex,t=/[dualxmsipngr]{0,12}/,s={$pattern:/[\w.]+/, +keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot class close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl field fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map method mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0" +},r={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:s},a={begin:/->\{/, +end:/\}/},i={scope:"attr",match:/\s+:\s*\w+(\s*\(.*?\))?/},c={scope:"variable", +variants:[{begin:/\$\d/},{ +begin:n.concat(/[$%@](?!")(\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])") +},{begin:/[$%@](?!")[^\s\w{=]|\$=/,relevance:0}],contains:[i]},o={ +className:"number",variants:[{match:/0?\.[0-9][0-9_]+\b/},{ +match:/\bv?(0|[1-9][0-9_]*(\.[0-9_]+)?|[1-9][0-9_]*)\b/},{ +match:/\b0[0-7][0-7_]*\b/},{match:/\b0x[0-9a-fA-F][0-9a-fA-F_]*\b/},{ +match:/\b0b[0-1][0-1_]*\b/}],relevance:0 +},l=[e.BACKSLASH_ESCAPE,r,c],g=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],d=(e,s,r="\\1")=>{ +const a="\\1"===r?r:n.concat(r,s) +;return n.concat(n.concat("(?:",e,")"),s,/(?:\\.|[^\\\/])*?/,a,/(?:\\.|[^\\\/])*?/,r,t) +},m=(e,s,r)=>n.concat(n.concat("(?:",e,")"),s,/(?:\\.|[^\\\/])*?/,r,t),p=[c,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{ +endsWithParent:!0}),a,{className:"string",contains:l,variants:[{ +begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[", +end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{ +begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">", +relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'", +contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{ +begin:"-?\\w+\\s*=>",relevance:0}]},o,{ +begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*", +keywords:"split return print reverse grep",relevance:0, +contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{ +begin:d("s|tr|y",n.either(...g,{capture:!0}))},{begin:d("s|tr|y","\\(","\\)")},{ +begin:d("s|tr|y","\\[","\\]")},{begin:d("s|tr|y","\\{","\\}")}],relevance:2},{ +className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{ +begin:m("(?:m|qr)?",/\//,/\//)},{begin:m("m|qr",n.either(...g,{capture:!0 +}),/\1/)},{begin:m("m|qr",/\(/,/\)/)},{begin:m("m|qr",/\[/,/\]/)},{ +begin:m("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub method", +end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE,i] +},{className:"class",beginKeywords:"class",end:"[;{]",excludeEnd:!0,relevance:5, +contains:[e.TITLE_MODE,i,o]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$", +end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$", +className:"comment"}]}];return r.contains=p,a.contains=p,{name:"Perl", +aliases:["pl","pm"],keywords:s,contains:p}}})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/php-template.js b/backend/static/highlight(1)/es/languages/php-template.js new file mode 100644 index 0000000..8c23f73 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/php-template.js @@ -0,0 +1,62 @@ +/*! `php-template` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: PHP Template + Requires: xml.js, php.js + Author: Josh Goebel + Website: https://www.php.net + Category: common + */ + + function phpTemplate(hljs) { + return { + name: "PHP template", + subLanguage: 'xml', + contains: [ + { + begin: /<\?(php|=)?/, + end: /\?>/, + subLanguage: 'php', + contains: [ + // We don't want the php closing tag ?> to close the PHP block when + // inside any of the following blocks: + { + begin: '/\\*', + end: '\\*/', + skip: true + }, + { + begin: 'b"', + end: '"', + skip: true + }, + { + begin: 'b\'', + end: '\'', + skip: true + }, + hljs.inherit(hljs.APOS_STRING_MODE, { + illegal: null, + className: null, + contains: null, + skip: true + }), + hljs.inherit(hljs.QUOTE_STRING_MODE, { + illegal: null, + className: null, + contains: null, + skip: true + }) + ] + } + ] + }; + } + + return phpTemplate; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/php-template.min.js b/backend/static/highlight(1)/es/languages/php-template.min.js new file mode 100644 index 0000000..7397f2d --- /dev/null +++ b/backend/static/highlight(1)/es/languages/php-template.min.js @@ -0,0 +1,8 @@ +/*! `php-template` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return n=>({name:"PHP template", +subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php", +contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{ +begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null, +className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{ +illegal:null,className:null,contains:null,skip:!0})]}]})})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/php.js b/backend/static/highlight(1)/es/languages/php.js new file mode 100644 index 0000000..4bcef62 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/php.js @@ -0,0 +1,633 @@ +/*! `php` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: PHP + Author: Victor Karamzin + Contributors: Evgeny Stepanischev , Ivan Sagalaev + Website: https://www.php.net + Category: common + */ + + /** + * @param {HLJSApi} hljs + * @returns {LanguageDetail} + * */ + function php(hljs) { + const regex = hljs.regex; + // negative look-ahead tries to avoid matching patterns that are not + // Perl at all like $ident$, @ident@, etc. + const NOT_PERL_ETC = /(?![A-Za-z0-9])(?![$])/; + const IDENT_RE = regex.concat( + /[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/, + NOT_PERL_ETC); + // Will not detect camelCase classes + const PASCAL_CASE_CLASS_NAME_RE = regex.concat( + /(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/, + NOT_PERL_ETC); + const UPCASE_NAME_RE = regex.concat( + /[A-Z]+/, + NOT_PERL_ETC); + const VARIABLE = { + scope: 'variable', + match: '\\$+' + IDENT_RE, + }; + const PREPROCESSOR = { + scope: "meta", + variants: [ + { begin: /<\?php/, relevance: 10 }, // boost for obvious PHP + { begin: /<\?=/ }, + // less relevant per PSR-1 which says not to use short-tags + { begin: /<\?/, relevance: 0.1 }, + { begin: /\?>/ } // end php tag + ] + }; + const SUBST = { + scope: 'subst', + variants: [ + { begin: /\$\w+/ }, + { + begin: /\{\$/, + end: /\}/ + } + ] + }; + const SINGLE_QUOTED = hljs.inherit(hljs.APOS_STRING_MODE, { illegal: null, }); + const DOUBLE_QUOTED = hljs.inherit(hljs.QUOTE_STRING_MODE, { + illegal: null, + contains: hljs.QUOTE_STRING_MODE.contains.concat(SUBST), + }); + + const HEREDOC = { + begin: /<<<[ \t]*(?:(\w+)|"(\w+)")\n/, + end: /[ \t]*(\w+)\b/, + contains: hljs.QUOTE_STRING_MODE.contains.concat(SUBST), + 'on:begin': (m, resp) => { resp.data._beginMatch = m[1] || m[2]; }, + 'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); }, + }; + + const NOWDOC = hljs.END_SAME_AS_BEGIN({ + begin: /<<<[ \t]*'(\w+)'\n/, + end: /[ \t]*(\w+)\b/, + }); + // list of valid whitespaces because non-breaking space might be part of a IDENT_RE + const WHITESPACE = '[ \t\n]'; + const STRING = { + scope: 'string', + variants: [ + DOUBLE_QUOTED, + SINGLE_QUOTED, + HEREDOC, + NOWDOC + ] + }; + const NUMBER = { + scope: 'number', + variants: [ + { begin: `\\b0[bB][01]+(?:_[01]+)*\\b` }, // Binary w/ underscore support + { begin: `\\b0[oO][0-7]+(?:_[0-7]+)*\\b` }, // Octals w/ underscore support + { begin: `\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b` }, // Hex w/ underscore support + // Decimals w/ underscore support, with optional fragments and scientific exponent (e) suffix. + { begin: `(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?` } + ], + relevance: 0 + }; + const LITERALS = [ + "false", + "null", + "true" + ]; + const KWS = [ + // Magic constants: + // + "__CLASS__", + "__DIR__", + "__FILE__", + "__FUNCTION__", + "__COMPILER_HALT_OFFSET__", + "__LINE__", + "__METHOD__", + "__NAMESPACE__", + "__TRAIT__", + // Function that look like language construct or language construct that look like function: + // List of keywords that may not require parenthesis + "die", + "echo", + "exit", + "include", + "include_once", + "print", + "require", + "require_once", + // These are not language construct (function) but operate on the currently-executing function and can access the current symbol table + // 'compact extract func_get_arg func_get_args func_num_args get_called_class get_parent_class ' + + // Other keywords: + // + // + "array", + "abstract", + "and", + "as", + "binary", + "bool", + "boolean", + "break", + "callable", + "case", + "catch", + "class", + "clone", + "const", + "continue", + "declare", + "default", + "do", + "double", + "else", + "elseif", + "empty", + "enddeclare", + "endfor", + "endforeach", + "endif", + "endswitch", + "endwhile", + "enum", + "eval", + "extends", + "final", + "finally", + "float", + "for", + "foreach", + "from", + "global", + "goto", + "if", + "implements", + "instanceof", + "insteadof", + "int", + "integer", + "interface", + "isset", + "iterable", + "list", + "match|0", + "mixed", + "new", + "never", + "object", + "or", + "private", + "protected", + "public", + "readonly", + "real", + "return", + "string", + "switch", + "throw", + "trait", + "try", + "unset", + "use", + "var", + "void", + "while", + "xor", + "yield" + ]; + + const BUILT_INS = [ + // Standard PHP library: + // + "Error|0", + "AppendIterator", + "ArgumentCountError", + "ArithmeticError", + "ArrayIterator", + "ArrayObject", + "AssertionError", + "BadFunctionCallException", + "BadMethodCallException", + "CachingIterator", + "CallbackFilterIterator", + "CompileError", + "Countable", + "DirectoryIterator", + "DivisionByZeroError", + "DomainException", + "EmptyIterator", + "ErrorException", + "Exception", + "FilesystemIterator", + "FilterIterator", + "GlobIterator", + "InfiniteIterator", + "InvalidArgumentException", + "IteratorIterator", + "LengthException", + "LimitIterator", + "LogicException", + "MultipleIterator", + "NoRewindIterator", + "OutOfBoundsException", + "OutOfRangeException", + "OuterIterator", + "OverflowException", + "ParentIterator", + "ParseError", + "RangeException", + "RecursiveArrayIterator", + "RecursiveCachingIterator", + "RecursiveCallbackFilterIterator", + "RecursiveDirectoryIterator", + "RecursiveFilterIterator", + "RecursiveIterator", + "RecursiveIteratorIterator", + "RecursiveRegexIterator", + "RecursiveTreeIterator", + "RegexIterator", + "RuntimeException", + "SeekableIterator", + "SplDoublyLinkedList", + "SplFileInfo", + "SplFileObject", + "SplFixedArray", + "SplHeap", + "SplMaxHeap", + "SplMinHeap", + "SplObjectStorage", + "SplObserver", + "SplPriorityQueue", + "SplQueue", + "SplStack", + "SplSubject", + "SplTempFileObject", + "TypeError", + "UnderflowException", + "UnexpectedValueException", + "UnhandledMatchError", + // Reserved interfaces: + // + "ArrayAccess", + "BackedEnum", + "Closure", + "Fiber", + "Generator", + "Iterator", + "IteratorAggregate", + "Serializable", + "Stringable", + "Throwable", + "Traversable", + "UnitEnum", + "WeakReference", + "WeakMap", + // Reserved classes: + // + "Directory", + "__PHP_Incomplete_Class", + "parent", + "php_user_filter", + "self", + "static", + "stdClass" + ]; + + /** Dual-case keywords + * + * ["then","FILE"] => + * ["then", "THEN", "FILE", "file"] + * + * @param {string[]} items */ + const dualCase = (items) => { + /** @type string[] */ + const result = []; + items.forEach(item => { + result.push(item); + if (item.toLowerCase() === item) { + result.push(item.toUpperCase()); + } else { + result.push(item.toLowerCase()); + } + }); + return result; + }; + + const KEYWORDS = { + keyword: KWS, + literal: dualCase(LITERALS), + built_in: BUILT_INS, + }; + + /** + * @param {string[]} items */ + const normalizeKeywords = (items) => { + return items.map(item => { + return item.replace(/\|\d+$/, ""); + }); + }; + + const CONSTRUCTOR_CALL = { variants: [ + { + match: [ + /new/, + regex.concat(WHITESPACE, "+"), + // to prevent built ins from being confused as the class constructor call + regex.concat("(?!", normalizeKeywords(BUILT_INS).join("\\b|"), "\\b)"), + PASCAL_CASE_CLASS_NAME_RE, + ], + scope: { + 1: "keyword", + 4: "title.class", + }, + } + ] }; + + const CONSTANT_REFERENCE = regex.concat(IDENT_RE, "\\b(?!\\()"); + + const LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON = { variants: [ + { + match: [ + regex.concat( + /::/, + regex.lookahead(/(?!class\b)/) + ), + CONSTANT_REFERENCE, + ], + scope: { 2: "variable.constant", }, + }, + { + match: [ + /::/, + /class/, + ], + scope: { 2: "variable.language", }, + }, + { + match: [ + PASCAL_CASE_CLASS_NAME_RE, + regex.concat( + /::/, + regex.lookahead(/(?!class\b)/) + ), + CONSTANT_REFERENCE, + ], + scope: { + 1: "title.class", + 3: "variable.constant", + }, + }, + { + match: [ + PASCAL_CASE_CLASS_NAME_RE, + regex.concat( + "::", + regex.lookahead(/(?!class\b)/) + ), + ], + scope: { 1: "title.class", }, + }, + { + match: [ + PASCAL_CASE_CLASS_NAME_RE, + /::/, + /class/, + ], + scope: { + 1: "title.class", + 3: "variable.language", + }, + } + ] }; + + const NAMED_ARGUMENT = { + scope: 'attr', + match: regex.concat(IDENT_RE, regex.lookahead(':'), regex.lookahead(/(?!::)/)), + }; + const PARAMS_MODE = { + relevance: 0, + begin: /\(/, + end: /\)/, + keywords: KEYWORDS, + contains: [ + NAMED_ARGUMENT, + VARIABLE, + LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON, + hljs.C_BLOCK_COMMENT_MODE, + STRING, + NUMBER, + CONSTRUCTOR_CALL, + ], + }; + const FUNCTION_INVOKE = { + relevance: 0, + match: [ + /\b/, + // to prevent keywords from being confused as the function title + regex.concat("(?!fn\\b|function\\b|", normalizeKeywords(KWS).join("\\b|"), "|", normalizeKeywords(BUILT_INS).join("\\b|"), "\\b)"), + IDENT_RE, + regex.concat(WHITESPACE, "*"), + regex.lookahead(/(?=\()/) + ], + scope: { 3: "title.function.invoke", }, + contains: [ PARAMS_MODE ] + }; + PARAMS_MODE.contains.push(FUNCTION_INVOKE); + + const ATTRIBUTE_CONTAINS = [ + NAMED_ARGUMENT, + LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON, + hljs.C_BLOCK_COMMENT_MODE, + STRING, + NUMBER, + CONSTRUCTOR_CALL, + ]; + + const ATTRIBUTES = { + begin: regex.concat(/#\[\s*\\?/, + regex.either( + PASCAL_CASE_CLASS_NAME_RE, + UPCASE_NAME_RE + ) + ), + beginScope: "meta", + end: /]/, + endScope: "meta", + keywords: { + literal: LITERALS, + keyword: [ + 'new', + 'array', + ] + }, + contains: [ + { + begin: /\[/, + end: /]/, + keywords: { + literal: LITERALS, + keyword: [ + 'new', + 'array', + ] + }, + contains: [ + 'self', + ...ATTRIBUTE_CONTAINS, + ] + }, + ...ATTRIBUTE_CONTAINS, + { + scope: 'meta', + variants: [ + { match: PASCAL_CASE_CLASS_NAME_RE }, + { match: UPCASE_NAME_RE } + ] + } + ] + }; + + return { + case_insensitive: false, + keywords: KEYWORDS, + contains: [ + ATTRIBUTES, + hljs.HASH_COMMENT_MODE, + hljs.COMMENT('//', '$'), + hljs.COMMENT( + '/\\*', + '\\*/', + { contains: [ + { + scope: 'doctag', + match: '@[A-Za-z]+' + } + ] } + ), + { + match: /__halt_compiler\(\);/, + keywords: '__halt_compiler', + starts: { + scope: "comment", + end: hljs.MATCH_NOTHING_RE, + contains: [ + { + match: /\?>/, + scope: "meta", + endsParent: true + } + ] + } + }, + PREPROCESSOR, + { + scope: 'variable.language', + match: /\$this\b/ + }, + VARIABLE, + FUNCTION_INVOKE, + LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON, + { + match: [ + /const/, + /\s/, + IDENT_RE, + ], + scope: { + 1: "keyword", + 3: "variable.constant", + }, + }, + CONSTRUCTOR_CALL, + { + scope: 'function', + relevance: 0, + beginKeywords: 'fn function', + end: /[;{]/, + excludeEnd: true, + illegal: '[$%\\[]', + contains: [ + { beginKeywords: 'use', }, + hljs.UNDERSCORE_TITLE_MODE, + { + begin: '=>', // No markup, just a relevance booster + endsParent: true + }, + { + scope: 'params', + begin: '\\(', + end: '\\)', + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS, + contains: [ + 'self', + ATTRIBUTES, + VARIABLE, + LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON, + hljs.C_BLOCK_COMMENT_MODE, + STRING, + NUMBER + ] + }, + ] + }, + { + scope: 'class', + variants: [ + { + beginKeywords: "enum", + illegal: /[($"]/ + }, + { + beginKeywords: "class interface trait", + illegal: /[:($"]/ + } + ], + relevance: 0, + end: /\{/, + excludeEnd: true, + contains: [ + { beginKeywords: 'extends implements' }, + hljs.UNDERSCORE_TITLE_MODE + ] + }, + // both use and namespace still use "old style" rules (vs multi-match) + // because the namespace name can include `\` and we still want each + // element to be treated as its own *individual* title + { + beginKeywords: 'namespace', + relevance: 0, + end: ';', + illegal: /[.']/, + contains: [ hljs.inherit(hljs.UNDERSCORE_TITLE_MODE, { scope: "title.class" }) ] + }, + { + beginKeywords: 'use', + relevance: 0, + end: ';', + contains: [ + // TODO: title.function vs title.class + { + match: /\b(as|const|function)\b/, + scope: "keyword" + }, + // TODO: could be title.class or title.function + hljs.UNDERSCORE_TITLE_MODE + ] + }, + STRING, + NUMBER, + ] + }; + } + + return php; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/php.min.js b/backend/static/highlight(1)/es/languages/php.min.js new file mode 100644 index 0000000..5d6c6ef --- /dev/null +++ b/backend/static/highlight(1)/es/languages/php.min.js @@ -0,0 +1,59 @@ +/*! `php` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{ +const t=e.regex,a=/(?![A-Za-z0-9])(?![$])/,r=t.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,a),n=t.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,a),o=t.concat(/[A-Z]+/,a),c={ +scope:"variable",match:"\\$+"+r},i={scope:"subst",variants:[{begin:/\$\w+/},{ +begin:/\{\$/,end:/\}/}]},s=e.inherit(e.APOS_STRING_MODE,{illegal:null +}),l="[ \t\n]",d={scope:"string",variants:[e.inherit(e.QUOTE_STRING_MODE,{ +illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(i)}),s,{ +begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/, +contains:e.QUOTE_STRING_MODE.contains.concat(i),"on:begin":(e,t)=>{ +t.data._beginMatch=e[1]||e[2]},"on:end":(e,t)=>{ +t.data._beginMatch!==e[1]&&t.ignoreMatch()}},e.END_SAME_AS_BEGIN({ +begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/})]},_={scope:"number",variants:[{ +begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{ +begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{ +begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?" +}],relevance:0 +},p=["false","null","true"],b=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],E=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],u={ +keyword:b,literal:(e=>{const t=[];return e.forEach((e=>{ +t.push(e),e.toLowerCase()===e?t.push(e.toUpperCase()):t.push(e.toLowerCase()) +})),t})(p),built_in:E},g=e=>e.map((e=>e.replace(/\|\d+$/,""))),h={variants:[{ +match:[/new/,t.concat(l,"+"),t.concat("(?!",g(E).join("\\b|"),"\\b)"),n],scope:{ +1:"keyword",4:"title.class"}}]},m=t.concat(r,"\\b(?!\\()"),f={variants:[{ +match:[t.concat(/::/,t.lookahead(/(?!class\b)/)),m],scope:{2:"variable.constant" +}},{match:[/::/,/class/],scope:{2:"variable.language"}},{ +match:[n,t.concat(/::/,t.lookahead(/(?!class\b)/)),m],scope:{1:"title.class", +3:"variable.constant"}},{match:[n,t.concat("::",t.lookahead(/(?!class\b)/))], +scope:{1:"title.class"}},{match:[n,/::/,/class/],scope:{1:"title.class", +3:"variable.language"}}]},I={scope:"attr", +match:t.concat(r,t.lookahead(":"),t.lookahead(/(?!::)/))},v={relevance:0, +begin:/\(/,end:/\)/,keywords:u,contains:[I,c,f,e.C_BLOCK_COMMENT_MODE,d,_,h] +},O={relevance:0, +match:[/\b/,t.concat("(?!fn\\b|function\\b|",g(b).join("\\b|"),"|",g(E).join("\\b|"),"\\b)"),r,t.concat(l,"*"),t.lookahead(/(?=\()/)], +scope:{3:"title.function.invoke"},contains:[v]};v.contains.push(O) +;const y=[I,f,e.C_BLOCK_COMMENT_MODE,d,_,h],w={ +begin:t.concat(/#\[\s*\\?/,t.either(n,o)),beginScope:"meta",end:/]/, +endScope:"meta",keywords:{literal:p,keyword:["new","array"]},contains:[{ +begin:/\[/,end:/]/,keywords:{literal:p,keyword:["new","array"]}, +contains:["self",...y]},...y,{scope:"meta",variants:[{match:n},{match:o}]}]} +;return{case_insensitive:!1,keywords:u, +contains:[w,e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{ +contains:[{scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/, +keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE, +contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},{scope:"meta",variants:[{ +begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{ +begin:/\?>/}]},{scope:"variable.language",match:/\$this\b/},c,O,f,{ +match:[/const/,/\s/,r],scope:{1:"keyword",3:"variable.constant"}},h,{ +scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/, +excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use" +},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params", +begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:u, +contains:["self",w,c,f,e.C_BLOCK_COMMENT_MODE,d,_]}]},{scope:"class",variants:[{ +beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait", +illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{ +beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ +beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/, +contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{ +beginKeywords:"use",relevance:0,end:";",contains:[{ +match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE]},d,_]} +}})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/plaintext.js b/backend/static/highlight(1)/es/languages/plaintext.js new file mode 100644 index 0000000..fe6e4a5 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/plaintext.js @@ -0,0 +1,27 @@ +/*! `plaintext` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: Plain text + Author: Egor Rogov (e.rogov@postgrespro.ru) + Description: Plain text without any highlighting. + Category: common + */ + + function plaintext(hljs) { + return { + name: 'Plain text', + aliases: [ + 'text', + 'txt' + ], + disableAutodetect: true + }; + } + + return plaintext; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/plaintext.min.js b/backend/static/highlight(1)/es/languages/plaintext.min.js new file mode 100644 index 0000000..f34f357 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/plaintext.min.js @@ -0,0 +1,3 @@ +/*! `plaintext` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return t=>({name:"Plain text", +aliases:["text","txt"],disableAutodetect:!0})})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/python-repl.js b/backend/static/highlight(1)/es/languages/python-repl.js new file mode 100644 index 0000000..1a05e23 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/python-repl.js @@ -0,0 +1,40 @@ +/*! `python-repl` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: Python REPL + Requires: python.js + Author: Josh Goebel + Category: common + */ + + function pythonRepl(hljs) { + return { + aliases: [ 'pycon' ], + contains: [ + { + className: 'meta.prompt', + starts: { + // a space separates the REPL prefix from the actual code + // this is purely for cleaner HTML output + end: / |$/, + starts: { + end: '$', + subLanguage: 'python' + } + }, + variants: [ + { begin: /^>>>(?=[ ]|$)/ }, + { begin: /^\.\.\.(?=[ ]|$)/ } + ] + } + ] + }; + } + + return pythonRepl; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/python-repl.min.js b/backend/static/highlight(1)/es/languages/python-repl.min.js new file mode 100644 index 0000000..c932cc4 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/python-repl.min.js @@ -0,0 +1,5 @@ +/*! `python-repl` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return a=>({aliases:["pycon"],contains:[{ +className:"meta.prompt",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"} +},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]})})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/python.js b/backend/static/highlight(1)/es/languages/python.js new file mode 100644 index 0000000..5ee6c7b --- /dev/null +++ b/backend/static/highlight(1)/es/languages/python.js @@ -0,0 +1,444 @@ +/*! `python` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: Python + Description: Python is an interpreted, object-oriented, high-level programming language with dynamic semantics. + Website: https://www.python.org + Category: common + */ + + function python(hljs) { + const regex = hljs.regex; + const IDENT_RE = /[\p{XID_Start}_]\p{XID_Continue}*/u; + const RESERVED_WORDS = [ + 'and', + 'as', + 'assert', + 'async', + 'await', + 'break', + 'case', + 'class', + 'continue', + 'def', + 'del', + 'elif', + 'else', + 'except', + 'finally', + 'for', + 'from', + 'global', + 'if', + 'import', + 'in', + 'is', + 'lambda', + 'match', + 'nonlocal|10', + 'not', + 'or', + 'pass', + 'raise', + 'return', + 'try', + 'while', + 'with', + 'yield' + ]; + + const BUILT_INS = [ + '__import__', + 'abs', + 'all', + 'any', + 'ascii', + 'bin', + 'bool', + 'breakpoint', + 'bytearray', + 'bytes', + 'callable', + 'chr', + 'classmethod', + 'compile', + 'complex', + 'delattr', + 'dict', + 'dir', + 'divmod', + 'enumerate', + 'eval', + 'exec', + 'filter', + 'float', + 'format', + 'frozenset', + 'getattr', + 'globals', + 'hasattr', + 'hash', + 'help', + 'hex', + 'id', + 'input', + 'int', + 'isinstance', + 'issubclass', + 'iter', + 'len', + 'list', + 'locals', + 'map', + 'max', + 'memoryview', + 'min', + 'next', + 'object', + 'oct', + 'open', + 'ord', + 'pow', + 'print', + 'property', + 'range', + 'repr', + 'reversed', + 'round', + 'set', + 'setattr', + 'slice', + 'sorted', + 'staticmethod', + 'str', + 'sum', + 'super', + 'tuple', + 'type', + 'vars', + 'zip' + ]; + + const LITERALS = [ + '__debug__', + 'Ellipsis', + 'False', + 'None', + 'NotImplemented', + 'True' + ]; + + // https://docs.python.org/3/library/typing.html + // TODO: Could these be supplemented by a CamelCase matcher in certain + // contexts, leaving these remaining only for relevance hinting? + const TYPES = [ + "Any", + "Callable", + "Coroutine", + "Dict", + "List", + "Literal", + "Generic", + "Optional", + "Sequence", + "Set", + "Tuple", + "Type", + "Union" + ]; + + const KEYWORDS = { + $pattern: /[A-Za-z]\w+|__\w+__/, + keyword: RESERVED_WORDS, + built_in: BUILT_INS, + literal: LITERALS, + type: TYPES + }; + + const PROMPT = { + className: 'meta', + begin: /^(>>>|\.\.\.) / + }; + + const SUBST = { + className: 'subst', + begin: /\{/, + end: /\}/, + keywords: KEYWORDS, + illegal: /#/ + }; + + const LITERAL_BRACKET = { + begin: /\{\{/, + relevance: 0 + }; + + const STRING = { + className: 'string', + contains: [ hljs.BACKSLASH_ESCAPE ], + variants: [ + { + begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/, + end: /'''/, + contains: [ + hljs.BACKSLASH_ESCAPE, + PROMPT + ], + relevance: 10 + }, + { + begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/, + end: /"""/, + contains: [ + hljs.BACKSLASH_ESCAPE, + PROMPT + ], + relevance: 10 + }, + { + begin: /([fF][rR]|[rR][fF]|[fF])'''/, + end: /'''/, + contains: [ + hljs.BACKSLASH_ESCAPE, + PROMPT, + LITERAL_BRACKET, + SUBST + ] + }, + { + begin: /([fF][rR]|[rR][fF]|[fF])"""/, + end: /"""/, + contains: [ + hljs.BACKSLASH_ESCAPE, + PROMPT, + LITERAL_BRACKET, + SUBST + ] + }, + { + begin: /([uU]|[rR])'/, + end: /'/, + relevance: 10 + }, + { + begin: /([uU]|[rR])"/, + end: /"/, + relevance: 10 + }, + { + begin: /([bB]|[bB][rR]|[rR][bB])'/, + end: /'/ + }, + { + begin: /([bB]|[bB][rR]|[rR][bB])"/, + end: /"/ + }, + { + begin: /([fF][rR]|[rR][fF]|[fF])'/, + end: /'/, + contains: [ + hljs.BACKSLASH_ESCAPE, + LITERAL_BRACKET, + SUBST + ] + }, + { + begin: /([fF][rR]|[rR][fF]|[fF])"/, + end: /"/, + contains: [ + hljs.BACKSLASH_ESCAPE, + LITERAL_BRACKET, + SUBST + ] + }, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE + ] + }; + + // https://docs.python.org/3.9/reference/lexical_analysis.html#numeric-literals + const digitpart = '[0-9](_?[0-9])*'; + const pointfloat = `(\\b(${digitpart}))?\\.(${digitpart})|\\b(${digitpart})\\.`; + // Whitespace after a number (or any lexical token) is needed only if its absence + // would change the tokenization + // https://docs.python.org/3.9/reference/lexical_analysis.html#whitespace-between-tokens + // We deviate slightly, requiring a word boundary or a keyword + // to avoid accidentally recognizing *prefixes* (e.g., `0` in `0x41` or `08` or `0__1`) + const lookahead = `\\b|${RESERVED_WORDS.join('|')}`; + const NUMBER = { + className: 'number', + relevance: 0, + variants: [ + // exponentfloat, pointfloat + // https://docs.python.org/3.9/reference/lexical_analysis.html#floating-point-literals + // optionally imaginary + // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals + // Note: no leading \b because floats can start with a decimal point + // and we don't want to mishandle e.g. `fn(.5)`, + // no trailing \b for pointfloat because it can end with a decimal point + // and we don't want to mishandle e.g. `0..hex()`; this should be safe + // because both MUST contain a decimal point and so cannot be confused with + // the interior part of an identifier + { + begin: `(\\b(${digitpart})|(${pointfloat}))[eE][+-]?(${digitpart})[jJ]?(?=${lookahead})` + }, + { + begin: `(${pointfloat})[jJ]?` + }, + + // decinteger, bininteger, octinteger, hexinteger + // https://docs.python.org/3.9/reference/lexical_analysis.html#integer-literals + // optionally "long" in Python 2 + // https://docs.python.org/2.7/reference/lexical_analysis.html#integer-and-long-integer-literals + // decinteger is optionally imaginary + // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals + { + begin: `\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${lookahead})` + }, + { + begin: `\\b0[bB](_?[01])+[lL]?(?=${lookahead})` + }, + { + begin: `\\b0[oO](_?[0-7])+[lL]?(?=${lookahead})` + }, + { + begin: `\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${lookahead})` + }, + + // imagnumber (digitpart-based) + // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals + { + begin: `\\b(${digitpart})[jJ](?=${lookahead})` + } + ] + }; + const COMMENT_TYPE = { + className: "comment", + begin: regex.lookahead(/# type:/), + end: /$/, + keywords: KEYWORDS, + contains: [ + { // prevent keywords from coloring `type` + begin: /# type:/ + }, + // comment within a datatype comment includes no keywords + { + begin: /#/, + end: /\b\B/, + endsWithParent: true + } + ] + }; + const PARAMS = { + className: 'params', + variants: [ + // Exclude params in functions without params + { + className: "", + begin: /\(\s*\)/, + skip: true + }, + { + begin: /\(/, + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS, + contains: [ + 'self', + PROMPT, + NUMBER, + STRING, + hljs.HASH_COMMENT_MODE + ] + } + ] + }; + SUBST.contains = [ + STRING, + NUMBER, + PROMPT + ]; + + return { + name: 'Python', + aliases: [ + 'py', + 'gyp', + 'ipython' + ], + unicodeRegex: true, + keywords: KEYWORDS, + illegal: /(<\/|\?)|=>/, + contains: [ + PROMPT, + NUMBER, + { + // very common convention + scope: 'variable.language', + match: /\bself\b/ + }, + { + // eat "if" prior to string so that it won't accidentally be + // labeled as an f-string + beginKeywords: "if", + relevance: 0 + }, + { match: /\bor\b/, scope: "keyword" }, + STRING, + COMMENT_TYPE, + hljs.HASH_COMMENT_MODE, + { + match: [ + /\bdef/, /\s+/, + IDENT_RE, + ], + scope: { + 1: "keyword", + 3: "title.function" + }, + contains: [ PARAMS ] + }, + { + variants: [ + { + match: [ + /\bclass/, /\s+/, + IDENT_RE, /\s*/, + /\(\s*/, IDENT_RE,/\s*\)/ + ], + }, + { + match: [ + /\bclass/, /\s+/, + IDENT_RE + ], + } + ], + scope: { + 1: "keyword", + 3: "title.class", + 6: "title.class.inherited", + } + }, + { + className: 'meta', + begin: /^[\t ]*@/, + end: /(?=#)|$/, + contains: [ + NUMBER, + PARAMS, + STRING + ] + } + ] + }; + } + + return python; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/python.min.js b/backend/static/highlight(1)/es/languages/python.min.js new file mode 100644 index 0000000..108ccc3 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/python.min.js @@ -0,0 +1,42 @@ +/*! `python` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{ +const n=e.regex,a=/[\p{XID_Start}_]\p{XID_Continue}*/u,s=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],t={ +$pattern:/[A-Za-z]\w+|__\w+__/,keyword:s, +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},i={className:"meta",begin:/^(>>>|\.\.\.) /},r={className:"subst",begin:/\{/, +end:/\}/,keywords:t,illegal:/#/},l={begin:/\{\{/,relevance:0},o={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,i,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,i,l,r]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,l,r]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},b="[0-9](_?[0-9])*",c=`(\\b(${b}))?\\.(${b})|\\b(${b})\\.`,d="\\b|"+s.join("|"),m={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${b})|(${c}))[eE][+-]?(${b})[jJ]?(?=${d})`},{begin:`(${c})[jJ]?`},{ +begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${d})`},{ +begin:`\\b0[bB](_?[01])+[lL]?(?=${d})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${d})` +},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${d})`},{begin:`\\b(${b})[jJ](?=${d})` +}]},g={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:t, +contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},p={ +className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, +end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t, +contains:["self",i,m,o,e.HASH_COMMENT_MODE]}]};return r.contains=[o,m,i],{ +name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:t, +illegal:/(<\/|\?)|=>/,contains:[i,m,{scope:"variable.language",match:/\bself\b/ +},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword" +},o,g,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,a],scope:{1:"keyword", +3:"title.function"},contains:[p]},{variants:[{ +match:[/\bclass/,/\s+/,a,/\s*/,/\(\s*/,a,/\s*\)/]},{match:[/\bclass/,/\s+/,a]}], +scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ +className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[m,p,o]}]}}})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/r.js b/backend/static/highlight(1)/es/languages/r.js new file mode 100644 index 0000000..630a007 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/r.js @@ -0,0 +1,265 @@ +/*! `r` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: R + Description: R is a free software environment for statistical computing and graphics. + Author: Joe Cheng + Contributors: Konrad Rudolph + Website: https://www.r-project.org + Category: common,scientific + */ + + /** @type LanguageFn */ + function r(hljs) { + const regex = hljs.regex; + // Identifiers in R cannot start with `_`, but they can start with `.` if it + // is not immediately followed by a digit. + // R also supports quoted identifiers, which are near-arbitrary sequences + // delimited by backticks (`…`), which may contain escape sequences. These are + // handled in a separate mode. See `test/markup/r/names.txt` for examples. + // FIXME: Support Unicode identifiers. + const IDENT_RE = /(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/; + const NUMBER_TYPES_RE = regex.either( + // Special case: only hexadecimal binary powers can contain fractions + /0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/, + // Hexadecimal numbers without fraction and optional binary power + /0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/, + // Decimal numbers + /(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/ + ); + const OPERATORS_RE = /[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/; + const PUNCTUATION_RE = regex.either( + /[()]/, + /[{}]/, + /\[\[/, + /[[\]]/, + /\\/, + /,/ + ); + + return { + name: 'R', + + keywords: { + $pattern: IDENT_RE, + keyword: + 'function if in break next repeat else for while', + literal: + 'NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 ' + + 'NA_character_|10 NA_complex_|10', + built_in: + // Builtin constants + 'LETTERS letters month.abb month.name pi T F ' + // Primitive functions + // These are all the functions in `base` that are implemented as a + // `.Primitive`, minus those functions that are also keywords. + + 'abs acos acosh all any anyNA Arg as.call as.character ' + + 'as.complex as.double as.environment as.integer as.logical ' + + 'as.null.default as.numeric as.raw asin asinh atan atanh attr ' + + 'attributes baseenv browser c call ceiling class Conj cos cosh ' + + 'cospi cummax cummin cumprod cumsum digamma dim dimnames ' + + 'emptyenv exp expression floor forceAndCall gamma gc.time ' + + 'globalenv Im interactive invisible is.array is.atomic is.call ' + + 'is.character is.complex is.double is.environment is.expression ' + + 'is.finite is.function is.infinite is.integer is.language ' + + 'is.list is.logical is.matrix is.na is.name is.nan is.null ' + + 'is.numeric is.object is.pairlist is.raw is.recursive is.single ' + + 'is.symbol lazyLoadDBfetch length lgamma list log max min ' + + 'missing Mod names nargs nzchar oldClass on.exit pos.to.env ' + + 'proc.time prod quote range Re rep retracemem return round ' + + 'seq_along seq_len seq.int sign signif sin sinh sinpi sqrt ' + + 'standardGeneric substitute sum switch tan tanh tanpi tracemem ' + + 'trigamma trunc unclass untracemem UseMethod xtfrm', + }, + + contains: [ + // Roxygen comments + hljs.COMMENT( + /#'/, + /$/, + { contains: [ + { + // Handle `@examples` separately to cause all subsequent code + // until the next `@`-tag on its own line to be kept as-is, + // preventing highlighting. This code is example R code, so nested + // doctags shouldn’t be treated as such. See + // `test/markup/r/roxygen.txt` for an example. + scope: 'doctag', + match: /@examples/, + starts: { + end: regex.lookahead(regex.either( + // end if another doc comment + /\n^#'\s*(?=@[a-zA-Z]+)/, + // or a line with no comment + /\n^(?!#')/ + )), + endsParent: true + } + }, + { + // Handle `@param` to highlight the parameter name following + // after. + scope: 'doctag', + begin: '@param', + end: /$/, + contains: [ + { + scope: 'variable', + variants: [ + { match: IDENT_RE }, + { match: /`(?:\\.|[^`\\])+`/ } + ], + endsParent: true + } + ] + }, + { + scope: 'doctag', + match: /@[a-zA-Z]+/ + }, + { + scope: 'keyword', + match: /\\[a-zA-Z]+/ + } + ] } + ), + + hljs.HASH_COMMENT_MODE, + + { + scope: 'string', + contains: [ hljs.BACKSLASH_ESCAPE ], + variants: [ + hljs.END_SAME_AS_BEGIN({ + begin: /[rR]"(-*)\(/, + end: /\)(-*)"/ + }), + hljs.END_SAME_AS_BEGIN({ + begin: /[rR]"(-*)\{/, + end: /\}(-*)"/ + }), + hljs.END_SAME_AS_BEGIN({ + begin: /[rR]"(-*)\[/, + end: /\](-*)"/ + }), + hljs.END_SAME_AS_BEGIN({ + begin: /[rR]'(-*)\(/, + end: /\)(-*)'/ + }), + hljs.END_SAME_AS_BEGIN({ + begin: /[rR]'(-*)\{/, + end: /\}(-*)'/ + }), + hljs.END_SAME_AS_BEGIN({ + begin: /[rR]'(-*)\[/, + end: /\](-*)'/ + }), + { + begin: '"', + end: '"', + relevance: 0 + }, + { + begin: "'", + end: "'", + relevance: 0 + } + ], + }, + + // Matching numbers immediately following punctuation and operators is + // tricky since we need to look at the character ahead of a number to + // ensure the number is not part of an identifier, and we cannot use + // negative look-behind assertions. So instead we explicitly handle all + // possible combinations of (operator|punctuation), number. + // TODO: replace with negative look-behind when available + // { begin: /(?{"use strict";return e=>{ +const a=e.regex,n=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,s=a.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),i=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,t=a.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/) +;return{name:"R",keywords:{$pattern:n, +keyword:"function if in break next repeat else for while", +literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", +built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" +},contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/, +starts:{end:a.lookahead(a.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)), +endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{ +scope:"variable",variants:[{match:n},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0 +}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}] +}),e.HASH_COMMENT_MODE,{scope:"string",contains:[e.BACKSLASH_ESCAPE], +variants:[e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"', +relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{ +1:"operator",2:"number"},match:[i,s]},{scope:{1:"operator",2:"number"}, +match:[/%[^%]*%/,s]},{scope:{1:"punctuation",2:"number"},match:[t,s]},{scope:{ +2:"number"},match:[/[^a-zA-Z0-9._]|^/,s]}]},{scope:{3:"operator"}, +match:[n,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:i},{ +match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:t},{begin:"`",end:"`", +contains:[{begin:/\\./}]}]}}})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/ruby.js b/backend/static/highlight(1)/es/languages/ruby.js new file mode 100644 index 0000000..39c1906 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/ruby.js @@ -0,0 +1,456 @@ +/*! `ruby` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: Ruby + Description: Ruby is a dynamic, open source programming language with a focus on simplicity and productivity. + Website: https://www.ruby-lang.org/ + Author: Anton Kovalyov + Contributors: Peter Leonov , Vasily Polovnyov , Loren Segal , Pascal Hurni , Cedric Sohrauer + Category: common, scripting + */ + + function ruby(hljs) { + const regex = hljs.regex; + const RUBY_METHOD_RE = '([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)'; + // TODO: move concepts like CAMEL_CASE into `modes.js` + const CLASS_NAME_RE = regex.either( + /\b([A-Z]+[a-z0-9]+)+/, + // ends in caps + /\b([A-Z]+[a-z0-9]+)+[A-Z]+/, + ) + ; + const CLASS_NAME_WITH_NAMESPACE_RE = regex.concat(CLASS_NAME_RE, /(::\w+)*/); + // very popular ruby built-ins that one might even assume + // are actual keywords (despite that not being the case) + const PSEUDO_KWS = [ + "include", + "extend", + "prepend", + "public", + "private", + "protected", + "raise", + "throw" + ]; + const RUBY_KEYWORDS = { + "variable.constant": [ + "__FILE__", + "__LINE__", + "__ENCODING__" + ], + "variable.language": [ + "self", + "super", + ], + keyword: [ + "alias", + "and", + "begin", + "BEGIN", + "break", + "case", + "class", + "defined", + "do", + "else", + "elsif", + "end", + "END", + "ensure", + "for", + "if", + "in", + "module", + "next", + "not", + "or", + "redo", + "require", + "rescue", + "retry", + "return", + "then", + "undef", + "unless", + "until", + "when", + "while", + "yield", + ...PSEUDO_KWS + ], + built_in: [ + "proc", + "lambda", + "attr_accessor", + "attr_reader", + "attr_writer", + "define_method", + "private_constant", + "module_function" + ], + literal: [ + "true", + "false", + "nil" + ] + }; + const YARDOCTAG = { + className: 'doctag', + begin: '@[A-Za-z]+' + }; + const IRB_OBJECT = { + begin: '#<', + end: '>' + }; + const COMMENT_MODES = [ + hljs.COMMENT( + '#', + '$', + { contains: [ YARDOCTAG ] } + ), + hljs.COMMENT( + '^=begin', + '^=end', + { + contains: [ YARDOCTAG ], + relevance: 10 + } + ), + hljs.COMMENT('^__END__', hljs.MATCH_NOTHING_RE) + ]; + const SUBST = { + className: 'subst', + begin: /#\{/, + end: /\}/, + keywords: RUBY_KEYWORDS + }; + const STRING = { + className: 'string', + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + variants: [ + { + begin: /'/, + end: /'/ + }, + { + begin: /"/, + end: /"/ + }, + { + begin: /`/, + end: /`/ + }, + { + begin: /%[qQwWx]?\(/, + end: /\)/ + }, + { + begin: /%[qQwWx]?\[/, + end: /\]/ + }, + { + begin: /%[qQwWx]?\{/, + end: /\}/ + }, + { + begin: /%[qQwWx]?/ + }, + { + begin: /%[qQwWx]?\//, + end: /\// + }, + { + begin: /%[qQwWx]?%/, + end: /%/ + }, + { + begin: /%[qQwWx]?-/, + end: /-/ + }, + { + begin: /%[qQwWx]?\|/, + end: /\|/ + }, + // in the following expressions, \B in the beginning suppresses recognition of ?-sequences + // where ? is the last character of a preceding identifier, as in: `func?4` + { begin: /\B\?(\\\d{1,3})/ }, + { begin: /\B\?(\\x[A-Fa-f0-9]{1,2})/ }, + { begin: /\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/ }, + { begin: /\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/ }, + { begin: /\B\?\\(c|C-)[\x20-\x7e]/ }, + { begin: /\B\?\\?\S/ }, + // heredocs + { + // this guard makes sure that we have an entire heredoc and not a false + // positive (auto-detect, etc.) + begin: regex.concat( + /<<[-~]?'?/, + regex.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/) + ), + contains: [ + hljs.END_SAME_AS_BEGIN({ + begin: /(\w+)/, + end: /(\w+)/, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ] + }) + ] + } + ] + }; + + // Ruby syntax is underdocumented, but this grammar seems to be accurate + // as of version 2.7.2 (confirmed with (irb and `Ripper.sexp(...)`) + // https://docs.ruby-lang.org/en/2.7.0/doc/syntax/literals_rdoc.html#label-Numbers + const decimal = '[1-9](_?[0-9])*|0'; + const digits = '[0-9](_?[0-9])*'; + const NUMBER = { + className: 'number', + relevance: 0, + variants: [ + // decimal integer/float, optionally exponential or rational, optionally imaginary + { begin: `\\b(${decimal})(\\.(${digits}))?([eE][+-]?(${digits})|r)?i?\\b` }, + + // explicit decimal/binary/octal/hexadecimal integer, + // optionally rational and/or imaginary + { begin: "\\b0[dD][0-9](_?[0-9])*r?i?\\b" }, + { begin: "\\b0[bB][0-1](_?[0-1])*r?i?\\b" }, + { begin: "\\b0[oO][0-7](_?[0-7])*r?i?\\b" }, + { begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b" }, + + // 0-prefixed implicit octal integer, optionally rational and/or imaginary + { begin: "\\b0(_?[0-7])+r?i?\\b" } + ] + }; + + const PARAMS = { + variants: [ + { + match: /\(\)/, + }, + { + className: 'params', + begin: /\(/, + end: /(?=\))/, + excludeBegin: true, + endsParent: true, + keywords: RUBY_KEYWORDS, + } + ] + }; + + const INCLUDE_EXTEND = { + match: [ + /(include|extend)\s+/, + CLASS_NAME_WITH_NAMESPACE_RE + ], + scope: { + 2: "title.class" + }, + keywords: RUBY_KEYWORDS + }; + + const CLASS_DEFINITION = { + variants: [ + { + match: [ + /class\s+/, + CLASS_NAME_WITH_NAMESPACE_RE, + /\s+<\s+/, + CLASS_NAME_WITH_NAMESPACE_RE + ] + }, + { + match: [ + /\b(class|module)\s+/, + CLASS_NAME_WITH_NAMESPACE_RE + ] + } + ], + scope: { + 2: "title.class", + 4: "title.class.inherited" + }, + keywords: RUBY_KEYWORDS + }; + + const UPPER_CASE_CONSTANT = { + relevance: 0, + match: /\b[A-Z][A-Z_0-9]+\b/, + className: "variable.constant" + }; + + const METHOD_DEFINITION = { + match: [ + /def/, /\s+/, + RUBY_METHOD_RE + ], + scope: { + 1: "keyword", + 3: "title.function" + }, + contains: [ + PARAMS + ] + }; + + const OBJECT_CREATION = { + relevance: 0, + match: [ + CLASS_NAME_WITH_NAMESPACE_RE, + /\.new[. (]/ + ], + scope: { + 1: "title.class" + } + }; + + // CamelCase + const CLASS_REFERENCE = { + relevance: 0, + match: CLASS_NAME_RE, + scope: "title.class" + }; + + const RUBY_DEFAULT_CONTAINS = [ + STRING, + CLASS_DEFINITION, + INCLUDE_EXTEND, + OBJECT_CREATION, + UPPER_CASE_CONSTANT, + CLASS_REFERENCE, + METHOD_DEFINITION, + { + // swallow namespace qualifiers before symbols + begin: hljs.IDENT_RE + '::' }, + { + className: 'symbol', + begin: hljs.UNDERSCORE_IDENT_RE + '(!|\\?)?:', + relevance: 0 + }, + { + className: 'symbol', + begin: ':(?!\\s)', + contains: [ + STRING, + { begin: RUBY_METHOD_RE } + ], + relevance: 0 + }, + NUMBER, + { + // negative-look forward attempts to prevent false matches like: + // @ident@ or $ident$ that might indicate this is not ruby at all + className: "variable", + begin: '(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])' + `(?![A-Za-z])(?![@$?'])` + }, + { + className: 'params', + begin: /\|(?!=)/, + end: /\|/, + excludeBegin: true, + excludeEnd: true, + relevance: 0, // this could be a lot of things (in other languages) other than params + keywords: RUBY_KEYWORDS + }, + { // regexp container + begin: '(' + hljs.RE_STARTERS_RE + '|unless)\\s*', + keywords: 'unless', + contains: [ + { + className: 'regexp', + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + illegal: /\n/, + variants: [ + { + begin: '/', + end: '/[a-z]*' + }, + { + begin: /%r\{/, + end: /\}[a-z]*/ + }, + { + begin: '%r\\(', + end: '\\)[a-z]*' + }, + { + begin: '%r!', + end: '![a-z]*' + }, + { + begin: '%r\\[', + end: '\\][a-z]*' + } + ] + } + ].concat(IRB_OBJECT, COMMENT_MODES), + relevance: 0 + } + ].concat(IRB_OBJECT, COMMENT_MODES); + + SUBST.contains = RUBY_DEFAULT_CONTAINS; + PARAMS.contains = RUBY_DEFAULT_CONTAINS; + + // >> + // ?> + const SIMPLE_PROMPT = "[>?]>"; + // irb(main):001:0> + const DEFAULT_PROMPT = "[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]"; + const RVM_PROMPT = "(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>"; + + const IRB_DEFAULT = [ + { + begin: /^\s*=>/, + starts: { + end: '$', + contains: RUBY_DEFAULT_CONTAINS + } + }, + { + className: 'meta.prompt', + begin: '^(' + SIMPLE_PROMPT + "|" + DEFAULT_PROMPT + '|' + RVM_PROMPT + ')(?=[ ])', + starts: { + end: '$', + keywords: RUBY_KEYWORDS, + contains: RUBY_DEFAULT_CONTAINS + } + } + ]; + + COMMENT_MODES.unshift(IRB_OBJECT); + + return { + name: 'Ruby', + aliases: [ + 'rb', + 'gemspec', + 'podspec', + 'thor', + 'irb' + ], + keywords: RUBY_KEYWORDS, + illegal: /\/\*/, + contains: [ hljs.SHEBANG({ binary: "ruby" }) ] + .concat(IRB_DEFAULT) + .concat(COMMENT_MODES) + .concat(RUBY_DEFAULT_CONTAINS) + }; + } + + return ruby; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/ruby.min.js b/backend/static/highlight(1)/es/languages/ruby.min.js new file mode 100644 index 0000000..59e52eb --- /dev/null +++ b/backend/static/highlight(1)/es/languages/ruby.min.js @@ -0,0 +1,54 @@ +/*! `ruby` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{ +const n=e.regex,a="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",s=n.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=n.concat(s,/(::\w+)*/),t={ +"variable.constant":["__FILE__","__LINE__","__ENCODING__"], +"variable.language":["self","super"], +keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield","include","extend","prepend","public","private","protected","raise","throw"], +built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"], +literal:["true","false","nil"]},c={className:"doctag",begin:"@[A-Za-z]+"},r={ +begin:"#<",end:">"},b=[e.COMMENT("#","$",{contains:[c] +}),e.COMMENT("^=begin","^=end",{contains:[c],relevance:10 +}),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],l={className:"subst",begin:/#\{/, +end:/\}/,keywords:t},d={className:"string",contains:[e.BACKSLASH_ESCAPE,l], +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{ +begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{ +begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//, +end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{ +begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{ +begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ +begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ +begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ +begin:n.concat(/<<[-~]?'?/,n.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)), +contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, +contains:[e.BACKSLASH_ESCAPE,l]})]}]},o="[0-9](_?[0-9])*",g={className:"number", +relevance:0,variants:[{ +begin:`\\b([1-9](_?[0-9])*|0)(\\.(${o}))?([eE][+-]?(${o})|r)?i?\\b`},{ +begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" +},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ +begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ +begin:"\\b0(_?[0-7])+r?i?\\b"}]},_={variants:[{match:/\(\)/},{ +className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0, +keywords:t}]},m=[d,{variants:[{match:[/class\s+/,i,/\s+<\s+/,i]},{ +match:[/\b(class|module)\s+/,i]}],scope:{2:"title.class", +4:"title.class.inherited"},keywords:t},{match:[/(include|extend)\s+/,i],scope:{ +2:"title.class"},keywords:t},{relevance:0,match:[i,/\.new[. (]/],scope:{ +1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},{relevance:0,match:s,scope:"title.class"},{ +match:[/def/,/\s+/,a],scope:{1:"keyword",3:"title.function"},contains:[_]},{ +begin:e.IDENT_RE+"::"},{className:"symbol", +begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", +begin:":(?!\\s)",contains:[d,{begin:a}],relevance:0},g,{className:"variable", +begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ +className:"params",begin:/\|(?!=)/,end:/\|/,excludeBegin:!0,excludeEnd:!0, +relevance:0,keywords:t},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*", +keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,l], +illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{ +begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[", +end:"\\][a-z]*"}]}].concat(r,b),relevance:0}].concat(r,b) +;l.contains=m,_.contains=m;const u=[{begin:/^\s*=>/,starts:{end:"$",contains:m} +},{className:"meta.prompt", +begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", +starts:{end:"$",keywords:t,contains:m}}];return b.unshift(r),{name:"Ruby", +aliases:["rb","gemspec","podspec","thor","irb"],keywords:t,illegal:/\/\*/, +contains:[e.SHEBANG({binary:"ruby"})].concat(u).concat(b).concat(m)}}})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/rust.js b/backend/static/highlight(1)/es/languages/rust.js new file mode 100644 index 0000000..3c21a5c --- /dev/null +++ b/backend/static/highlight(1)/es/languages/rust.js @@ -0,0 +1,334 @@ +/*! `rust` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: Rust + Author: Andrey Vlasovskikh + Contributors: Roman Shmatov , Kasper Andersen + Website: https://www.rust-lang.org + Category: common, system + */ + + /** @type LanguageFn */ + + function rust(hljs) { + const regex = hljs.regex; + // ============================================ + // Added to support the r# keyword, which is a raw identifier in Rust. + const RAW_IDENTIFIER = /(r#)?/; + const UNDERSCORE_IDENT_RE = regex.concat(RAW_IDENTIFIER, hljs.UNDERSCORE_IDENT_RE); + const IDENT_RE = regex.concat(RAW_IDENTIFIER, hljs.IDENT_RE); + // ============================================ + const FUNCTION_INVOKE = { + className: "title.function.invoke", + relevance: 0, + begin: regex.concat( + /\b/, + /(?!let|for|while|if|else|match\b)/, + IDENT_RE, + regex.lookahead(/\s*\(/)) + }; + const NUMBER_SUFFIX = '([ui](8|16|32|64|128|size)|f(32|64))\?'; + const KEYWORDS = [ + "abstract", + "as", + "async", + "await", + "become", + "box", + "break", + "const", + "continue", + "crate", + "do", + "dyn", + "else", + "enum", + "extern", + "false", + "final", + "fn", + "for", + "if", + "impl", + "in", + "let", + "loop", + "macro", + "match", + "mod", + "move", + "mut", + "override", + "priv", + "pub", + "ref", + "return", + "self", + "Self", + "static", + "struct", + "super", + "trait", + "true", + "try", + "type", + "typeof", + "union", + "unsafe", + "unsized", + "use", + "virtual", + "where", + "while", + "yield" + ]; + const LITERALS = [ + "true", + "false", + "Some", + "None", + "Ok", + "Err" + ]; + const BUILTINS = [ + // functions + 'drop ', + // traits + "Copy", + "Send", + "Sized", + "Sync", + "Drop", + "Fn", + "FnMut", + "FnOnce", + "ToOwned", + "Clone", + "Debug", + "PartialEq", + "PartialOrd", + "Eq", + "Ord", + "AsRef", + "AsMut", + "Into", + "From", + "Default", + "Iterator", + "Extend", + "IntoIterator", + "DoubleEndedIterator", + "ExactSizeIterator", + "SliceConcatExt", + "ToString", + // macros + "assert!", + "assert_eq!", + "bitflags!", + "bytes!", + "cfg!", + "col!", + "concat!", + "concat_idents!", + "debug_assert!", + "debug_assert_eq!", + "env!", + "eprintln!", + "panic!", + "file!", + "format!", + "format_args!", + "include_bytes!", + "include_str!", + "line!", + "local_data_key!", + "module_path!", + "option_env!", + "print!", + "println!", + "select!", + "stringify!", + "try!", + "unimplemented!", + "unreachable!", + "vec!", + "write!", + "writeln!", + "macro_rules!", + "assert_ne!", + "debug_assert_ne!" + ]; + const TYPES = [ + "i8", + "i16", + "i32", + "i64", + "i128", + "isize", + "u8", + "u16", + "u32", + "u64", + "u128", + "usize", + "f32", + "f64", + "str", + "char", + "bool", + "Box", + "Option", + "Result", + "String", + "Vec" + ]; + return { + name: 'Rust', + aliases: [ 'rs' ], + keywords: { + $pattern: hljs.IDENT_RE + '!?', + type: TYPES, + keyword: KEYWORDS, + literal: LITERALS, + built_in: BUILTINS + }, + illegal: '' + }, + FUNCTION_INVOKE + ] + }; + } + + return rust; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/rust.min.js b/backend/static/highlight(1)/es/languages/rust.min.js new file mode 100644 index 0000000..4d3db69 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/rust.min.js @@ -0,0 +1,27 @@ +/*! `rust` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{ +const t=e.regex,n=/(r#)?/,a=t.concat(n,e.UNDERSCORE_IDENT_RE),r=t.concat(n,e.IDENT_RE),i={ +className:"title.function.invoke",relevance:0, +begin:t.concat(/\b/,/(?!let|for|while|if|else|match\b)/,r,t.lookahead(/\s*\(/)) +},s="([ui](8|16|32|64|128|size)|f(32|64))?",l=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","eprintln!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],o=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"] +;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:o, +keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","union","unsafe","unsized","use","virtual","where","while","yield"], +literal:["true","false","Some","None","Ok","Err"],built_in:l},illegal:""},i]}}})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/scss.js b/backend/static/highlight(1)/es/languages/scss.js new file mode 100644 index 0000000..bd31ce4 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/scss.js @@ -0,0 +1,947 @@ +/*! `scss` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + const MODES = (hljs) => { + return { + IMPORTANT: { + scope: 'meta', + begin: '!important' + }, + BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE, + HEXCOLOR: { + scope: 'number', + begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/ + }, + FUNCTION_DISPATCH: { + className: "built_in", + begin: /[\w-]+(?=\()/ + }, + ATTRIBUTE_SELECTOR_MODE: { + scope: 'selector-attr', + begin: /\[/, + end: /\]/, + illegal: '$', + contains: [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE + ] + }, + CSS_NUMBER_MODE: { + scope: 'number', + begin: hljs.NUMBER_RE + '(' + + '%|em|ex|ch|rem' + + '|vw|vh|vmin|vmax' + + '|cm|mm|in|pt|pc|px' + + '|deg|grad|rad|turn' + + '|s|ms' + + '|Hz|kHz' + + '|dpi|dpcm|dppx' + + ')?', + relevance: 0 + }, + CSS_VARIABLE: { + className: "attr", + begin: /--[A-Za-z_][A-Za-z0-9_-]*/ + } + }; + }; + + const HTML_TAGS = [ + 'a', + 'abbr', + 'address', + 'article', + 'aside', + 'audio', + 'b', + 'blockquote', + 'body', + 'button', + 'canvas', + 'caption', + 'cite', + 'code', + 'dd', + 'del', + 'details', + 'dfn', + 'div', + 'dl', + 'dt', + 'em', + 'fieldset', + 'figcaption', + 'figure', + 'footer', + 'form', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'header', + 'hgroup', + 'html', + 'i', + 'iframe', + 'img', + 'input', + 'ins', + 'kbd', + 'label', + 'legend', + 'li', + 'main', + 'mark', + 'menu', + 'nav', + 'object', + 'ol', + 'optgroup', + 'option', + 'p', + 'picture', + 'q', + 'quote', + 'samp', + 'section', + 'select', + 'source', + 'span', + 'strong', + 'summary', + 'sup', + 'table', + 'tbody', + 'td', + 'textarea', + 'tfoot', + 'th', + 'thead', + 'time', + 'tr', + 'ul', + 'var', + 'video' + ]; + + const SVG_TAGS = [ + 'defs', + 'g', + 'marker', + 'mask', + 'pattern', + 'svg', + 'switch', + 'symbol', + 'feBlend', + 'feColorMatrix', + 'feComponentTransfer', + 'feComposite', + 'feConvolveMatrix', + 'feDiffuseLighting', + 'feDisplacementMap', + 'feFlood', + 'feGaussianBlur', + 'feImage', + 'feMerge', + 'feMorphology', + 'feOffset', + 'feSpecularLighting', + 'feTile', + 'feTurbulence', + 'linearGradient', + 'radialGradient', + 'stop', + 'circle', + 'ellipse', + 'image', + 'line', + 'path', + 'polygon', + 'polyline', + 'rect', + 'text', + 'use', + 'textPath', + 'tspan', + 'foreignObject', + 'clipPath' + ]; + + const TAGS = [ + ...HTML_TAGS, + ...SVG_TAGS, + ]; + + // Sorting, then reversing makes sure longer attributes/elements like + // `font-weight` are matched fully instead of getting false positives on say `font` + + const MEDIA_FEATURES = [ + 'any-hover', + 'any-pointer', + 'aspect-ratio', + 'color', + 'color-gamut', + 'color-index', + 'device-aspect-ratio', + 'device-height', + 'device-width', + 'display-mode', + 'forced-colors', + 'grid', + 'height', + 'hover', + 'inverted-colors', + 'monochrome', + 'orientation', + 'overflow-block', + 'overflow-inline', + 'pointer', + 'prefers-color-scheme', + 'prefers-contrast', + 'prefers-reduced-motion', + 'prefers-reduced-transparency', + 'resolution', + 'scan', + 'scripting', + 'update', + 'width', + // TODO: find a better solution? + 'min-width', + 'max-width', + 'min-height', + 'max-height' + ].sort().reverse(); + + // https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes + const PSEUDO_CLASSES = [ + 'active', + 'any-link', + 'blank', + 'checked', + 'current', + 'default', + 'defined', + 'dir', // dir() + 'disabled', + 'drop', + 'empty', + 'enabled', + 'first', + 'first-child', + 'first-of-type', + 'fullscreen', + 'future', + 'focus', + 'focus-visible', + 'focus-within', + 'has', // has() + 'host', // host or host() + 'host-context', // host-context() + 'hover', + 'indeterminate', + 'in-range', + 'invalid', + 'is', // is() + 'lang', // lang() + 'last-child', + 'last-of-type', + 'left', + 'link', + 'local-link', + 'not', // not() + 'nth-child', // nth-child() + 'nth-col', // nth-col() + 'nth-last-child', // nth-last-child() + 'nth-last-col', // nth-last-col() + 'nth-last-of-type', //nth-last-of-type() + 'nth-of-type', //nth-of-type() + 'only-child', + 'only-of-type', + 'optional', + 'out-of-range', + 'past', + 'placeholder-shown', + 'read-only', + 'read-write', + 'required', + 'right', + 'root', + 'scope', + 'target', + 'target-within', + 'user-invalid', + 'valid', + 'visited', + 'where' // where() + ].sort().reverse(); + + // https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements + const PSEUDO_ELEMENTS = [ + 'after', + 'backdrop', + 'before', + 'cue', + 'cue-region', + 'first-letter', + 'first-line', + 'grammar-error', + 'marker', + 'part', + 'placeholder', + 'selection', + 'slotted', + 'spelling-error' + ].sort().reverse(); + + const ATTRIBUTES = [ + 'accent-color', + 'align-content', + 'align-items', + 'align-self', + 'alignment-baseline', + 'all', + 'anchor-name', + 'animation', + 'animation-composition', + 'animation-delay', + 'animation-direction', + 'animation-duration', + 'animation-fill-mode', + 'animation-iteration-count', + 'animation-name', + 'animation-play-state', + 'animation-range', + 'animation-range-end', + 'animation-range-start', + 'animation-timeline', + 'animation-timing-function', + 'appearance', + 'aspect-ratio', + 'backdrop-filter', + 'backface-visibility', + 'background', + 'background-attachment', + 'background-blend-mode', + 'background-clip', + 'background-color', + 'background-image', + 'background-origin', + 'background-position', + 'background-position-x', + 'background-position-y', + 'background-repeat', + 'background-size', + 'baseline-shift', + 'block-size', + 'border', + 'border-block', + 'border-block-color', + 'border-block-end', + 'border-block-end-color', + 'border-block-end-style', + 'border-block-end-width', + 'border-block-start', + 'border-block-start-color', + 'border-block-start-style', + 'border-block-start-width', + 'border-block-style', + 'border-block-width', + 'border-bottom', + 'border-bottom-color', + 'border-bottom-left-radius', + 'border-bottom-right-radius', + 'border-bottom-style', + 'border-bottom-width', + 'border-collapse', + 'border-color', + 'border-end-end-radius', + 'border-end-start-radius', + 'border-image', + 'border-image-outset', + 'border-image-repeat', + 'border-image-slice', + 'border-image-source', + 'border-image-width', + 'border-inline', + 'border-inline-color', + 'border-inline-end', + 'border-inline-end-color', + 'border-inline-end-style', + 'border-inline-end-width', + 'border-inline-start', + 'border-inline-start-color', + 'border-inline-start-style', + 'border-inline-start-width', + 'border-inline-style', + 'border-inline-width', + 'border-left', + 'border-left-color', + 'border-left-style', + 'border-left-width', + 'border-radius', + 'border-right', + 'border-right-color', + 'border-right-style', + 'border-right-width', + 'border-spacing', + 'border-start-end-radius', + 'border-start-start-radius', + 'border-style', + 'border-top', + 'border-top-color', + 'border-top-left-radius', + 'border-top-right-radius', + 'border-top-style', + 'border-top-width', + 'border-width', + 'bottom', + 'box-align', + 'box-decoration-break', + 'box-direction', + 'box-flex', + 'box-flex-group', + 'box-lines', + 'box-ordinal-group', + 'box-orient', + 'box-pack', + 'box-shadow', + 'box-sizing', + 'break-after', + 'break-before', + 'break-inside', + 'caption-side', + 'caret-color', + 'clear', + 'clip', + 'clip-path', + 'clip-rule', + 'color', + 'color-interpolation', + 'color-interpolation-filters', + 'color-profile', + 'color-rendering', + 'color-scheme', + 'column-count', + 'column-fill', + 'column-gap', + 'column-rule', + 'column-rule-color', + 'column-rule-style', + 'column-rule-width', + 'column-span', + 'column-width', + 'columns', + 'contain', + 'contain-intrinsic-block-size', + 'contain-intrinsic-height', + 'contain-intrinsic-inline-size', + 'contain-intrinsic-size', + 'contain-intrinsic-width', + 'container', + 'container-name', + 'container-type', + 'content', + 'content-visibility', + 'counter-increment', + 'counter-reset', + 'counter-set', + 'cue', + 'cue-after', + 'cue-before', + 'cursor', + 'cx', + 'cy', + 'direction', + 'display', + 'dominant-baseline', + 'empty-cells', + 'enable-background', + 'field-sizing', + 'fill', + 'fill-opacity', + 'fill-rule', + 'filter', + 'flex', + 'flex-basis', + 'flex-direction', + 'flex-flow', + 'flex-grow', + 'flex-shrink', + 'flex-wrap', + 'float', + 'flood-color', + 'flood-opacity', + 'flow', + 'font', + 'font-display', + 'font-family', + 'font-feature-settings', + 'font-kerning', + 'font-language-override', + 'font-optical-sizing', + 'font-palette', + 'font-size', + 'font-size-adjust', + 'font-smooth', + 'font-smoothing', + 'font-stretch', + 'font-style', + 'font-synthesis', + 'font-synthesis-position', + 'font-synthesis-small-caps', + 'font-synthesis-style', + 'font-synthesis-weight', + 'font-variant', + 'font-variant-alternates', + 'font-variant-caps', + 'font-variant-east-asian', + 'font-variant-emoji', + 'font-variant-ligatures', + 'font-variant-numeric', + 'font-variant-position', + 'font-variation-settings', + 'font-weight', + 'forced-color-adjust', + 'gap', + 'glyph-orientation-horizontal', + 'glyph-orientation-vertical', + 'grid', + 'grid-area', + 'grid-auto-columns', + 'grid-auto-flow', + 'grid-auto-rows', + 'grid-column', + 'grid-column-end', + 'grid-column-start', + 'grid-gap', + 'grid-row', + 'grid-row-end', + 'grid-row-start', + 'grid-template', + 'grid-template-areas', + 'grid-template-columns', + 'grid-template-rows', + 'hanging-punctuation', + 'height', + 'hyphenate-character', + 'hyphenate-limit-chars', + 'hyphens', + 'icon', + 'image-orientation', + 'image-rendering', + 'image-resolution', + 'ime-mode', + 'initial-letter', + 'initial-letter-align', + 'inline-size', + 'inset', + 'inset-area', + 'inset-block', + 'inset-block-end', + 'inset-block-start', + 'inset-inline', + 'inset-inline-end', + 'inset-inline-start', + 'isolation', + 'justify-content', + 'justify-items', + 'justify-self', + 'kerning', + 'left', + 'letter-spacing', + 'lighting-color', + 'line-break', + 'line-height', + 'line-height-step', + 'list-style', + 'list-style-image', + 'list-style-position', + 'list-style-type', + 'margin', + 'margin-block', + 'margin-block-end', + 'margin-block-start', + 'margin-bottom', + 'margin-inline', + 'margin-inline-end', + 'margin-inline-start', + 'margin-left', + 'margin-right', + 'margin-top', + 'margin-trim', + 'marker', + 'marker-end', + 'marker-mid', + 'marker-start', + 'marks', + 'mask', + 'mask-border', + 'mask-border-mode', + 'mask-border-outset', + 'mask-border-repeat', + 'mask-border-slice', + 'mask-border-source', + 'mask-border-width', + 'mask-clip', + 'mask-composite', + 'mask-image', + 'mask-mode', + 'mask-origin', + 'mask-position', + 'mask-repeat', + 'mask-size', + 'mask-type', + 'masonry-auto-flow', + 'math-depth', + 'math-shift', + 'math-style', + 'max-block-size', + 'max-height', + 'max-inline-size', + 'max-width', + 'min-block-size', + 'min-height', + 'min-inline-size', + 'min-width', + 'mix-blend-mode', + 'nav-down', + 'nav-index', + 'nav-left', + 'nav-right', + 'nav-up', + 'none', + 'normal', + 'object-fit', + 'object-position', + 'offset', + 'offset-anchor', + 'offset-distance', + 'offset-path', + 'offset-position', + 'offset-rotate', + 'opacity', + 'order', + 'orphans', + 'outline', + 'outline-color', + 'outline-offset', + 'outline-style', + 'outline-width', + 'overflow', + 'overflow-anchor', + 'overflow-block', + 'overflow-clip-margin', + 'overflow-inline', + 'overflow-wrap', + 'overflow-x', + 'overflow-y', + 'overlay', + 'overscroll-behavior', + 'overscroll-behavior-block', + 'overscroll-behavior-inline', + 'overscroll-behavior-x', + 'overscroll-behavior-y', + 'padding', + 'padding-block', + 'padding-block-end', + 'padding-block-start', + 'padding-bottom', + 'padding-inline', + 'padding-inline-end', + 'padding-inline-start', + 'padding-left', + 'padding-right', + 'padding-top', + 'page', + 'page-break-after', + 'page-break-before', + 'page-break-inside', + 'paint-order', + 'pause', + 'pause-after', + 'pause-before', + 'perspective', + 'perspective-origin', + 'place-content', + 'place-items', + 'place-self', + 'pointer-events', + 'position', + 'position-anchor', + 'position-visibility', + 'print-color-adjust', + 'quotes', + 'r', + 'resize', + 'rest', + 'rest-after', + 'rest-before', + 'right', + 'rotate', + 'row-gap', + 'ruby-align', + 'ruby-position', + 'scale', + 'scroll-behavior', + 'scroll-margin', + 'scroll-margin-block', + 'scroll-margin-block-end', + 'scroll-margin-block-start', + 'scroll-margin-bottom', + 'scroll-margin-inline', + 'scroll-margin-inline-end', + 'scroll-margin-inline-start', + 'scroll-margin-left', + 'scroll-margin-right', + 'scroll-margin-top', + 'scroll-padding', + 'scroll-padding-block', + 'scroll-padding-block-end', + 'scroll-padding-block-start', + 'scroll-padding-bottom', + 'scroll-padding-inline', + 'scroll-padding-inline-end', + 'scroll-padding-inline-start', + 'scroll-padding-left', + 'scroll-padding-right', + 'scroll-padding-top', + 'scroll-snap-align', + 'scroll-snap-stop', + 'scroll-snap-type', + 'scroll-timeline', + 'scroll-timeline-axis', + 'scroll-timeline-name', + 'scrollbar-color', + 'scrollbar-gutter', + 'scrollbar-width', + 'shape-image-threshold', + 'shape-margin', + 'shape-outside', + 'shape-rendering', + 'speak', + 'speak-as', + 'src', // @font-face + 'stop-color', + 'stop-opacity', + 'stroke', + 'stroke-dasharray', + 'stroke-dashoffset', + 'stroke-linecap', + 'stroke-linejoin', + 'stroke-miterlimit', + 'stroke-opacity', + 'stroke-width', + 'tab-size', + 'table-layout', + 'text-align', + 'text-align-all', + 'text-align-last', + 'text-anchor', + 'text-combine-upright', + 'text-decoration', + 'text-decoration-color', + 'text-decoration-line', + 'text-decoration-skip', + 'text-decoration-skip-ink', + 'text-decoration-style', + 'text-decoration-thickness', + 'text-emphasis', + 'text-emphasis-color', + 'text-emphasis-position', + 'text-emphasis-style', + 'text-indent', + 'text-justify', + 'text-orientation', + 'text-overflow', + 'text-rendering', + 'text-shadow', + 'text-size-adjust', + 'text-transform', + 'text-underline-offset', + 'text-underline-position', + 'text-wrap', + 'text-wrap-mode', + 'text-wrap-style', + 'timeline-scope', + 'top', + 'touch-action', + 'transform', + 'transform-box', + 'transform-origin', + 'transform-style', + 'transition', + 'transition-behavior', + 'transition-delay', + 'transition-duration', + 'transition-property', + 'transition-timing-function', + 'translate', + 'unicode-bidi', + 'user-modify', + 'user-select', + 'vector-effect', + 'vertical-align', + 'view-timeline', + 'view-timeline-axis', + 'view-timeline-inset', + 'view-timeline-name', + 'view-transition-name', + 'visibility', + 'voice-balance', + 'voice-duration', + 'voice-family', + 'voice-pitch', + 'voice-range', + 'voice-rate', + 'voice-stress', + 'voice-volume', + 'white-space', + 'white-space-collapse', + 'widows', + 'width', + 'will-change', + 'word-break', + 'word-spacing', + 'word-wrap', + 'writing-mode', + 'x', + 'y', + 'z-index', + 'zoom' + ].sort().reverse(); + + /* + Language: SCSS + Description: Scss is an extension of the syntax of CSS. + Author: Kurt Emch + Website: https://sass-lang.com + Category: common, css, web + */ + + + /** @type LanguageFn */ + function scss(hljs) { + const modes = MODES(hljs); + const PSEUDO_ELEMENTS$1 = PSEUDO_ELEMENTS; + const PSEUDO_CLASSES$1 = PSEUDO_CLASSES; + + const AT_IDENTIFIER = '@[a-z-]+'; // @font-face + const AT_MODIFIERS = "and or not only"; + const IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*'; + const VARIABLE = { + className: 'variable', + begin: '(\\$' + IDENT_RE + ')\\b', + relevance: 0 + }; + + return { + name: 'SCSS', + case_insensitive: true, + illegal: '[=/|\']', + contains: [ + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + // to recognize keyframe 40% etc which are outside the scope of our + // attribute value mode + modes.CSS_NUMBER_MODE, + { + className: 'selector-id', + begin: '#[A-Za-z0-9_-]+', + relevance: 0 + }, + { + className: 'selector-class', + begin: '\\.[A-Za-z0-9_-]+', + relevance: 0 + }, + modes.ATTRIBUTE_SELECTOR_MODE, + { + className: 'selector-tag', + begin: '\\b(' + TAGS.join('|') + ')\\b', + // was there, before, but why? + relevance: 0 + }, + { + className: 'selector-pseudo', + begin: ':(' + PSEUDO_CLASSES$1.join('|') + ')' + }, + { + className: 'selector-pseudo', + begin: ':(:)?(' + PSEUDO_ELEMENTS$1.join('|') + ')' + }, + VARIABLE, + { // pseudo-selector params + begin: /\(/, + end: /\)/, + contains: [ modes.CSS_NUMBER_MODE ] + }, + modes.CSS_VARIABLE, + { + className: 'attribute', + begin: '\\b(' + ATTRIBUTES.join('|') + ')\\b' + }, + { begin: '\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b' }, + { + begin: /:/, + end: /[;}{]/, + relevance: 0, + contains: [ + modes.BLOCK_COMMENT, + VARIABLE, + modes.HEXCOLOR, + modes.CSS_NUMBER_MODE, + hljs.QUOTE_STRING_MODE, + hljs.APOS_STRING_MODE, + modes.IMPORTANT, + modes.FUNCTION_DISPATCH + ] + }, + // matching these here allows us to treat them more like regular CSS + // rules so everything between the {} gets regular rule highlighting, + // which is what we want for page and font-face + { + begin: '@(page|font-face)', + keywords: { + $pattern: AT_IDENTIFIER, + keyword: '@page @font-face' + } + }, + { + begin: '@', + end: '[{;]', + returnBegin: true, + keywords: { + $pattern: /[a-z-]+/, + keyword: AT_MODIFIERS, + attribute: MEDIA_FEATURES.join(" ") + }, + contains: [ + { + begin: AT_IDENTIFIER, + className: "keyword" + }, + { + begin: /[a-z-]+(?=:)/, + className: "attribute" + }, + VARIABLE, + hljs.QUOTE_STRING_MODE, + hljs.APOS_STRING_MODE, + modes.HEXCOLOR, + modes.CSS_NUMBER_MODE + ] + }, + modes.FUNCTION_DISPATCH + ] + }; + } + + return scss; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/scss.min.js b/backend/static/highlight(1)/es/languages/scss.min.js new file mode 100644 index 0000000..552e9e6 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/scss.min.js @@ -0,0 +1,33 @@ +/*! `scss` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict" +;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video","defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],i=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),t=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),r=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse() +;return n=>{const a=(e=>({IMPORTANT:{scope:"meta",begin:"!important"}, +BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number", +begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{ +className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{ +scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", +contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ +scope:"number", +begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", +relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/} +}))(n),l=o,s=t,d="@[a-z-]+",c={className:"variable", +begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b",relevance:0};return{name:"SCSS", +case_insensitive:!0,illegal:"[=/|']", +contains:[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE,a.CSS_NUMBER_MODE,{ +className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{ +className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0 +},a.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag", +begin:"\\b("+e.join("|")+")\\b",relevance:0},{className:"selector-pseudo", +begin:":("+s.join("|")+")"},{className:"selector-pseudo", +begin:":(:)?("+l.join("|")+")"},c,{begin:/\(/,end:/\)/, +contains:[a.CSS_NUMBER_MODE]},a.CSS_VARIABLE,{className:"attribute", +begin:"\\b("+r.join("|")+")\\b"},{ +begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" +},{begin:/:/,end:/[;}{]/,relevance:0, +contains:[a.BLOCK_COMMENT,c,a.HEXCOLOR,a.CSS_NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,a.IMPORTANT,a.FUNCTION_DISPATCH] +},{begin:"@(page|font-face)",keywords:{$pattern:d,keyword:"@page @font-face"}},{ +begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/, +keyword:"and or not only",attribute:i.join(" ")},contains:[{begin:d, +className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute" +},c,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,a.HEXCOLOR,a.CSS_NUMBER_MODE] +},a.FUNCTION_DISPATCH]}}})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/shell.js b/backend/static/highlight(1)/es/languages/shell.js new file mode 100644 index 0000000..ea202e9 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/shell.js @@ -0,0 +1,41 @@ +/*! `shell` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: Shell Session + Requires: bash.js + Author: TSUYUSATO Kitsune + Category: common + Audit: 2020 + */ + + /** @type LanguageFn */ + function shell(hljs) { + return { + name: 'Shell Session', + aliases: [ + 'console', + 'shellsession' + ], + contains: [ + { + className: 'meta.prompt', + // We cannot add \s (spaces) in the regular expression otherwise it will be too broad and produce unexpected result. + // For instance, in the following example, it would match "echo /path/to/home >" as a prompt: + // echo /path/to/home > t.exe + begin: /^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/, + starts: { + end: /[^\\](?=\s*$)/, + subLanguage: 'bash' + } + } + ] + }; + } + + return shell; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/shell.min.js b/backend/static/highlight(1)/es/languages/shell.min.js new file mode 100644 index 0000000..7eec4ae --- /dev/null +++ b/backend/static/highlight(1)/es/languages/shell.min.js @@ -0,0 +1,5 @@ +/*! `shell` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return s=>({name:"Shell Session", +aliases:["console","shellsession"],contains:[{className:"meta.prompt", +begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/, +subLanguage:"bash"}}]})})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/sql.js b/backend/static/highlight(1)/es/languages/sql.js new file mode 100644 index 0000000..462b911 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/sql.js @@ -0,0 +1,701 @@ +/*! `sql` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: SQL + Website: https://en.wikipedia.org/wiki/SQL + Category: common, database + */ + + /* + + Goals: + + SQL is intended to highlight basic/common SQL keywords and expressions + + - If pretty much every single SQL server includes supports, then it's a canidate. + - It is NOT intended to include tons of vendor specific keywords (Oracle, MySQL, + PostgreSQL) although the list of data types is purposely a bit more expansive. + - For more specific SQL grammars please see: + - PostgreSQL and PL/pgSQL - core + - T-SQL - https://github.com/highlightjs/highlightjs-tsql + - sql_more (core) + + */ + + function sql(hljs) { + const regex = hljs.regex; + const COMMENT_MODE = hljs.COMMENT('--', '$'); + const STRING = { + scope: 'string', + variants: [ + { + begin: /'/, + end: /'/, + contains: [ { match: /''/ } ] + } + ] + }; + const QUOTED_IDENTIFIER = { + begin: /"/, + end: /"/, + contains: [ { match: /""/ } ] + }; + + const LITERALS = [ + "true", + "false", + // Not sure it's correct to call NULL literal, and clauses like IS [NOT] NULL look strange that way. + // "null", + "unknown" + ]; + + const MULTI_WORD_TYPES = [ + "double precision", + "large object", + "with timezone", + "without timezone" + ]; + + const TYPES = [ + 'bigint', + 'binary', + 'blob', + 'boolean', + 'char', + 'character', + 'clob', + 'date', + 'dec', + 'decfloat', + 'decimal', + 'float', + 'int', + 'integer', + 'interval', + 'nchar', + 'nclob', + 'national', + 'numeric', + 'real', + 'row', + 'smallint', + 'time', + 'timestamp', + 'varchar', + 'varying', // modifier (character varying) + 'varbinary' + ]; + + const NON_RESERVED_WORDS = [ + "add", + "asc", + "collation", + "desc", + "final", + "first", + "last", + "view" + ]; + + // https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#reserved-word + const RESERVED_WORDS = [ + "abs", + "acos", + "all", + "allocate", + "alter", + "and", + "any", + "are", + "array", + "array_agg", + "array_max_cardinality", + "as", + "asensitive", + "asin", + "asymmetric", + "at", + "atan", + "atomic", + "authorization", + "avg", + "begin", + "begin_frame", + "begin_partition", + "between", + "bigint", + "binary", + "blob", + "boolean", + "both", + "by", + "call", + "called", + "cardinality", + "cascaded", + "case", + "cast", + "ceil", + "ceiling", + "char", + "char_length", + "character", + "character_length", + "check", + "classifier", + "clob", + "close", + "coalesce", + "collate", + "collect", + "column", + "commit", + "condition", + "connect", + "constraint", + "contains", + "convert", + "copy", + "corr", + "corresponding", + "cos", + "cosh", + "count", + "covar_pop", + "covar_samp", + "create", + "cross", + "cube", + "cume_dist", + "current", + "current_catalog", + "current_date", + "current_default_transform_group", + "current_path", + "current_role", + "current_row", + "current_schema", + "current_time", + "current_timestamp", + "current_path", + "current_role", + "current_transform_group_for_type", + "current_user", + "cursor", + "cycle", + "date", + "day", + "deallocate", + "dec", + "decimal", + "decfloat", + "declare", + "default", + "define", + "delete", + "dense_rank", + "deref", + "describe", + "deterministic", + "disconnect", + "distinct", + "double", + "drop", + "dynamic", + "each", + "element", + "else", + "empty", + "end", + "end_frame", + "end_partition", + "end-exec", + "equals", + "escape", + "every", + "except", + "exec", + "execute", + "exists", + "exp", + "external", + "extract", + "false", + "fetch", + "filter", + "first_value", + "float", + "floor", + "for", + "foreign", + "frame_row", + "free", + "from", + "full", + "function", + "fusion", + "get", + "global", + "grant", + "group", + "grouping", + "groups", + "having", + "hold", + "hour", + "identity", + "in", + "indicator", + "initial", + "inner", + "inout", + "insensitive", + "insert", + "int", + "integer", + "intersect", + "intersection", + "interval", + "into", + "is", + "join", + "json_array", + "json_arrayagg", + "json_exists", + "json_object", + "json_objectagg", + "json_query", + "json_table", + "json_table_primitive", + "json_value", + "lag", + "language", + "large", + "last_value", + "lateral", + "lead", + "leading", + "left", + "like", + "like_regex", + "listagg", + "ln", + "local", + "localtime", + "localtimestamp", + "log", + "log10", + "lower", + "match", + "match_number", + "match_recognize", + "matches", + "max", + "member", + "merge", + "method", + "min", + "minute", + "mod", + "modifies", + "module", + "month", + "multiset", + "national", + "natural", + "nchar", + "nclob", + "new", + "no", + "none", + "normalize", + "not", + "nth_value", + "ntile", + "null", + "nullif", + "numeric", + "octet_length", + "occurrences_regex", + "of", + "offset", + "old", + "omit", + "on", + "one", + "only", + "open", + "or", + "order", + "out", + "outer", + "over", + "overlaps", + "overlay", + "parameter", + "partition", + "pattern", + "per", + "percent", + "percent_rank", + "percentile_cont", + "percentile_disc", + "period", + "portion", + "position", + "position_regex", + "power", + "precedes", + "precision", + "prepare", + "primary", + "procedure", + "ptf", + "range", + "rank", + "reads", + "real", + "recursive", + "ref", + "references", + "referencing", + "regr_avgx", + "regr_avgy", + "regr_count", + "regr_intercept", + "regr_r2", + "regr_slope", + "regr_sxx", + "regr_sxy", + "regr_syy", + "release", + "result", + "return", + "returns", + "revoke", + "right", + "rollback", + "rollup", + "row", + "row_number", + "rows", + "running", + "savepoint", + "scope", + "scroll", + "search", + "second", + "seek", + "select", + "sensitive", + "session_user", + "set", + "show", + "similar", + "sin", + "sinh", + "skip", + "smallint", + "some", + "specific", + "specifictype", + "sql", + "sqlexception", + "sqlstate", + "sqlwarning", + "sqrt", + "start", + "static", + "stddev_pop", + "stddev_samp", + "submultiset", + "subset", + "substring", + "substring_regex", + "succeeds", + "sum", + "symmetric", + "system", + "system_time", + "system_user", + "table", + "tablesample", + "tan", + "tanh", + "then", + "time", + "timestamp", + "timezone_hour", + "timezone_minute", + "to", + "trailing", + "translate", + "translate_regex", + "translation", + "treat", + "trigger", + "trim", + "trim_array", + "true", + "truncate", + "uescape", + "union", + "unique", + "unknown", + "unnest", + "update", + "upper", + "user", + "using", + "value", + "values", + "value_of", + "var_pop", + "var_samp", + "varbinary", + "varchar", + "varying", + "versioning", + "when", + "whenever", + "where", + "width_bucket", + "window", + "with", + "within", + "without", + "year", + ]; + + // these are reserved words we have identified to be functions + // and should only be highlighted in a dispatch-like context + // ie, array_agg(...), etc. + const RESERVED_FUNCTIONS = [ + "abs", + "acos", + "array_agg", + "asin", + "atan", + "avg", + "cast", + "ceil", + "ceiling", + "coalesce", + "corr", + "cos", + "cosh", + "count", + "covar_pop", + "covar_samp", + "cume_dist", + "dense_rank", + "deref", + "element", + "exp", + "extract", + "first_value", + "floor", + "json_array", + "json_arrayagg", + "json_exists", + "json_object", + "json_objectagg", + "json_query", + "json_table", + "json_table_primitive", + "json_value", + "lag", + "last_value", + "lead", + "listagg", + "ln", + "log", + "log10", + "lower", + "max", + "min", + "mod", + "nth_value", + "ntile", + "nullif", + "percent_rank", + "percentile_cont", + "percentile_disc", + "position", + "position_regex", + "power", + "rank", + "regr_avgx", + "regr_avgy", + "regr_count", + "regr_intercept", + "regr_r2", + "regr_slope", + "regr_sxx", + "regr_sxy", + "regr_syy", + "row_number", + "sin", + "sinh", + "sqrt", + "stddev_pop", + "stddev_samp", + "substring", + "substring_regex", + "sum", + "tan", + "tanh", + "translate", + "translate_regex", + "treat", + "trim", + "trim_array", + "unnest", + "upper", + "value_of", + "var_pop", + "var_samp", + "width_bucket", + ]; + + // these functions can + const POSSIBLE_WITHOUT_PARENS = [ + "current_catalog", + "current_date", + "current_default_transform_group", + "current_path", + "current_role", + "current_schema", + "current_transform_group_for_type", + "current_user", + "session_user", + "system_time", + "system_user", + "current_time", + "localtime", + "current_timestamp", + "localtimestamp" + ]; + + // those exist to boost relevance making these very + // "SQL like" keyword combos worth +1 extra relevance + const COMBOS = [ + "create table", + "insert into", + "primary key", + "foreign key", + "not null", + "alter table", + "add constraint", + "grouping sets", + "on overflow", + "character set", + "respect nulls", + "ignore nulls", + "nulls first", + "nulls last", + "depth first", + "breadth first" + ]; + + const FUNCTIONS = RESERVED_FUNCTIONS; + + const KEYWORDS = [ + ...RESERVED_WORDS, + ...NON_RESERVED_WORDS + ].filter((keyword) => { + return !RESERVED_FUNCTIONS.includes(keyword); + }); + + const VARIABLE = { + scope: "variable", + match: /@[a-z0-9][a-z0-9_]*/, + }; + + const OPERATOR = { + scope: "operator", + match: /[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/, + relevance: 0, + }; + + const FUNCTION_CALL = { + match: regex.concat(/\b/, regex.either(...FUNCTIONS), /\s*\(/), + relevance: 0, + keywords: { built_in: FUNCTIONS } + }; + + // turns a multi-word keyword combo into a regex that doesn't + // care about extra whitespace etc. + // input: "START QUERY" + // output: /\bSTART\s+QUERY\b/ + function kws_to_regex(list) { + return regex.concat( + /\b/, + regex.either(...list.map((kw) => { + return kw.replace(/\s+/, "\\s+") + })), + /\b/ + ) + } + + const MULTI_WORD_KEYWORDS = { + scope: "keyword", + match: kws_to_regex(COMBOS), + relevance: 0, + }; + + // keywords with less than 3 letters are reduced in relevancy + function reduceRelevancy(list, { + exceptions, when + } = {}) { + const qualifyFn = when; + exceptions = exceptions || []; + return list.map((item) => { + if (item.match(/\|\d+$/) || exceptions.includes(item)) { + return item; + } else if (qualifyFn(item)) { + return `${item}|0`; + } else { + return item; + } + }); + } + + return { + name: 'SQL', + case_insensitive: true, + // does not include {} or HTML tags ` x.length < 3 }), + literal: LITERALS, + type: TYPES, + built_in: POSSIBLE_WITHOUT_PARENS + }, + contains: [ + { + scope: "type", + match: kws_to_regex(MULTI_WORD_TYPES) + }, + MULTI_WORD_KEYWORDS, + FUNCTION_CALL, + VARIABLE, + STRING, + QUOTED_IDENTIFIER, + hljs.C_NUMBER_MODE, + hljs.C_BLOCK_COMMENT_MODE, + COMMENT_MODE, + OPERATOR + ] + }; + } + + return sql; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/sql.min.js b/backend/static/highlight(1)/es/languages/sql.min.js new file mode 100644 index 0000000..e38eb88 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/sql.min.js @@ -0,0 +1,21 @@ +/*! `sql` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{ +const r=e.regex,t=e.COMMENT("--","$"),a=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],n=a,s=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!a.includes(e))),i={ +match:r.concat(/\b/,r.either(...n),/\s*\(/),relevance:0,keywords:{built_in:n}} +;function o(e){ +return r.concat(/\b/,r.either(...e.map((e=>e.replace(/\s+/,"\\s+")))),/\b/)} +const c={scope:"keyword", +match:o(["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"]), +relevance:0};return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{ +$pattern:/\b[\w\.]+/,keyword:((e,{exceptions:r,when:t}={})=>{const a=t +;return r=r||[],e.map((e=>e.match(/\|\d+$/)||r.includes(e)?e:a(e)?e+"|0":e)) +})(s,{when:e=>e.length<3}),literal:["true","false","unknown"], +type:["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"], +built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] +},contains:[{scope:"type", +match:o(["double precision","large object","with timezone","without timezone"]) +},c,i,{scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},{scope:"string",variants:[{ +begin:/'/,end:/'/,contains:[{match:/''/}]}]},{begin:/"/,end:/"/,contains:[{ +match:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{scope:"operator", +match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}}})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/swift.js b/backend/static/highlight(1)/es/languages/swift.js new file mode 100644 index 0000000..9b2e5b2 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/swift.js @@ -0,0 +1,980 @@ +/*! `swift` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /** + * @param {string} value + * @returns {RegExp} + * */ + + /** + * @param {RegExp | string } re + * @returns {string} + */ + function source(re) { + if (!re) return null; + if (typeof re === "string") return re; + + return re.source; + } + + /** + * @param {RegExp | string } re + * @returns {string} + */ + function lookahead(re) { + return concat('(?=', re, ')'); + } + + /** + * @param {...(RegExp | string) } args + * @returns {string} + */ + function concat(...args) { + const joined = args.map((x) => source(x)).join(""); + return joined; + } + + /** + * @param { Array } args + * @returns {object} + */ + function stripOptionsFromArgs(args) { + const opts = args[args.length - 1]; + + if (typeof opts === 'object' && opts.constructor === Object) { + args.splice(args.length - 1, 1); + return opts; + } else { + return {}; + } + } + + /** @typedef { {capture?: boolean} } RegexEitherOptions */ + + /** + * Any of the passed expresssions may match + * + * Creates a huge this | this | that | that match + * @param {(RegExp | string)[] | [...(RegExp | string)[], RegexEitherOptions]} args + * @returns {string} + */ + function either(...args) { + /** @type { object & {capture?: boolean} } */ + const opts = stripOptionsFromArgs(args); + const joined = '(' + + (opts.capture ? "" : "?:") + + args.map((x) => source(x)).join("|") + ")"; + return joined; + } + + const keywordWrapper = keyword => concat( + /\b/, + keyword, + /\w$/.test(keyword) ? /\b/ : /\B/ + ); + + // Keywords that require a leading dot. + const dotKeywords = [ + 'Protocol', // contextual + 'Type' // contextual + ].map(keywordWrapper); + + // Keywords that may have a leading dot. + const optionalDotKeywords = [ + 'init', + 'self' + ].map(keywordWrapper); + + // should register as keyword, not type + const keywordTypes = [ + 'Any', + 'Self' + ]; + + // Regular keywords and literals. + const keywords = [ + // strings below will be fed into the regular `keywords` engine while regex + // will result in additional modes being created to scan for those keywords to + // avoid conflicts with other rules + 'actor', + 'any', // contextual + 'associatedtype', + 'async', + 'await', + /as\?/, // operator + /as!/, // operator + 'as', // operator + 'borrowing', // contextual + 'break', + 'case', + 'catch', + 'class', + 'consume', // contextual + 'consuming', // contextual + 'continue', + 'convenience', // contextual + 'copy', // contextual + 'default', + 'defer', + 'deinit', + 'didSet', // contextual + 'distributed', + 'do', + 'dynamic', // contextual + 'each', + 'else', + 'enum', + 'extension', + 'fallthrough', + /fileprivate\(set\)/, + 'fileprivate', + 'final', // contextual + 'for', + 'func', + 'get', // contextual + 'guard', + 'if', + 'import', + 'indirect', // contextual + 'infix', // contextual + /init\?/, + /init!/, + 'inout', + /internal\(set\)/, + 'internal', + 'in', + 'is', // operator + 'isolated', // contextual + 'nonisolated', // contextual + 'lazy', // contextual + 'let', + 'macro', + 'mutating', // contextual + 'nonmutating', // contextual + /open\(set\)/, // contextual + 'open', // contextual + 'operator', + 'optional', // contextual + 'override', // contextual + 'package', + 'postfix', // contextual + 'precedencegroup', + 'prefix', // contextual + /private\(set\)/, + 'private', + 'protocol', + /public\(set\)/, + 'public', + 'repeat', + 'required', // contextual + 'rethrows', + 'return', + 'set', // contextual + 'some', // contextual + 'static', + 'struct', + 'subscript', + 'super', + 'switch', + 'throws', + 'throw', + /try\?/, // operator + /try!/, // operator + 'try', // operator + 'typealias', + /unowned\(safe\)/, // contextual + /unowned\(unsafe\)/, // contextual + 'unowned', // contextual + 'var', + 'weak', // contextual + 'where', + 'while', + 'willSet' // contextual + ]; + + // NOTE: Contextual keywords are reserved only in specific contexts. + // Ideally, these should be matched using modes to avoid false positives. + + // Literals. + const literals = [ + 'false', + 'nil', + 'true' + ]; + + // Keywords used in precedence groups. + const precedencegroupKeywords = [ + 'assignment', + 'associativity', + 'higherThan', + 'left', + 'lowerThan', + 'none', + 'right' + ]; + + // Keywords that start with a number sign (#). + // #(un)available is handled separately. + const numberSignKeywords = [ + '#colorLiteral', + '#column', + '#dsohandle', + '#else', + '#elseif', + '#endif', + '#error', + '#file', + '#fileID', + '#fileLiteral', + '#filePath', + '#function', + '#if', + '#imageLiteral', + '#keyPath', + '#line', + '#selector', + '#sourceLocation', + '#warning' + ]; + + // Global functions in the Standard Library. + const builtIns = [ + 'abs', + 'all', + 'any', + 'assert', + 'assertionFailure', + 'debugPrint', + 'dump', + 'fatalError', + 'getVaList', + 'isKnownUniquelyReferenced', + 'max', + 'min', + 'numericCast', + 'pointwiseMax', + 'pointwiseMin', + 'precondition', + 'preconditionFailure', + 'print', + 'readLine', + 'repeatElement', + 'sequence', + 'stride', + 'swap', + 'swift_unboxFromSwiftValueWithType', + 'transcode', + 'type', + 'unsafeBitCast', + 'unsafeDowncast', + 'withExtendedLifetime', + 'withUnsafeMutablePointer', + 'withUnsafePointer', + 'withVaList', + 'withoutActuallyEscaping', + 'zip' + ]; + + // Valid first characters for operators. + const operatorHead = either( + /[/=\-+!*%<>&|^~?]/, + /[\u00A1-\u00A7]/, + /[\u00A9\u00AB]/, + /[\u00AC\u00AE]/, + /[\u00B0\u00B1]/, + /[\u00B6\u00BB\u00BF\u00D7\u00F7]/, + /[\u2016-\u2017]/, + /[\u2020-\u2027]/, + /[\u2030-\u203E]/, + /[\u2041-\u2053]/, + /[\u2055-\u205E]/, + /[\u2190-\u23FF]/, + /[\u2500-\u2775]/, + /[\u2794-\u2BFF]/, + /[\u2E00-\u2E7F]/, + /[\u3001-\u3003]/, + /[\u3008-\u3020]/, + /[\u3030]/ + ); + + // Valid characters for operators. + const operatorCharacter = either( + operatorHead, + /[\u0300-\u036F]/, + /[\u1DC0-\u1DFF]/, + /[\u20D0-\u20FF]/, + /[\uFE00-\uFE0F]/, + /[\uFE20-\uFE2F]/ + // TODO: The following characters are also allowed, but the regex isn't supported yet. + // /[\u{E0100}-\u{E01EF}]/u + ); + + // Valid operator. + const operator = concat(operatorHead, operatorCharacter, '*'); + + // Valid first characters for identifiers. + const identifierHead = either( + /[a-zA-Z_]/, + /[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/, + /[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/, + /[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/, + /[\u1E00-\u1FFF]/, + /[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/, + /[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/, + /[\u2C00-\u2DFF\u2E80-\u2FFF]/, + /[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/, + /[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/, + /[\uFE47-\uFEFE\uFF00-\uFFFD]/ // Should be /[\uFE47-\uFFFD]/, but we have to exclude FEFF. + // The following characters are also allowed, but the regexes aren't supported yet. + // /[\u{10000}-\u{1FFFD}\u{20000-\u{2FFFD}\u{30000}-\u{3FFFD}\u{40000}-\u{4FFFD}]/u, + // /[\u{50000}-\u{5FFFD}\u{60000-\u{6FFFD}\u{70000}-\u{7FFFD}\u{80000}-\u{8FFFD}]/u, + // /[\u{90000}-\u{9FFFD}\u{A0000-\u{AFFFD}\u{B0000}-\u{BFFFD}\u{C0000}-\u{CFFFD}]/u, + // /[\u{D0000}-\u{DFFFD}\u{E0000-\u{EFFFD}]/u + ); + + // Valid characters for identifiers. + const identifierCharacter = either( + identifierHead, + /\d/, + /[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/ + ); + + // Valid identifier. + const identifier = concat(identifierHead, identifierCharacter, '*'); + + // Valid type identifier. + const typeIdentifier = concat(/[A-Z]/, identifierCharacter, '*'); + + // Built-in attributes, which are highlighted as keywords. + // @available is handled separately. + // https://docs.swift.org/swift-book/documentation/the-swift-programming-language/attributes + const keywordAttributes = [ + 'attached', + 'autoclosure', + concat(/convention\(/, either('swift', 'block', 'c'), /\)/), + 'discardableResult', + 'dynamicCallable', + 'dynamicMemberLookup', + 'escaping', + 'freestanding', + 'frozen', + 'GKInspectable', + 'IBAction', + 'IBDesignable', + 'IBInspectable', + 'IBOutlet', + 'IBSegueAction', + 'inlinable', + 'main', + 'nonobjc', + 'NSApplicationMain', + 'NSCopying', + 'NSManaged', + concat(/objc\(/, identifier, /\)/), + 'objc', + 'objcMembers', + 'propertyWrapper', + 'requires_stored_property_inits', + 'resultBuilder', + 'Sendable', + 'testable', + 'UIApplicationMain', + 'unchecked', + 'unknown', + 'usableFromInline', + 'warn_unqualified_access' + ]; + + // Contextual keywords used in @available and #(un)available. + const availabilityKeywords = [ + 'iOS', + 'iOSApplicationExtension', + 'macOS', + 'macOSApplicationExtension', + 'macCatalyst', + 'macCatalystApplicationExtension', + 'watchOS', + 'watchOSApplicationExtension', + 'tvOS', + 'tvOSApplicationExtension', + 'swift' + ]; + + /* + Language: Swift + Description: Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns. + Author: Steven Van Impe + Contributors: Chris Eidhof , Nate Cook , Alexander Lichter , Richard Gibson + Website: https://swift.org + Category: common, system + */ + + + /** @type LanguageFn */ + function swift(hljs) { + const WHITESPACE = { + match: /\s+/, + relevance: 0 + }; + // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#ID411 + const BLOCK_COMMENT = hljs.COMMENT( + '/\\*', + '\\*/', + { contains: [ 'self' ] } + ); + const COMMENTS = [ + hljs.C_LINE_COMMENT_MODE, + BLOCK_COMMENT + ]; + + // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#ID413 + // https://docs.swift.org/swift-book/ReferenceManual/zzSummaryOfTheGrammar.html + const DOT_KEYWORD = { + match: [ + /\./, + either(...dotKeywords, ...optionalDotKeywords) + ], + className: { 2: "keyword" } + }; + const KEYWORD_GUARD = { + // Consume .keyword to prevent highlighting properties and methods as keywords. + match: concat(/\./, either(...keywords)), + relevance: 0 + }; + const PLAIN_KEYWORDS = keywords + .filter(kw => typeof kw === 'string') + .concat([ "_|0" ]); // seems common, so 0 relevance + const REGEX_KEYWORDS = keywords + .filter(kw => typeof kw !== 'string') // find regex + .concat(keywordTypes) + .map(keywordWrapper); + const KEYWORD = { variants: [ + { + className: 'keyword', + match: either(...REGEX_KEYWORDS, ...optionalDotKeywords) + } + ] }; + // find all the regular keywords + const KEYWORDS = { + $pattern: either( + /\b\w+/, // regular keywords + /#\w+/ // number keywords + ), + keyword: PLAIN_KEYWORDS + .concat(numberSignKeywords), + literal: literals + }; + const KEYWORD_MODES = [ + DOT_KEYWORD, + KEYWORD_GUARD, + KEYWORD + ]; + + // https://github.com/apple/swift/tree/main/stdlib/public/core + const BUILT_IN_GUARD = { + // Consume .built_in to prevent highlighting properties and methods. + match: concat(/\./, either(...builtIns)), + relevance: 0 + }; + const BUILT_IN = { + className: 'built_in', + match: concat(/\b/, either(...builtIns), /(?=\()/) + }; + const BUILT_INS = [ + BUILT_IN_GUARD, + BUILT_IN + ]; + + // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#ID418 + const OPERATOR_GUARD = { + // Prevent -> from being highlighting as an operator. + match: /->/, + relevance: 0 + }; + const OPERATOR = { + className: 'operator', + relevance: 0, + variants: [ + { match: operator }, + { + // dot-operator: only operators that start with a dot are allowed to use dots as + // characters (..., ...<, .*, etc). So there rule here is: a dot followed by one or more + // characters that may also include dots. + match: `\\.(\\.|${operatorCharacter})+` } + ] + }; + const OPERATORS = [ + OPERATOR_GUARD, + OPERATOR + ]; + + // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_numeric-literal + // TODO: Update for leading `-` after lookbehind is supported everywhere + const decimalDigits = '([0-9]_*)+'; + const hexDigits = '([0-9a-fA-F]_*)+'; + const NUMBER = { + className: 'number', + relevance: 0, + variants: [ + // decimal floating-point-literal (subsumes decimal-literal) + { match: `\\b(${decimalDigits})(\\.(${decimalDigits}))?` + `([eE][+-]?(${decimalDigits}))?\\b` }, + // hexadecimal floating-point-literal (subsumes hexadecimal-literal) + { match: `\\b0x(${hexDigits})(\\.(${hexDigits}))?` + `([pP][+-]?(${decimalDigits}))?\\b` }, + // octal-literal + { match: /\b0o([0-7]_*)+\b/ }, + // binary-literal + { match: /\b0b([01]_*)+\b/ } + ] + }; + + // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_string-literal + const ESCAPED_CHARACTER = (rawDelimiter = "") => ({ + className: 'subst', + variants: [ + { match: concat(/\\/, rawDelimiter, /[0\\tnr"']/) }, + { match: concat(/\\/, rawDelimiter, /u\{[0-9a-fA-F]{1,8}\}/) } + ] + }); + const ESCAPED_NEWLINE = (rawDelimiter = "") => ({ + className: 'subst', + match: concat(/\\/, rawDelimiter, /[\t ]*(?:[\r\n]|\r\n)/) + }); + const INTERPOLATION = (rawDelimiter = "") => ({ + className: 'subst', + label: "interpol", + begin: concat(/\\/, rawDelimiter, /\(/), + end: /\)/ + }); + const MULTILINE_STRING = (rawDelimiter = "") => ({ + begin: concat(rawDelimiter, /"""/), + end: concat(/"""/, rawDelimiter), + contains: [ + ESCAPED_CHARACTER(rawDelimiter), + ESCAPED_NEWLINE(rawDelimiter), + INTERPOLATION(rawDelimiter) + ] + }); + const SINGLE_LINE_STRING = (rawDelimiter = "") => ({ + begin: concat(rawDelimiter, /"/), + end: concat(/"/, rawDelimiter), + contains: [ + ESCAPED_CHARACTER(rawDelimiter), + INTERPOLATION(rawDelimiter) + ] + }); + const STRING = { + className: 'string', + variants: [ + MULTILINE_STRING(), + MULTILINE_STRING("#"), + MULTILINE_STRING("##"), + MULTILINE_STRING("###"), + SINGLE_LINE_STRING(), + SINGLE_LINE_STRING("#"), + SINGLE_LINE_STRING("##"), + SINGLE_LINE_STRING("###") + ] + }; + + const REGEXP_CONTENTS = [ + hljs.BACKSLASH_ESCAPE, + { + begin: /\[/, + end: /\]/, + relevance: 0, + contains: [ hljs.BACKSLASH_ESCAPE ] + } + ]; + + const BARE_REGEXP_LITERAL = { + begin: /\/[^\s](?=[^/\n]*\/)/, + end: /\//, + contains: REGEXP_CONTENTS + }; + + const EXTENDED_REGEXP_LITERAL = (rawDelimiter) => { + const begin = concat(rawDelimiter, /\//); + const end = concat(/\//, rawDelimiter); + return { + begin, + end, + contains: [ + ...REGEXP_CONTENTS, + { + scope: "comment", + begin: `#(?!.*${end})`, + end: /$/, + }, + ], + }; + }; + + // https://docs.swift.org/swift-book/documentation/the-swift-programming-language/lexicalstructure/#Regular-Expression-Literals + const REGEXP = { + scope: "regexp", + variants: [ + EXTENDED_REGEXP_LITERAL('###'), + EXTENDED_REGEXP_LITERAL('##'), + EXTENDED_REGEXP_LITERAL('#'), + BARE_REGEXP_LITERAL + ] + }; + + // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#ID412 + const QUOTED_IDENTIFIER = { match: concat(/`/, identifier, /`/) }; + const IMPLICIT_PARAMETER = { + className: 'variable', + match: /\$\d+/ + }; + const PROPERTY_WRAPPER_PROJECTION = { + className: 'variable', + match: `\\$${identifierCharacter}+` + }; + const IDENTIFIERS = [ + QUOTED_IDENTIFIER, + IMPLICIT_PARAMETER, + PROPERTY_WRAPPER_PROJECTION + ]; + + // https://docs.swift.org/swift-book/ReferenceManual/Attributes.html + const AVAILABLE_ATTRIBUTE = { + match: /(@|#(un)?)available/, + scope: 'keyword', + starts: { contains: [ + { + begin: /\(/, + end: /\)/, + keywords: availabilityKeywords, + contains: [ + ...OPERATORS, + NUMBER, + STRING + ] + } + ] } + }; + + const KEYWORD_ATTRIBUTE = { + scope: 'keyword', + match: concat(/@/, either(...keywordAttributes), lookahead(either(/\(/, /\s+/))), + }; + + const USER_DEFINED_ATTRIBUTE = { + scope: 'meta', + match: concat(/@/, identifier) + }; + + const ATTRIBUTES = [ + AVAILABLE_ATTRIBUTE, + KEYWORD_ATTRIBUTE, + USER_DEFINED_ATTRIBUTE + ]; + + // https://docs.swift.org/swift-book/ReferenceManual/Types.html + const TYPE = { + match: lookahead(/\b[A-Z]/), + relevance: 0, + contains: [ + { // Common Apple frameworks, for relevance boost + className: 'type', + match: concat(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/, identifierCharacter, '+') + }, + { // Type identifier + className: 'type', + match: typeIdentifier, + relevance: 0 + }, + { // Optional type + match: /[?!]+/, + relevance: 0 + }, + { // Variadic parameter + match: /\.\.\./, + relevance: 0 + }, + { // Protocol composition + match: concat(/\s+&\s+/, lookahead(typeIdentifier)), + relevance: 0 + } + ] + }; + const GENERIC_ARGUMENTS = { + begin: //, + keywords: KEYWORDS, + contains: [ + ...COMMENTS, + ...KEYWORD_MODES, + ...ATTRIBUTES, + OPERATOR_GUARD, + TYPE + ] + }; + TYPE.contains.push(GENERIC_ARGUMENTS); + + // https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#ID552 + // Prevents element names from being highlighted as keywords. + const TUPLE_ELEMENT_NAME = { + match: concat(identifier, /\s*:/), + keywords: "_|0", + relevance: 0 + }; + // Matches tuples as well as the parameter list of a function type. + const TUPLE = { + begin: /\(/, + end: /\)/, + relevance: 0, + keywords: KEYWORDS, + contains: [ + 'self', + TUPLE_ELEMENT_NAME, + ...COMMENTS, + REGEXP, + ...KEYWORD_MODES, + ...BUILT_INS, + ...OPERATORS, + NUMBER, + STRING, + ...IDENTIFIERS, + ...ATTRIBUTES, + TYPE + ] + }; + + const GENERIC_PARAMETERS = { + begin: //, + keywords: 'repeat each', + contains: [ + ...COMMENTS, + TYPE + ] + }; + const FUNCTION_PARAMETER_NAME = { + begin: either( + lookahead(concat(identifier, /\s*:/)), + lookahead(concat(identifier, /\s+/, identifier, /\s*:/)) + ), + end: /:/, + relevance: 0, + contains: [ + { + className: 'keyword', + match: /\b_\b/ + }, + { + className: 'params', + match: identifier + } + ] + }; + const FUNCTION_PARAMETERS = { + begin: /\(/, + end: /\)/, + keywords: KEYWORDS, + contains: [ + FUNCTION_PARAMETER_NAME, + ...COMMENTS, + ...KEYWORD_MODES, + ...OPERATORS, + NUMBER, + STRING, + ...ATTRIBUTES, + TYPE, + TUPLE + ], + endsParent: true, + illegal: /["']/ + }; + // https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID362 + // https://docs.swift.org/swift-book/documentation/the-swift-programming-language/declarations/#Macro-Declaration + const FUNCTION_OR_MACRO = { + match: [ + /(func|macro)/, + /\s+/, + either(QUOTED_IDENTIFIER.match, identifier, operator) + ], + className: { + 1: "keyword", + 3: "title.function" + }, + contains: [ + GENERIC_PARAMETERS, + FUNCTION_PARAMETERS, + WHITESPACE + ], + illegal: [ + /\[/, + /%/ + ] + }; + + // https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID375 + // https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID379 + const INIT_SUBSCRIPT = { + match: [ + /\b(?:subscript|init[?!]?)/, + /\s*(?=[<(])/, + ], + className: { 1: "keyword" }, + contains: [ + GENERIC_PARAMETERS, + FUNCTION_PARAMETERS, + WHITESPACE + ], + illegal: /\[|%/ + }; + // https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID380 + const OPERATOR_DECLARATION = { + match: [ + /operator/, + /\s+/, + operator + ], + className: { + 1: "keyword", + 3: "title" + } + }; + + // https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID550 + const PRECEDENCEGROUP = { + begin: [ + /precedencegroup/, + /\s+/, + typeIdentifier + ], + className: { + 1: "keyword", + 3: "title" + }, + contains: [ TYPE ], + keywords: [ + ...precedencegroupKeywords, + ...literals + ], + end: /}/ + }; + + const CLASS_FUNC_DECLARATION = { + match: [ + /class\b/, + /\s+/, + /func\b/, + /\s+/, + /\b[A-Za-z_][A-Za-z0-9_]*\b/ + ], + scope: { + 1: "keyword", + 3: "keyword", + 5: "title.function" + } + }; + + const CLASS_VAR_DECLARATION = { + match: [ + /class\b/, + /\s+/, + /var\b/, + ], + scope: { + 1: "keyword", + 3: "keyword" + } + }; + + const TYPE_DECLARATION = { + begin: [ + /(struct|protocol|class|extension|enum|actor)/, + /\s+/, + identifier, + /\s*/, + ], + beginScope: { + 1: "keyword", + 3: "title.class" + }, + keywords: KEYWORDS, + contains: [ + GENERIC_PARAMETERS, + ...KEYWORD_MODES, + { + begin: /:/, + end: /\{/, + keywords: KEYWORDS, + contains: [ + { + scope: "title.class.inherited", + match: typeIdentifier, + }, + ...KEYWORD_MODES, + ], + relevance: 0, + }, + ] + }; + + // Add supported submodes to string interpolation. + for (const variant of STRING.variants) { + const interpolation = variant.contains.find(mode => mode.label === "interpol"); + // TODO: Interpolation can contain any expression, so there's room for improvement here. + interpolation.keywords = KEYWORDS; + const submodes = [ + ...KEYWORD_MODES, + ...BUILT_INS, + ...OPERATORS, + NUMBER, + STRING, + ...IDENTIFIERS + ]; + interpolation.contains = [ + ...submodes, + { + begin: /\(/, + end: /\)/, + contains: [ + 'self', + ...submodes + ] + } + ]; + } + + return { + name: 'Swift', + keywords: KEYWORDS, + contains: [ + ...COMMENTS, + FUNCTION_OR_MACRO, + INIT_SUBSCRIPT, + CLASS_FUNC_DECLARATION, + CLASS_VAR_DECLARATION, + TYPE_DECLARATION, + OPERATOR_DECLARATION, + PRECEDENCEGROUP, + { + beginKeywords: 'import', + end: /$/, + contains: [ ...COMMENTS ], + relevance: 0 + }, + REGEXP, + ...KEYWORD_MODES, + ...BUILT_INS, + ...OPERATORS, + NUMBER, + STRING, + ...IDENTIFIERS, + ...ATTRIBUTES, + TYPE, + TUPLE + ] + }; + } + + return swift; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/swift.min.js b/backend/static/highlight(1)/es/languages/swift.min.js new file mode 100644 index 0000000..662c49b --- /dev/null +++ b/backend/static/highlight(1)/es/languages/swift.min.js @@ -0,0 +1,68 @@ +/*! `swift` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} +function a(...n){return n.map((n=>e(n))).join("")}function t(...n){const a=(e=>{ +const n=e[e.length-1] +;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} +})(n);return"("+(a.capture?"":"?:")+n.map((n=>e(n))).join("|")+")"} +const s=e=>a(/\b/,e,/\w$/.test(e)?/\b/:/\B/),i=["Protocol","Type"].map(s),c=["init","self"].map(s),o=["Any","Self"],r=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","borrowing","break","case","catch","class","consume","consuming","continue","convenience","copy","default","defer","deinit","didSet","distributed","do","dynamic","each","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","macro","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","package","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],u=["false","nil","true"],l=["assignment","associativity","higherThan","left","lowerThan","none","right"],m=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warning"],p=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],d=t(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),b=t(d,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),F=a(d,b,"*"),h=t(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),f=t(h,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),w=a(h,f,"*"),y=a(/[A-Z]/,f,"*"),g=["attached","autoclosure",a(/convention\(/,t("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","freestanding","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",a(/objc\(/,w,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","Sendable","testable","UIApplicationMain","unchecked","unknown","usableFromInline","warn_unqualified_access"],v=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] +;return e=>{const d={match:/\s+/,relevance:0},h=e.COMMENT("/\\*","\\*/",{ +contains:["self"]}),A=[e.C_LINE_COMMENT_MODE,h],E={match:[/\./,t(...i,...c)], +className:{2:"keyword"}},k={match:a(/\./,t(...r)),relevance:0 +},C=r.filter((e=>"string"==typeof e)).concat(["_|0"]),N={variants:[{ +className:"keyword", +match:t(...r.filter((e=>"string"!=typeof e)).concat(o).map(s),...c)}]},S={ +$pattern:t(/\b\w+/,/#\w+/),keyword:C.concat(m),literal:u},B=[E,k,N],D=[{ +match:a(/\./,t(...p)),relevance:0},{className:"built_in", +match:a(/\b/,t(...p),/(?=\()/)}],_={match:/->/,relevance:0},M=[_,{ +className:"operator",relevance:0,variants:[{match:F},{match:`\\.(\\.|${b})+`}] +}],x="([0-9]_*)+",$="([0-9a-fA-F]_*)+",L={className:"number",relevance:0, +variants:[{match:`\\b(${x})(\\.(${x}))?([eE][+-]?(${x}))?\\b`},{ +match:`\\b0x(${$})(\\.(${$}))?([pP][+-]?(${x}))?\\b`},{match:/\b0o([0-7]_*)+\b/ +},{match:/\b0b([01]_*)+\b/}]},I=(e="")=>({className:"subst",variants:[{ +match:a(/\\/,e,/[0\\tnr"']/)},{match:a(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}] +}),O=(e="")=>({className:"subst",match:a(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/) +}),P=(e="")=>({className:"subst",label:"interpol",begin:a(/\\/,e,/\(/),end:/\)/ +}),j=(e="")=>({begin:a(e,/"""/),end:a(/"""/,e),contains:[I(e),O(e),P(e)] +}),K=(e="")=>({begin:a(e,/"/),end:a(/"/,e),contains:[I(e),P(e)]}),T={ +className:"string", +variants:[j(),j("#"),j("##"),j("###"),K(),K("#"),K("##"),K("###")] +},z=[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0, +contains:[e.BACKSLASH_ESCAPE]}],q={begin:/\/[^\s](?=[^/\n]*\/)/,end:/\//, +contains:z},U=e=>{const n=a(e,/\//),t=a(/\//,e);return{begin:n,end:t, +contains:[...z,{scope:"comment",begin:`#(?!.*${t})`,end:/$/}]}},Z={ +scope:"regexp",variants:[U("###"),U("##"),U("#"),q]},G={match:a(/`/,w,/`/) +},V=[G,{className:"variable",match:/\$\d+/},{className:"variable", +match:`\\$${f}+`}],W=[{match:/(@|#(un)?)available/,scope:"keyword",starts:{ +contains:[{begin:/\(/,end:/\)/,keywords:v,contains:[...M,L,T]}]}},{ +scope:"keyword",match:a(/@/,t(...g),n(t(/\(/,/\s+/)))},{scope:"meta", +match:a(/@/,w)}],H={match:n(/\b[A-Z]/),relevance:0,contains:[{className:"type", +match:a(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,f,"+") +},{className:"type",match:y,relevance:0},{match:/[?!]+/,relevance:0},{ +match:/\.\.\./,relevance:0},{match:a(/\s+&\s+/,n(y)),relevance:0}]},R={ +begin://,keywords:S,contains:[...A,...B,...W,_,H]};H.contains.push(R) +;const X={begin:/\(/,end:/\)/,relevance:0,keywords:S,contains:["self",{ +match:a(w,/\s*:/),keywords:"_|0",relevance:0 +},...A,Z,...B,...D,...M,L,T,...V,...W,H]},J={begin://, +keywords:"repeat each",contains:[...A,H]},Q={begin:/\(/,end:/\)/,keywords:S, +contains:[{begin:t(n(a(w,/\s*:/)),n(a(w,/\s+/,w,/\s*:/))),end:/:/,relevance:0, +contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:w}] +},...A,...B,...M,L,T,...W,H,X],endsParent:!0,illegal:/["']/},Y={ +match:[/(func|macro)/,/\s+/,t(G.match,w,F)],className:{1:"keyword", +3:"title.function"},contains:[J,Q,d],illegal:[/\[/,/%/]},ee={ +match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"}, +contains:[J,Q,d],illegal:/\[|%/},ne={match:[/operator/,/\s+/,F],className:{ +1:"keyword",3:"title"}},ae={begin:[/precedencegroup/,/\s+/,y],className:{ +1:"keyword",3:"title"},contains:[H],keywords:[...l,...u],end:/}/},te={ +begin:[/(struct|protocol|class|extension|enum|actor)/,/\s+/,w,/\s*/], +beginScope:{1:"keyword",3:"title.class"},keywords:S,contains:[J,...B,{begin:/:/, +end:/\{/,keywords:S,contains:[{scope:"title.class.inherited",match:y},...B], +relevance:0}]};for(const e of T.variants){ +const n=e.contains.find((e=>"interpol"===e.label));n.keywords=S +;const a=[...B,...D,...M,L,T,...V];n.contains=[...a,{begin:/\(/,end:/\)/, +contains:["self",...a]}]}return{name:"Swift",keywords:S,contains:[...A,Y,ee,{ +match:[/class\b/,/\s+/,/func\b/,/\s+/,/\b[A-Za-z_][A-Za-z0-9_]*\b/],scope:{ +1:"keyword",3:"keyword",5:"title.function"}},{match:[/class\b/,/\s+/,/var\b/], +scope:{1:"keyword",3:"keyword"}},te,ne,ae,{beginKeywords:"import",end:/$/, +contains:[...A],relevance:0},Z,...B,...D,...M,L,T,...V,...W,H,X]}}})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/typescript.js b/backend/static/highlight(1)/es/languages/typescript.js new file mode 100644 index 0000000..321538a --- /dev/null +++ b/backend/static/highlight(1)/es/languages/typescript.js @@ -0,0 +1,921 @@ +/*! `typescript` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*'; + const KEYWORDS = [ + "as", // for exports + "in", + "of", + "if", + "for", + "while", + "finally", + "var", + "new", + "function", + "do", + "return", + "void", + "else", + "break", + "catch", + "instanceof", + "with", + "throw", + "case", + "default", + "try", + "switch", + "continue", + "typeof", + "delete", + "let", + "yield", + "const", + "class", + // JS handles these with a special rule + // "get", + // "set", + "debugger", + "async", + "await", + "static", + "import", + "from", + "export", + "extends", + // It's reached stage 3, which is "recommended for implementation": + "using" + ]; + const LITERALS = [ + "true", + "false", + "null", + "undefined", + "NaN", + "Infinity" + ]; + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects + const TYPES = [ + // Fundamental objects + "Object", + "Function", + "Boolean", + "Symbol", + // numbers and dates + "Math", + "Date", + "Number", + "BigInt", + // text + "String", + "RegExp", + // Indexed collections + "Array", + "Float32Array", + "Float64Array", + "Int8Array", + "Uint8Array", + "Uint8ClampedArray", + "Int16Array", + "Int32Array", + "Uint16Array", + "Uint32Array", + "BigInt64Array", + "BigUint64Array", + // Keyed collections + "Set", + "Map", + "WeakSet", + "WeakMap", + // Structured data + "ArrayBuffer", + "SharedArrayBuffer", + "Atomics", + "DataView", + "JSON", + // Control abstraction objects + "Promise", + "Generator", + "GeneratorFunction", + "AsyncFunction", + // Reflection + "Reflect", + "Proxy", + // Internationalization + "Intl", + // WebAssembly + "WebAssembly" + ]; + + const ERROR_TYPES = [ + "Error", + "EvalError", + "InternalError", + "RangeError", + "ReferenceError", + "SyntaxError", + "TypeError", + "URIError" + ]; + + const BUILT_IN_GLOBALS = [ + "setInterval", + "setTimeout", + "clearInterval", + "clearTimeout", + + "require", + "exports", + + "eval", + "isFinite", + "isNaN", + "parseFloat", + "parseInt", + "decodeURI", + "decodeURIComponent", + "encodeURI", + "encodeURIComponent", + "escape", + "unescape" + ]; + + const BUILT_IN_VARIABLES = [ + "arguments", + "this", + "super", + "console", + "window", + "document", + "localStorage", + "sessionStorage", + "module", + "global" // Node.js + ]; + + const BUILT_INS = [].concat( + BUILT_IN_GLOBALS, + TYPES, + ERROR_TYPES + ); + + /* + Language: JavaScript + Description: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions. + Category: common, scripting, web + Website: https://developer.mozilla.org/en-US/docs/Web/JavaScript + */ + + + /** @type LanguageFn */ + function javascript(hljs) { + const regex = hljs.regex; + /** + * Takes a string like " { + const tag = "', + end: '' + }; + // to avoid some special cases inside isTrulyOpeningTag + const XML_SELF_CLOSING = /<[A-Za-z0-9\\._:-]+\s*\/>/; + const XML_TAG = { + begin: /<[A-Za-z0-9\\._:-]+/, + end: /\/[A-Za-z0-9\\._:-]+>|\/>/, + /** + * @param {RegExpMatchArray} match + * @param {CallbackResponse} response + */ + isTrulyOpeningTag: (match, response) => { + const afterMatchIndex = match[0].length + match.index; + const nextChar = match.input[afterMatchIndex]; + if ( + // HTML should not include another raw `<` inside a tag + // nested type? + // `>`, etc. + nextChar === "<" || + // the , gives away that this is not HTML + // `` + nextChar === "," + ) { + response.ignoreMatch(); + return; + } + + // `` + // Quite possibly a tag, lets look for a matching closing tag... + if (nextChar === ">") { + // if we cannot find a matching closing tag, then we + // will ignore it + if (!hasClosingTag(match, { after: afterMatchIndex })) { + response.ignoreMatch(); + } + } + + // `` (self-closing) + // handled by simpleSelfClosing rule + + let m; + const afterMatch = match.input.substring(afterMatchIndex); + + // some more template typing stuff + // (key?: string) => Modify< + if ((m = afterMatch.match(/^\s*=/))) { + response.ignoreMatch(); + return; + } + + // `` + // technically this could be HTML, but it smells like a type + // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276 + if ((m = afterMatch.match(/^\s+extends\s+/))) { + if (m.index === 0) { + response.ignoreMatch(); + // eslint-disable-next-line no-useless-return + return; + } + } + } + }; + const KEYWORDS$1 = { + $pattern: IDENT_RE, + keyword: KEYWORDS, + literal: LITERALS, + built_in: BUILT_INS, + "variable.language": BUILT_IN_VARIABLES + }; + + // https://tc39.es/ecma262/#sec-literals-numeric-literals + const decimalDigits = '[0-9](_?[0-9])*'; + const frac = `\\.(${decimalDigits})`; + // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral + // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals + const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`; + const NUMBER = { + className: 'number', + variants: [ + // DecimalLiteral + { begin: `(\\b(${decimalInteger})((${frac})|\\.)?|(${frac}))` + + `[eE][+-]?(${decimalDigits})\\b` }, + { begin: `\\b(${decimalInteger})\\b((${frac})\\b|\\.)?|(${frac})\\b` }, + + // DecimalBigIntegerLiteral + { begin: `\\b(0|[1-9](_?[0-9])*)n\\b` }, + + // NonDecimalIntegerLiteral + { begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b" }, + { begin: "\\b0[bB][0-1](_?[0-1])*n?\\b" }, + { begin: "\\b0[oO][0-7](_?[0-7])*n?\\b" }, + + // LegacyOctalIntegerLiteral (does not include underscore separators) + // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals + { begin: "\\b0[0-7]+n?\\b" }, + ], + relevance: 0 + }; + + const SUBST = { + className: 'subst', + begin: '\\$\\{', + end: '\\}', + keywords: KEYWORDS$1, + contains: [] // defined later + }; + const HTML_TEMPLATE = { + begin: '\.?html`', + end: '', + starts: { + end: '`', + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + subLanguage: 'xml' + } + }; + const CSS_TEMPLATE = { + begin: '\.?css`', + end: '', + starts: { + end: '`', + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + subLanguage: 'css' + } + }; + const GRAPHQL_TEMPLATE = { + begin: '\.?gql`', + end: '', + starts: { + end: '`', + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + subLanguage: 'graphql' + } + }; + const TEMPLATE_STRING = { + className: 'string', + begin: '`', + end: '`', + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ] + }; + const JSDOC_COMMENT = hljs.COMMENT( + /\/\*\*(?!\/)/, + '\\*/', + { + relevance: 0, + contains: [ + { + begin: '(?=@[A-Za-z]+)', + relevance: 0, + contains: [ + { + className: 'doctag', + begin: '@[A-Za-z]+' + }, + { + className: 'type', + begin: '\\{', + end: '\\}', + excludeEnd: true, + excludeBegin: true, + relevance: 0 + }, + { + className: 'variable', + begin: IDENT_RE$1 + '(?=\\s*(-)|$)', + endsParent: true, + relevance: 0 + }, + // eat spaces (not newlines) so we can find + // types or variables + { + begin: /(?=[^\n])\s/, + relevance: 0 + } + ] + } + ] + } + ); + const COMMENT = { + className: "comment", + variants: [ + JSDOC_COMMENT, + hljs.C_BLOCK_COMMENT_MODE, + hljs.C_LINE_COMMENT_MODE + ] + }; + const SUBST_INTERNALS = [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + HTML_TEMPLATE, + CSS_TEMPLATE, + GRAPHQL_TEMPLATE, + TEMPLATE_STRING, + // Skip numbers when they are part of a variable name + { match: /\$\d+/ }, + NUMBER, + // This is intentional: + // See https://github.com/highlightjs/highlight.js/issues/3288 + // hljs.REGEXP_MODE + ]; + SUBST.contains = SUBST_INTERNALS + .concat({ + // we need to pair up {} inside our subst to prevent + // it from ending too early by matching another } + begin: /\{/, + end: /\}/, + keywords: KEYWORDS$1, + contains: [ + "self" + ].concat(SUBST_INTERNALS) + }); + const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains); + const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([ + // eat recursive parens in sub expressions + { + begin: /(\s*)\(/, + end: /\)/, + keywords: KEYWORDS$1, + contains: ["self"].concat(SUBST_AND_COMMENTS) + } + ]); + const PARAMS = { + className: 'params', + // convert this to negative lookbehind in v12 + begin: /(\s*)\(/, // to match the parms with + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS$1, + contains: PARAMS_CONTAINS + }; + + // ES6 classes + const CLASS_OR_EXTENDS = { + variants: [ + // class Car extends vehicle + { + match: [ + /class/, + /\s+/, + IDENT_RE$1, + /\s+/, + /extends/, + /\s+/, + regex.concat(IDENT_RE$1, "(", regex.concat(/\./, IDENT_RE$1), ")*") + ], + scope: { + 1: "keyword", + 3: "title.class", + 5: "keyword", + 7: "title.class.inherited" + } + }, + // class Car + { + match: [ + /class/, + /\s+/, + IDENT_RE$1 + ], + scope: { + 1: "keyword", + 3: "title.class" + } + }, + + ] + }; + + const CLASS_REFERENCE = { + relevance: 0, + match: + regex.either( + // Hard coded exceptions + /\bJSON/, + // Float32Array, OutT + /\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/, + // CSSFactory, CSSFactoryT + /\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/, + // FPs, FPsT + /\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/, + // P + // single letters are not highlighted + // BLAH + // this will be flagged as a UPPER_CASE_CONSTANT instead + ), + className: "title.class", + keywords: { + _: [ + // se we still get relevance credit for JS library classes + ...TYPES, + ...ERROR_TYPES + ] + } + }; + + const USE_STRICT = { + label: "use_strict", + className: 'meta', + relevance: 10, + begin: /^\s*['"]use (strict|asm)['"]/ + }; + + const FUNCTION_DEFINITION = { + variants: [ + { + match: [ + /function/, + /\s+/, + IDENT_RE$1, + /(?=\s*\()/ + ] + }, + // anonymous function + { + match: [ + /function/, + /\s*(?=\()/ + ] + } + ], + className: { + 1: "keyword", + 3: "title.function" + }, + label: "func.def", + contains: [ PARAMS ], + illegal: /%/ + }; + + const UPPER_CASE_CONSTANT = { + relevance: 0, + match: /\b[A-Z][A-Z_0-9]+\b/, + className: "variable.constant" + }; + + function noneOf(list) { + return regex.concat("(?!", list.join("|"), ")"); + } + + const FUNCTION_CALL = { + match: regex.concat( + /\b/, + noneOf([ + ...BUILT_IN_GLOBALS, + "super", + "import" + ].map(x => `${x}\\s*\\(`)), + IDENT_RE$1, regex.lookahead(/\s*\(/)), + className: "title.function", + relevance: 0 + }; + + const PROPERTY_ACCESS = { + begin: regex.concat(/\./, regex.lookahead( + regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/) + )), + end: IDENT_RE$1, + excludeBegin: true, + keywords: "prototype", + className: "property", + relevance: 0 + }; + + const GETTER_OR_SETTER = { + match: [ + /get|set/, + /\s+/, + IDENT_RE$1, + /(?=\()/ + ], + className: { + 1: "keyword", + 3: "title.function" + }, + contains: [ + { // eat to avoid empty params + begin: /\(\)/ + }, + PARAMS + ] + }; + + const FUNC_LEAD_IN_RE = '(\\(' + + '[^()]*(\\(' + + '[^()]*(\\(' + + '[^()]*' + + '\\)[^()]*)*' + + '\\)[^()]*)*' + + '\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\s*=>'; + + const FUNCTION_VARIABLE = { + match: [ + /const|var|let/, /\s+/, + IDENT_RE$1, /\s*/, + /=\s*/, + /(async\s*)?/, // async is optional + regex.lookahead(FUNC_LEAD_IN_RE) + ], + keywords: "async", + className: { + 1: "keyword", + 3: "title.function" + }, + contains: [ + PARAMS + ] + }; + + return { + name: 'JavaScript', + aliases: ['js', 'jsx', 'mjs', 'cjs'], + keywords: KEYWORDS$1, + // this will be extended by TypeScript + exports: { PARAMS_CONTAINS, CLASS_REFERENCE }, + illegal: /#(?![$_A-z])/, + contains: [ + hljs.SHEBANG({ + label: "shebang", + binary: "node", + relevance: 5 + }), + USE_STRICT, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + HTML_TEMPLATE, + CSS_TEMPLATE, + GRAPHQL_TEMPLATE, + TEMPLATE_STRING, + COMMENT, + // Skip numbers when they are part of a variable name + { match: /\$\d+/ }, + NUMBER, + CLASS_REFERENCE, + { + scope: 'attr', + match: IDENT_RE$1 + regex.lookahead(':'), + relevance: 0 + }, + FUNCTION_VARIABLE, + { // "value" container + begin: '(' + hljs.RE_STARTERS_RE + '|\\b(case|return|throw)\\b)\\s*', + keywords: 'return throw case', + relevance: 0, + contains: [ + COMMENT, + hljs.REGEXP_MODE, + { + className: 'function', + // we have to count the parens to make sure we actually have the + // correct bounding ( ) before the =>. There could be any number of + // sub-expressions inside also surrounded by parens. + begin: FUNC_LEAD_IN_RE, + returnBegin: true, + end: '\\s*=>', + contains: [ + { + className: 'params', + variants: [ + { + begin: hljs.UNDERSCORE_IDENT_RE, + relevance: 0 + }, + { + className: null, + begin: /\(\s*\)/, + skip: true + }, + { + begin: /(\s*)\(/, + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS$1, + contains: PARAMS_CONTAINS + } + ] + } + ] + }, + { // could be a comma delimited list of params to a function call + begin: /,/, + relevance: 0 + }, + { + match: /\s+/, + relevance: 0 + }, + { // JSX + variants: [ + { begin: FRAGMENT.begin, end: FRAGMENT.end }, + { match: XML_SELF_CLOSING }, + { + begin: XML_TAG.begin, + // we carefully check the opening tag to see if it truly + // is a tag and not a false positive + 'on:begin': XML_TAG.isTrulyOpeningTag, + end: XML_TAG.end + } + ], + subLanguage: 'xml', + contains: [ + { + begin: XML_TAG.begin, + end: XML_TAG.end, + skip: true, + contains: ['self'] + } + ] + } + ], + }, + FUNCTION_DEFINITION, + { + // prevent this from getting swallowed up by function + // since they appear "function like" + beginKeywords: "while if switch catch for" + }, + { + // we have to count the parens to make sure we actually have the correct + // bounding ( ). There could be any number of sub-expressions inside + // also surrounded by parens. + begin: '\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE + + '\\(' + // first parens + '[^()]*(\\(' + + '[^()]*(\\(' + + '[^()]*' + + '\\)[^()]*)*' + + '\\)[^()]*)*' + + '\\)\\s*\\{', // end parens + returnBegin:true, + label: "func.def", + contains: [ + PARAMS, + hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: "title.function" }) + ] + }, + // catch ... so it won't trigger the property rule below + { + match: /\.\.\./, + relevance: 0 + }, + PROPERTY_ACCESS, + // hack: prevents detection of keywords in some circumstances + // .keyword() + // $keyword = x + { + match: '\\$' + IDENT_RE$1, + relevance: 0 + }, + { + match: [ /\bconstructor(?=\s*\()/ ], + className: { 1: "title.function" }, + contains: [ PARAMS ] + }, + FUNCTION_CALL, + UPPER_CASE_CONSTANT, + CLASS_OR_EXTENDS, + GETTER_OR_SETTER, + { + match: /\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something` + } + ] + }; + } + + /* + Language: TypeScript + Author: Panu Horsmalahti + Contributors: Ike Ku + Description: TypeScript is a strict superset of JavaScript + Website: https://www.typescriptlang.org + Category: common, scripting + */ + + + /** @type LanguageFn */ + function typescript(hljs) { + const regex = hljs.regex; + const tsLanguage = javascript(hljs); + + const IDENT_RE$1 = IDENT_RE; + const TYPES = [ + "any", + "void", + "number", + "boolean", + "string", + "object", + "never", + "symbol", + "bigint", + "unknown" + ]; + const NAMESPACE = { + begin: [ + /namespace/, + /\s+/, + hljs.IDENT_RE + ], + beginScope: { + 1: "keyword", + 3: "title.class" + } + }; + const INTERFACE = { + beginKeywords: 'interface', + end: /\{/, + excludeEnd: true, + keywords: { + keyword: 'interface extends', + built_in: TYPES + }, + contains: [ tsLanguage.exports.CLASS_REFERENCE ] + }; + const USE_STRICT = { + className: 'meta', + relevance: 10, + begin: /^\s*['"]use strict['"]/ + }; + const TS_SPECIFIC_KEYWORDS = [ + "type", + // "namespace", + "interface", + "public", + "private", + "protected", + "implements", + "declare", + "abstract", + "readonly", + "enum", + "override", + "satisfies" + ]; + /* + namespace is a TS keyword but it's fine to use it as a variable name too. + const message = 'foo'; + const namespace = 'bar'; + */ + const KEYWORDS$1 = { + $pattern: IDENT_RE, + keyword: KEYWORDS.concat(TS_SPECIFIC_KEYWORDS), + literal: LITERALS, + built_in: BUILT_INS.concat(TYPES), + "variable.language": BUILT_IN_VARIABLES + }; + + const DECORATOR = { + className: 'meta', + begin: '@' + IDENT_RE$1, + }; + + const swapMode = (mode, label, replacement) => { + const indx = mode.contains.findIndex(m => m.label === label); + if (indx === -1) { throw new Error("can not find mode to replace"); } + + mode.contains.splice(indx, 1, replacement); + }; + + + // this should update anywhere keywords is used since + // it will be the same actual JS object + Object.assign(tsLanguage.keywords, KEYWORDS$1); + + tsLanguage.exports.PARAMS_CONTAINS.push(DECORATOR); + + // highlight the function params + const ATTRIBUTE_HIGHLIGHT = tsLanguage.contains.find(c => c.scope === "attr"); + + // take default attr rule and extend it to support optionals + const OPTIONAL_KEY_OR_ARGUMENT = Object.assign({}, + ATTRIBUTE_HIGHLIGHT, + { match: regex.concat(IDENT_RE$1, regex.lookahead(/\s*\?:/)) } + ); + tsLanguage.exports.PARAMS_CONTAINS.push([ + tsLanguage.exports.CLASS_REFERENCE, // class reference for highlighting the params types + ATTRIBUTE_HIGHLIGHT, // highlight the params key + OPTIONAL_KEY_OR_ARGUMENT, // Added for optional property assignment highlighting + ]); + + // Add the optional property assignment highlighting for objects or classes + tsLanguage.contains = tsLanguage.contains.concat([ + DECORATOR, + NAMESPACE, + INTERFACE, + OPTIONAL_KEY_OR_ARGUMENT, // Added for optional property assignment highlighting + ]); + + // TS gets a simpler shebang rule than JS + swapMode(tsLanguage, "shebang", hljs.SHEBANG()); + // JS use strict rule purposely excludes `asm` which makes no sense + swapMode(tsLanguage, "use_strict", USE_STRICT); + + const functionDeclaration = tsLanguage.contains.find(m => m.label === "func.def"); + functionDeclaration.relevance = 0; // () => {} is more typical in TypeScript + + Object.assign(tsLanguage, { + name: 'TypeScript', + aliases: [ + 'ts', + 'tsx', + 'mts', + 'cts' + ] + }); + + return tsLanguage; + } + + return typescript; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/typescript.min.js b/backend/static/highlight(1)/es/languages/typescript.min.js new file mode 100644 index 0000000..3e11fe5 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/typescript.min.js @@ -0,0 +1,99 @@ +/*! `typescript` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict" +;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],a=["true","false","null","undefined","NaN","Infinity"],t=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],s=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],r=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],c=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],i=[].concat(r,t,s) +;function o(o){const l=o.regex,d=e,b={begin:/<[A-Za-z0-9\\._:-]+/, +end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ +const a=e[0].length+e.index,t=e.input[a] +;if("<"===t||","===t)return void n.ignoreMatch();let s +;">"===t&&(((e,{after:n})=>{const a="e+"\\s*\\(")), +l.concat("(?!",C.join("|"),")")),d,l.lookahead(/\s*\(/)), +className:"title.function",relevance:0};var C;const T={ +begin:l.concat(/\./,l.lookahead(l.concat(d,/(?![0-9A-Za-z$_(])/))),end:d, +excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},M={ +match:[/get|set/,/\s+/,d,/(?=\()/],className:{1:"keyword",3:"title.function"}, +contains:[{begin:/\(\)/},R] +},B="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+o.UNDERSCORE_IDENT_RE+")\\s*=>",$={ +match:[/const|var|let/,/\s+/,d,/\s*/,/=\s*/,/(async\s*)?/,l.lookahead(B)], +keywords:"async",className:{1:"keyword",3:"title.function"},contains:[R]} +;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:g,exports:{ +PARAMS_CONTAINS:w,CLASS_REFERENCE:k},illegal:/#(?![$_A-z])/, +contains:[o.SHEBANG({label:"shebang",binary:"node",relevance:5}),{ +label:"use_strict",className:"meta",relevance:10, +begin:/^\s*['"]use (strict|asm)['"]/ +},o.APOS_STRING_MODE,o.QUOTE_STRING_MODE,p,f,N,h,_,{match:/\$\d+/},A,k,{ +scope:"attr",match:d+l.lookahead(":"),relevance:0},$,{ +begin:"("+o.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*", +keywords:"return throw case",relevance:0,contains:[_,o.REGEXP_MODE,{ +className:"function",begin:B,returnBegin:!0,end:"\\s*=>",contains:[{ +className:"params",variants:[{begin:o.UNDERSCORE_IDENT_RE,relevance:0},{ +className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/, +excludeBegin:!0,excludeEnd:!0,keywords:g,contains:w}]}]},{begin:/,/,relevance:0 +},{match:/\s+/,relevance:0},{variants:[{begin:"<>",end:""},{ +match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:b.begin, +"on:begin":b.isTrulyOpeningTag,end:b.end}],subLanguage:"xml",contains:[{ +begin:b.begin,end:b.end,skip:!0,contains:["self"]}]}]},O,{ +beginKeywords:"while if switch catch for"},{ +begin:"\\b(?!function)"+o.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,label:"func.def",contains:[R,o.inherit(o.TITLE_MODE,{begin:d, +className:"title.function"})]},{match:/\.\.\./,relevance:0},T,{match:"\\$"+d, +relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"}, +contains:[R]},I,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},x,M,{match:/\$[(.]/}]}}return t=>{ +const s=t.regex,r=o(t),l=e,d=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],b={ +begin:[/namespace/,/\s+/,t.IDENT_RE],beginScope:{1:"keyword",3:"title.class"} +},g={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{ +keyword:"interface extends",built_in:d},contains:[r.exports.CLASS_REFERENCE] +},u={$pattern:e, +keyword:n.concat(["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"]), +literal:a,built_in:i.concat(d),"variable.language":c},m={className:"meta", +begin:"@"+l},E=(e,n,a)=>{const t=e.contains.findIndex((e=>e.label===n)) +;if(-1===t)throw Error("can not find mode to replace");e.contains.splice(t,1,a)} +;Object.assign(r.keywords,u),r.exports.PARAMS_CONTAINS.push(m) +;const A=r.contains.find((e=>"attr"===e.scope)),y=Object.assign({},A,{ +match:s.concat(l,s.lookahead(/\s*\?:/))}) +;return r.exports.PARAMS_CONTAINS.push([r.exports.CLASS_REFERENCE,A,y]), +r.contains=r.contains.concat([m,b,g,y]), +E(r,"shebang",t.SHEBANG()),E(r,"use_strict",{className:"meta",relevance:10, +begin:/^\s*['"]use strict['"]/ +}),r.contains.find((e=>"func.def"===e.label)).relevance=0,Object.assign(r,{ +name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),r}})() +;export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/vbnet.js b/backend/static/highlight(1)/es/languages/vbnet.js new file mode 100644 index 0000000..4390e3f --- /dev/null +++ b/backend/static/highlight(1)/es/languages/vbnet.js @@ -0,0 +1,165 @@ +/*! `vbnet` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: Visual Basic .NET + Description: Visual Basic .NET (VB.NET) is a multi-paradigm, object-oriented programming language, implemented on the .NET Framework. + Authors: Poren Chiang , Jan Pilzer + Website: https://docs.microsoft.com/dotnet/visual-basic/getting-started + Category: common + */ + + /** @type LanguageFn */ + function vbnet(hljs) { + const regex = hljs.regex; + /** + * Character Literal + * Either a single character ("a"C) or an escaped double quote (""""C). + */ + const CHARACTER = { + className: 'string', + begin: /"(""|[^/n])"C\b/ + }; + + const STRING = { + className: 'string', + begin: /"/, + end: /"/, + illegal: /\n/, + contains: [ + { + // double quote escape + begin: /""/ } + ] + }; + + /** Date Literals consist of a date, a time, or both separated by whitespace, surrounded by # */ + const MM_DD_YYYY = /\d{1,2}\/\d{1,2}\/\d{4}/; + const YYYY_MM_DD = /\d{4}-\d{1,2}-\d{1,2}/; + const TIME_12H = /(\d|1[012])(:\d+){0,2} *(AM|PM)/; + const TIME_24H = /\d{1,2}(:\d{1,2}){1,2}/; + const DATE = { + className: 'literal', + variants: [ + { + // #YYYY-MM-DD# (ISO-Date) or #M/D/YYYY# (US-Date) + begin: regex.concat(/# */, regex.either(YYYY_MM_DD, MM_DD_YYYY), / *#/) }, + { + // #H:mm[:ss]# (24h Time) + begin: regex.concat(/# */, TIME_24H, / *#/) }, + { + // #h[:mm[:ss]] A# (12h Time) + begin: regex.concat(/# */, TIME_12H, / *#/) }, + { + // date plus time + begin: regex.concat( + /# */, + regex.either(YYYY_MM_DD, MM_DD_YYYY), + / +/, + regex.either(TIME_12H, TIME_24H), + / *#/ + ) } + ] + }; + + const NUMBER = { + className: 'number', + relevance: 0, + variants: [ + { + // Float + begin: /\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ }, + { + // Integer (base 10) + begin: /\b\d[\d_]*((U?[SIL])|[%&])?/ }, + { + // Integer (base 16) + begin: /&H[\dA-F_]+((U?[SIL])|[%&])?/ }, + { + // Integer (base 8) + begin: /&O[0-7_]+((U?[SIL])|[%&])?/ }, + { + // Integer (base 2) + begin: /&B[01_]+((U?[SIL])|[%&])?/ } + ] + }; + + const LABEL = { + className: 'label', + begin: /^\w+:/ + }; + + const DOC_COMMENT = hljs.COMMENT(/'''/, /$/, { contains: [ + { + className: 'doctag', + begin: /<\/?/, + end: />/ + } + ] }); + + const COMMENT = hljs.COMMENT(null, /$/, { variants: [ + { begin: /'/ }, + { + // TODO: Use multi-class for leading spaces + begin: /([\t ]|^)REM(?=\s)/ } + ] }); + + const DIRECTIVES = { + className: 'meta', + // TODO: Use multi-class for indentation once available + begin: /[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, + end: /$/, + keywords: { keyword: + 'const disable else elseif enable end externalsource if region then' }, + contains: [ COMMENT ] + }; + + return { + name: 'Visual Basic .NET', + aliases: [ 'vb' ], + case_insensitive: true, + classNameAliases: { label: 'symbol' }, + keywords: { + keyword: + 'addhandler alias aggregate ansi as async assembly auto binary by byref byval ' /* a-b */ + + 'call case catch class compare const continue custom declare default delegate dim distinct do ' /* c-d */ + + 'each equals else elseif end enum erase error event exit explicit finally for friend from function ' /* e-f */ + + 'get global goto group handles if implements imports in inherits interface into iterator ' /* g-i */ + + 'join key let lib loop me mid module mustinherit mustoverride mybase myclass ' /* j-m */ + + 'namespace narrowing new next notinheritable notoverridable ' /* n */ + + 'of off on operator option optional order overloads overridable overrides ' /* o */ + + 'paramarray partial preserve private property protected public ' /* p */ + + 'raiseevent readonly redim removehandler resume return ' /* r */ + + 'select set shadows shared skip static step stop structure strict sub synclock ' /* s */ + + 'take text then throw to try unicode until using when where while widening with withevents writeonly yield' /* t-y */, + built_in: + // Operators https://docs.microsoft.com/dotnet/visual-basic/language-reference/operators + 'addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor ' + // Type Conversion Functions https://docs.microsoft.com/dotnet/visual-basic/language-reference/functions/type-conversion-functions + + 'cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort', + type: + // Data types https://docs.microsoft.com/dotnet/visual-basic/language-reference/data-types + 'boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort', + literal: 'true false nothing' + }, + illegal: + '//|\\{|\\}|endif|gosub|variant|wend|^\\$ ' /* reserved deprecated keywords */, + contains: [ + CHARACTER, + STRING, + DATE, + NUMBER, + LABEL, + DOC_COMMENT, + COMMENT, + DIRECTIVES + ] + }; + } + + return vbnet; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/vbnet.min.js b/backend/static/highlight(1)/es/languages/vbnet.min.js new file mode 100644 index 0000000..96f5541 --- /dev/null +++ b/backend/static/highlight(1)/es/languages/vbnet.min.js @@ -0,0 +1,25 @@ +/*! `vbnet` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{ +const a=e.regex,n=/\d{1,2}\/\d{1,2}\/\d{4}/,t=/\d{4}-\d{1,2}-\d{1,2}/,i=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,s=/\d{1,2}(:\d{1,2}){1,2}/,r={ +className:"literal",variants:[{begin:a.concat(/# */,a.either(t,n),/ *#/)},{ +begin:a.concat(/# */,s,/ *#/)},{begin:a.concat(/# */,i,/ *#/)},{ +begin:a.concat(/# */,a.either(t,n),/ +/,a.either(i,s),/ *#/)}] +},l=e.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}] +}),o=e.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]}) +;return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0, +classNameAliases:{label:"symbol"},keywords:{ +keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", +built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort", +type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort", +literal:"true false nothing"}, +illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{ +className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/, +end:/"/,illegal:/\n/,contains:[{begin:/""/}]},r,{className:"number",relevance:0, +variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ +},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{ +begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},{ +className:"label",begin:/^\w+:/},l,o,{className:"meta", +begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, +end:/$/,keywords:{ +keyword:"const disable else elseif enable end externalsource if region then"}, +contains:[o]}]}}})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/wasm.js b/backend/static/highlight(1)/es/languages/wasm.js new file mode 100644 index 0000000..b9be2bd --- /dev/null +++ b/backend/static/highlight(1)/es/languages/wasm.js @@ -0,0 +1,147 @@ +/*! `wasm` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: WebAssembly + Website: https://webassembly.org + Description: Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server applications. + Category: web, common + Audit: 2020 + */ + + /** @type LanguageFn */ + function wasm(hljs) { + hljs.regex; + const BLOCK_COMMENT = hljs.COMMENT(/\(;/, /;\)/); + BLOCK_COMMENT.contains.push("self"); + const LINE_COMMENT = hljs.COMMENT(/;;/, /$/); + + const KWS = [ + "anyfunc", + "block", + "br", + "br_if", + "br_table", + "call", + "call_indirect", + "data", + "drop", + "elem", + "else", + "end", + "export", + "func", + "global.get", + "global.set", + "local.get", + "local.set", + "local.tee", + "get_global", + "get_local", + "global", + "if", + "import", + "local", + "loop", + "memory", + "memory.grow", + "memory.size", + "module", + "mut", + "nop", + "offset", + "param", + "result", + "return", + "select", + "set_global", + "set_local", + "start", + "table", + "tee_local", + "then", + "type", + "unreachable" + ]; + + const FUNCTION_REFERENCE = { + begin: [ + /(?:func|call|call_indirect)/, + /\s+/, + /\$[^\s)]+/ + ], + className: { + 1: "keyword", + 3: "title.function" + } + }; + + const ARGUMENT = { + className: "variable", + begin: /\$[\w_]+/ + }; + + const PARENS = { + match: /(\((?!;)|\))+/, + className: "punctuation", + relevance: 0 + }; + + const NUMBER = { + className: "number", + relevance: 0, + // borrowed from Prism, TODO: split out into variants + match: /[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/ + }; + + const TYPE = { + // look-ahead prevents us from gobbling up opcodes + match: /(i32|i64|f32|f64)(?!\.)/, + className: "type" + }; + + const MATH_OPERATIONS = { + className: "keyword", + // borrowed from Prism, TODO: split out into variants + match: /\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/ + }; + + const OFFSET_ALIGN = { + match: [ + /(?:offset|align)/, + /\s*/, + /=/ + ], + className: { + 1: "keyword", + 3: "operator" + } + }; + + return { + name: 'WebAssembly', + keywords: { + $pattern: /[\w.]+/, + keyword: KWS + }, + contains: [ + LINE_COMMENT, + BLOCK_COMMENT, + OFFSET_ALIGN, + ARGUMENT, + PARENS, + FUNCTION_REFERENCE, + hljs.QUOTE_STRING_MODE, + TYPE, + MATH_OPERATIONS, + NUMBER + ] + }; + } + + return wasm; + +})(); +; +export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/wasm.min.js b/backend/static/highlight(1)/es/languages/wasm.min.js new file mode 100644 index 0000000..786c33d --- /dev/null +++ b/backend/static/highlight(1)/es/languages/wasm.min.js @@ -0,0 +1,15 @@ +/*! `wasm` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar=(()=>{"use strict";return e=>{e.regex +;const a=e.COMMENT(/\(;/,/;\)/);return a.contains.push("self"),{ +name:"WebAssembly",keywords:{$pattern:/[\w.]+/, +keyword:["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable"] +},contains:[e.COMMENT(/;;/,/$/),a,{match:[/(?:offset|align)/,/\s*/,/=/], +className:{1:"keyword",3:"operator"}},{className:"variable",begin:/\$[\w_]+/},{ +match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},{ +begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword", +3:"title.function"}},e.QUOTE_STRING_MODE,{match:/(i32|i64|f32|f64)(?!\.)/, +className:"type"},{className:"keyword", +match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/ +},{className:"number",relevance:0, +match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/ +}]}}})();export default hljsGrammar; \ No newline at end of file diff --git a/backend/static/highlight(1)/es/languages/xml.js b/backend/static/highlight(1)/es/languages/xml.js new file mode 100644 index 0000000..cb3689b --- /dev/null +++ b/backend/static/highlight(1)/es/languages/xml.js @@ -0,0 +1,249 @@ +/*! `xml` grammar compiled for Highlight.js 11.11.1 */ +var hljsGrammar = (function () { + 'use strict'; + + /* + Language: HTML, XML + Website: https://www.w3.org/XML/ + Category: common, web + Audit: 2020 + */ + + /** @type LanguageFn */ + function xml(hljs) { + const regex = hljs.regex; + // XML names can have the following additional letters: https://www.w3.org/TR/xml/#NT-NameChar + // OTHER_NAME_CHARS = /[:\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]/; + // Element names start with NAME_START_CHAR followed by optional other Unicode letters, ASCII digits, hyphens, underscores, and periods + // const TAG_NAME_RE = regex.concat(/[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/, regex.optional(/[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*:/), /[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*/);; + // const XML_IDENT_RE = /[A-Z_a-z:\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]+/; + // const TAG_NAME_RE = regex.concat(/[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/, regex.optional(/[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*:/), /[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*/); + // however, to cater for performance and more Unicode support rely simply on the Unicode letter class + const TAG_NAME_RE = regex.concat(/[\p{L}_]/u, regex.optional(/[\p{L}0-9_.-]*:/u), /[\p{L}0-9_.-]*/u); + const XML_IDENT_RE = /[\p{L}0-9._:-]+/u; + const XML_ENTITIES = { + className: 'symbol', + begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/ + }; + const XML_META_KEYWORDS = { + begin: /\s/, + contains: [ + { + className: 'keyword', + begin: /#?[a-z_][a-z1-9_-]+/, + illegal: /\n/ + } + ] + }; + const XML_META_PAR_KEYWORDS = hljs.inherit(XML_META_KEYWORDS, { + begin: /\(/, + end: /\)/ + }); + const APOS_META_STRING_MODE = hljs.inherit(hljs.APOS_STRING_MODE, { className: 'string' }); + const QUOTE_META_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, { className: 'string' }); + const TAG_INTERNALS = { + endsWithParent: true, + illegal: /`]+/ } + ] + } + ] + } + ] + }; + return { + name: 'HTML, XML', + aliases: [ + 'html', + 'xhtml', + 'rss', + 'atom', + 'xjb', + 'xsd', + 'xsl', + 'plist', + 'wsf', + 'svg' + ], + case_insensitive: true, + unicodeRegex: true, + contains: [ + { + className: 'meta', + begin: //, + relevance: 10, + contains: [ + XML_META_KEYWORDS, + QUOTE_META_STRING_MODE, + APOS_META_STRING_MODE, + XML_META_PAR_KEYWORDS, + { + begin: /\[/, + end: /\]/, + contains: [ + { + className: 'meta', + begin: //, + contains: [ + XML_META_KEYWORDS, + XML_META_PAR_KEYWORDS, + QUOTE_META_STRING_MODE, + APOS_META_STRING_MODE + ] + } + ] + } + ] + }, + hljs.COMMENT( + //, + { relevance: 10 } + ), + { + begin: //, + relevance: 10 + }, + XML_ENTITIES, + // xml processing instructions + { + className: 'meta', + end: /\?>/, + variants: [ + { + begin: /<\?xml/, + relevance: 10, + contains: [ + QUOTE_META_STRING_MODE + ] + }, + { + begin: /<\?[a-z][a-z0-9]+/, + } + ] + + }, + { + className: 'tag', + /* + The lookahead pattern (?=...) ensures that 'begin' only matches + ')/, + end: />/, + keywords: { name: 'style' }, + contains: [ TAG_INTERNALS ], + starts: { + end: /<\/style>/, + returnEnd: true, + subLanguage: [ + 'css', + 'xml' + ] + } + }, + { + className: 'tag', + // See the comment in the