diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..053c9066
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+*.own linguist-language=Scala
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
new file mode 100644
index 00000000..15ba0c83
--- /dev/null
+++ b/.github/workflows/docs.yml
@@ -0,0 +1,55 @@
+name: docs
+
+on:
+ push:
+ branches: [ "latest" ]
+
+jobs:
+ docs-build:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ node-version: [16]
+ java: [21]
+ steps:
+ - uses: actions/checkout@v4
+ - uses: pnpm/action-setup@v3
+ with:
+ version: 8
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v3
+ with:
+ node-version: ${{ matrix.node-version }}
+ cache: pnpm
+ cache-dependency-path: docs/pnpm-lock.yaml
+ - name: Install dependencies
+ run: cd docs && pnpm install
+
+ - name: Set up JDK ${{ matrix.java }}
+ uses: actions/setup-java@v4
+ with:
+ java-version: ${{ matrix.java }}
+ distribution: 'temurin'
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@v4
+ - name: Build docs
+ run: ./gradlew buildDocs
+
+ - name: Clear docs
+ uses: appleboy/ssh-action@v1.0.3
+ with:
+ host: ${{ secrets.SSH_HOST }}
+ username: ${{ secrets.SSH_USERNAME }}
+ port: ${{ secrets.SSH_PORT }}
+ key: ${{ secrets.SSH_KEY }}
+ script: ${{ secrets.DOCS_CLEAR_SCRIPT }}
+ - name: Upload docs
+ uses: appleboy/scp-action@v0.1.7
+ with:
+ host: ${{ secrets.SSH_HOST }}
+ username: ${{ secrets.SSH_USERNAME }}
+ port: ${{ secrets.SSH_PORT }}
+ key: ${{ secrets.SSH_KEY }}
+ source: './docs/docs/.vuepress/dist/*'
+ target: ${{ secrets.DOCS_UPLOAD_PATH }}
+ strip_components: 4
diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml
new file mode 100644
index 00000000..5d69a63c
--- /dev/null
+++ b/.github/workflows/gradle.yml
@@ -0,0 +1,26 @@
+name: build
+
+on:
+ push:
+ branches: [ "latest" ]
+ pull_request:
+ branches: [ "latest" ]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ java: [ '17', '21' ]
+ name: Test
+ steps:
+ - uses: actions/checkout@v4
+ - name: Set up JDK ${{ matrix.java }}
+ uses: actions/setup-java@v4
+ with:
+ java-version: ${{ matrix.java }}
+ distribution: 'temurin'
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@v4
+ - name: Run tests
+ run: ./gradlew test
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..ee9683a7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+/.gradle/
+/.idea/
+/.nb-gradle/
+**/build/
+/out/
+/store/
+/optimizations/
+OwnLang.iml
+*.sh
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..7662d625
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,25 @@
+FROM gradle:8.13.0-jdk21-alpine AS cache
+RUN mkdir -p /home/gradle/cache_home
+ENV GRADLE_USER_HOME=/home/gradle/cache_home
+COPY build.gradle /home/gradle/java-code/
+WORKDIR /home/gradle/java-code
+RUN GRADLE_OPTS="-Xmx256m" gradle build --build-cache --stacktrace -i --no-daemon
+
+FROM gradle:8.13.0-jdk21-alpine AS builder
+COPY --from=cache /home/gradle/cache_home /home/gradle/.gradle
+COPY . /usr/src/java-code
+WORKDIR /usr/src/java-code
+RUN GRADLE_OPTS="-Xmx256m" gradle shadowJar --build-cache --stacktrace --no-daemon
+
+FROM eclipse-temurin:21-jre-alpine
+WORKDIR /opt/ownlang
+ENV PATH /opt/ownlang:$PATH
+COPY --from=builder /usr/src/java-code/ownlang-desktop/build/libs/*.jar libs/OwnLang.jar
+COPY --from=builder /usr/src/java-code/modules/jdbc/build/libs/*.jar modules/
+COPY --from=builder /usr/src/java-code/modules/server/build/libs/*.jar modules/
+COPY --from=builder /usr/src/java-code/modules/socket/build/libs/*.jar modules/
+COPY dist/own .
+COPY dist/ownlang .
+RUN chmod +x own ownlang
+ENTRYPOINT ["ownlang"]
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..b9f4d675
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2015-2016 Victor Melnik
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..dfd9473a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,157 @@
+# OwnLang
+
+OwnLang - dynamic functional programming language inspired by Scala and Python. Available for PC, Android and Java ME devices.
+
+## Installing
+
+| Free | Pro | Desktop |
+| :--: | :-: |:------------------------------------------------------------------------------------------:|
+| [](https://play.google.com/store/apps/details?id=com.annimon.ownlang.free) | [](https://play.google.com/store/apps/details?id=com.annimon.ownlang) | [v2.1.0](https://github.com/aNNiMON/Own-Programming-Language-Tutorial/releases/tag/v2.1.0) |
+
+Also available as AUR package:
+
+```
+yay -S ownlang
+```
+
+## Key features
+
+#### Higher-order functions
+
+Functions are values, so we can store them to variables for operating.
+
+```scala
+operations = {
+ "+" : def(a,b) = a+b,
+ "-" : def(a,b) = a-b,
+ "*" : def(a,b) = a*b,
+ "/" : ::division
+}
+
+def division(v1, v2) {
+ if (v2 == 0) return "error: division by zero"
+ return v1 / v2
+}
+
+for name, operation : operations {
+ println "2 " + name + " 3 = " + operation(2, 3)
+}
+```
+
+#### Pattern Matching
+
+Pattern matching with value pattern, tuple pattern, list pattern and optional condition.
+
+```scala
+def factorial(n) = match n {
+ case 0: 1
+ case n if n < 0: 0
+ case _: n * factorial(n - 1)
+}
+
+def fizzbuzz(limit = 100) {
+ for i = 1, i <= limit, i++ {
+ println match [i % 3 == 0, i % 5 == 0] {
+ case (true, false): "Fizz"
+ case (false, true): "Buzz"
+ case (true, true): "FizzBuzz"
+ case _: i
+ }
+ }
+}
+
+// run
+fizzbuzz()
+```
+
+#### Functional data operations
+
+Operate data in functional style.
+
+```scala
+use std, functional
+
+nums = [1,2,3,4,5,6,7,8,9,10]
+nums = filter(nums, def(x) = x % 2 == 0)
+// Squares of even numbers
+squares = map(nums, def(x) = x * x)
+foreach(squares, ::echo)
+// Sum of squares
+sum = reduce(squares, 0, def(x, y) = x + y)
+println "Sum: " + sum
+// Same using stream
+println "Sum: " + stream(range(1, 11))
+ .filter(def(x) = x % 2 == 0)
+ .map(def(x) = x * x)
+ .reduce(0, def(x, y) = x + y)
+```
+
+#### Operator overloading
+
+Why not?
+
+```scala
+use std, types, math
+
+def `..`(a, b) = range(a, b)
+def `**`(a, b) = int(pow(a, b))
+for y : 1 .. 10 {
+ println sprintf("2 ^ %d = %d", y, 2 ** y)
+}
+```
+
+#### Network module
+
+Easy async HTTP requests with `http` module.
+
+```scala
+use std, http, functional, json
+
+// GET request
+http("https://api.github.com/events", def(r) {
+ events = jsondecode(r)
+ println events[0]
+})
+
+// POST request
+http("http://jsonplaceholder.typicode.com/users", "POST", {
+ "name": "OwnLang",
+ "versionCode": 10
+}, ::echo)
+
+// PATCH request
+http("http://jsonplaceholder.typicode.com/users/2", "PATCH", {"name": "Patched Name"}, ::patch_callback)
+
+def patch_callback(v) {
+ println v
+}
+```
+
+## Language specification
+
+[English](https://annimon.com/docs/ownlang/en/) and [Russian](https://annimon.com/docs/ownlang/ru/)
+
+[Examples](examples/)
+
+
+## Build
+
+Build using Gradle `./gradlew shadowJar`
+
+or take a look to [latest release](https://github.com/aNNiMON/Own-Programming-Language-Tutorial/releases/latest) for binaries.
+
+
+## Run
+
+To run script use command
+
+`java -jar OwnLang.jar -f input.own`
+
+or
+
+`java -jar OwnLang.jar < input.own`
+
+
+## License
+
+MIT - see [MIT license information](LICENSE)
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 00000000..b4573e47
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,34 @@
+ext {
+ versions = [
+ project: '2.1.0',
+
+ json: '20240303', // org.json:json
+ snakeyaml: '1.33', // org.yaml:snakeyaml
+ okhttp: '4.12.0', // com.squareup.okhttp3:okhttp
+ socket: '2.1.1', // io.socket:socket.io-client
+ jline: '2.14.6', // jline:jline
+
+ javalin: '6.3.0', // io.javalin:javalin
+ slf4j: '2.0.16', // org.slf4j:slf4j-simple
+ jackson: '2.18.0', // com.fasterxml.jackson.core:jackson-databind
+
+ junit: '5.11.2', // org.junit:junit-bom
+ jmh: '1.37', // org.openjdk.jmh:jmh-core
+ assertj: '3.26.3' // org.assertj:assertj-core
+ ]
+}
+
+allprojects {
+ repositories {
+ mavenCentral()
+ }
+
+ gradle.projectsEvaluated {
+ tasks.withType(JavaCompile).tap {
+ configureEach {
+ [compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
+ options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
+ }
+ }
+ }
+}
diff --git a/build.xml b/build.xml
deleted file mode 100644
index f3b3e8f2..00000000
--- a/build.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- Builds, tests, and runs the project OwnLang.
-
-
-
diff --git a/dist/icon.png b/dist/icon.png
new file mode 100644
index 00000000..608745a0
Binary files /dev/null and b/dist/icon.png differ
diff --git a/dist/own b/dist/own
new file mode 100755
index 00000000..00f7a6f8
--- /dev/null
+++ b/dist/own
@@ -0,0 +1,2 @@
+#!/usr/bin/env sh
+ownlang run own "$@"
\ No newline at end of file
diff --git a/dist/own.cmd b/dist/own.cmd
new file mode 100644
index 00000000..76496d75
--- /dev/null
+++ b/dist/own.cmd
@@ -0,0 +1,2 @@
+@echo off
+ownlang run own %*
\ No newline at end of file
diff --git a/dist/ownlang b/dist/ownlang
new file mode 100755
index 00000000..a717400c
--- /dev/null
+++ b/dist/ownlang
@@ -0,0 +1,38 @@
+#!/usr/bin/env sh
+(set -o igncr) 2>/dev/null && set -o igncr; # cygwin encoding fix
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`/"$link"
+ fi
+done
+PRGDIR=`dirname "$PRG"`
+
+_classpath=".:$PRGDIR/OwnLang.jar"
+if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
+ for k in "$PRGDIR"/modules/*.jar
+ do
+ _classpath="${_classpath};`cygpath -w ${k}`"
+ done
+ for k in "$PRGDIR"/libs/*.jar
+ do
+ _classpath="${_classpath};`cygpath -w ${k}`"
+ done
+else
+ for k in "$PRGDIR"/modules/*.jar
+ do
+ _classpath="${_classpath}:${k}"
+ done
+ for k in "$PRGDIR"/libs/*.jar
+ do
+ _classpath="${_classpath}:${k}"
+ done
+fi
+
+java -cp "${_classpath}" com.annimon.ownlang.Main "$@"
\ No newline at end of file
diff --git a/dist/ownlang-runner.cmd b/dist/ownlang-runner.cmd
new file mode 100644
index 00000000..a7099924
--- /dev/null
+++ b/dist/ownlang-runner.cmd
@@ -0,0 +1,4 @@
+@echo off
+set JAVA=java
+%JAVA% -cp "%~dp0/*;%~dp0modules/*;%~dp0libs/*" com.annimon.ownlang.Main --file %1
+pause
\ No newline at end of file
diff --git a/dist/ownlang.cmd b/dist/ownlang.cmd
new file mode 100644
index 00000000..8595d86d
--- /dev/null
+++ b/dist/ownlang.cmd
@@ -0,0 +1,5 @@
+@echo off
+
+set JAVA=java
+%JAVA% ^
+ -cp "%~dp0/*;%~dp0modules/*;%~dp0libs/*" com.annimon.ownlang.Main %*
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 00000000..c561d8e5
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,6 @@
+node_modules
+.temp
+.cache
+docs/.vuepress/configs/modules.js
+docs/.vuepress/dist/
+docs/*/modules/
diff --git a/docs/build.gradle b/docs/build.gradle
new file mode 100644
index 00000000..72811d40
--- /dev/null
+++ b/docs/build.gradle
@@ -0,0 +1,54 @@
+plugins {
+ id 'java'
+}
+
+group = 'com.annimon'
+version = versions.project
+
+dependencies {
+ implementation project(":ownlang-core")
+ implementation project(":ownlang-parser")
+ implementation project(":ownlang-utils")
+ implementation project(":modules:main")
+ implementation project(":modules:canvasfx")
+ implementation project(":modules:server")
+
+ implementation "org.yaml:snakeyaml:${versions.snakeyaml}"
+}
+
+tasks.register('generateMarkdownModules') {
+ group = "documentation"
+ def ownlangExec = tasks.getByPath(':ownlang-desktop:ownlangExec')
+ doFirst {
+ ownlangExec.configure {
+ workingDir '../docs/src'
+ args '-f', 'docgen-md.own'
+ }
+ }
+ finalizedBy ownlangExec
+}
+
+tasks.register('runDocsDev', Exec) {
+ group = "documentation"
+ description = "Start docs dev server"
+ dependsOn generateMarkdownModules
+ workingDir '../docs/docs'
+ commandLine 'pnpm', 'docs:dev'
+}
+
+tasks.register('buildDocs', Exec) {
+ group = "documentation"
+ description = "Build docs to static site"
+ dependsOn generateMarkdownModules
+ workingDir '../docs/docs'
+ commandLine 'pnpm', 'docs:build'
+}
+
+tasks.register('generateModuleInfo', JavaExec) {
+ group = "documentation"
+ description = "Run sample program"
+ dependsOn classes
+ mainClass = 'com.annimon.ownlang.docs.ModulesInfoCreator'
+ classpath = sourceSets.main.runtimeClasspath
+ args 'server', 'okhttp'
+}
\ No newline at end of file
diff --git a/docs/docs/.vuepress/components/Scope.vue b/docs/docs/.vuepress/components/Scope.vue
new file mode 100644
index 00000000..0d5cd18e
--- /dev/null
+++ b/docs/docs/.vuepress/components/Scope.vue
@@ -0,0 +1,30 @@
+
+
+ {{ scope }}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/.vuepress/components/Since.vue b/docs/docs/.vuepress/components/Since.vue
new file mode 100644
index 00000000..62232ab3
--- /dev/null
+++ b/docs/docs/.vuepress/components/Since.vue
@@ -0,0 +1,32 @@
+
+ {{ text }} {{ version }}
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/.vuepress/config.js b/docs/docs/.vuepress/config.js
new file mode 100644
index 00000000..78845b53
--- /dev/null
+++ b/docs/docs/.vuepress/config.js
@@ -0,0 +1,63 @@
+import { defineUserConfig, defaultTheme } from 'vuepress'
+import { getDirname, path } from '@vuepress/utils'
+import { registerComponentsPlugin } from '@vuepress/plugin-register-components'
+import { prismjsPlugin } from '@vuepress/plugin-prismjs'
+import { searchPlugin } from '@vuepress/plugin-search'
+import { sidebarConfig } from './configs/sidebar'
+import { navbarConfig } from './configs/navbar'
+import Prism from 'prismjs';
+import definePrismOwnLang from '../../../editors/prismjs/own-language.js'
+
+definePrismOwnLang(Prism)
+const __dirname = getDirname(import.meta.url)
+
+export default defineUserConfig({
+ base: "/docs/ownlang/",
+ locales: {
+ '/en/': {
+ lang: 'en-US',
+ title: 'OwnLang',
+ description: 'OwnLang documentation',
+ },
+ '/ru/': {
+ lang: 'ru-RU',
+ title: 'OwnLang',
+ description: 'Документация OwnLang',
+ }
+ },
+
+ theme: defaultTheme({
+ repo: 'aNNiMON/Own-Programming-Language-Tutorial',
+ docsBranch: 'next',
+ editLinkPattern: ':repo/blob/:branch/docs/docs/:path',
+ editLinkText: 'View source',
+ contributors: false,
+ locales: {
+ '/en/': {
+ selectLanguageName: 'English',
+ sidebar: sidebarConfig.en,
+ navbar: navbarConfig.en
+ },
+ '/ru/': {
+ selectLanguageName: 'Русский',
+ sidebar: sidebarConfig.ru,
+ navbar: navbarConfig.ru
+ }
+ }
+ }),
+
+ plugins: [
+ prismjsPlugin({
+ preloadLanguages: ['own', 'json']
+ }),
+ registerComponentsPlugin({
+ componentsDir: path.resolve(__dirname, './components'),
+ }),
+ searchPlugin({
+ locales: {
+ '/en/': { placeholder: 'Search' },
+ '/ru/': { placeholder: 'Поиск' },
+ },
+ }),
+ ],
+})
diff --git a/docs/docs/.vuepress/configs/navbar.js b/docs/docs/.vuepress/configs/navbar.js
new file mode 100644
index 00000000..2c7a2a69
--- /dev/null
+++ b/docs/docs/.vuepress/configs/navbar.js
@@ -0,0 +1,16 @@
+import pages from './pages'
+
+let navbar = {}
+for (let lang of ['en', 'ru']) {
+ let config = []
+ for (let [relativePath, entry] of Object.entries(pages)) {
+ const path = '/' + lang + relativePath
+ config.push({
+ text: entry.text[lang],
+ children: entry.pages.map(r => path + r)
+ })
+ }
+ navbar[lang] = config
+}
+
+export const navbarConfig = navbar
\ No newline at end of file
diff --git a/docs/docs/.vuepress/configs/pages.js b/docs/docs/.vuepress/configs/pages.js
new file mode 100644
index 00000000..d60daba0
--- /dev/null
+++ b/docs/docs/.vuepress/configs/pages.js
@@ -0,0 +1,31 @@
+import modules from './modules'
+export default {
+ '/': {
+ text: {'en': 'OwnLang', 'ru': 'OwnLang'},
+ pages: [
+ 'README.md',
+ 'links.md',
+ 'changelog.md',
+ ]
+ },
+
+ '/basics/': {
+ text: {'en': 'Basics', 'ru': 'Основы'},
+ pages: [
+ 'comments.md',
+ 'strings.md',
+ 'types.md',
+ 'loops.md',
+ 'functions.md',
+ 'destructuring_assignment.md',
+ 'pattern_matching.md',
+ 'string_functions.md',
+ 'array_functions.md'
+ ]
+ },
+
+ '/modules/': {
+ text: {'en': 'Modules', 'ru': 'Модули'},
+ pages: modules
+ }
+}
\ No newline at end of file
diff --git a/docs/docs/.vuepress/configs/sidebar.js b/docs/docs/.vuepress/configs/sidebar.js
new file mode 100644
index 00000000..057ca20d
--- /dev/null
+++ b/docs/docs/.vuepress/configs/sidebar.js
@@ -0,0 +1,17 @@
+import pages from './pages'
+
+let sidebar = {}
+for (let lang of ['en', 'ru']) {
+ let config = {}
+ for (let [relativePath, entry] of Object.entries(pages)) {
+ const path = '/' + lang + relativePath
+ config[path] = (path in config) ? config[path] : []
+ config[path].push({
+ text: entry.text[lang],
+ children: entry.pages.map(r => path + r)
+ })
+ }
+ sidebar[lang] = config
+}
+
+export const sidebarConfig = sidebar
\ No newline at end of file
diff --git a/docs/docs/.vuepress/styles/palette.scss b/docs/docs/.vuepress/styles/palette.scss
new file mode 100644
index 00000000..c4f3dd38
--- /dev/null
+++ b/docs/docs/.vuepress/styles/palette.scss
@@ -0,0 +1,15 @@
+:root {
+ --c-brand: #f15d15;
+ --c-brand-light: #ff9562;
+ --c-badge-danger: #f63f3f;
+ --c-badge-warning: #d0af01;
+
+ --usc-since: var(--c-badge-warning);
+ --usc-scope: var(--c-brand);
+}
+html.dark {
+ --c-brand: #e1792d;
+ --c-brand-light: #ff8e3d;
+ --c-badge-danger: #d94657;
+ --c-badge-danger-text: #160304;
+}
\ No newline at end of file
diff --git a/docs/docs/README.md b/docs/docs/README.md
new file mode 100644
index 00000000..4b8be740
--- /dev/null
+++ b/docs/docs/README.md
@@ -0,0 +1,15 @@
+---
+home: true
+title: OwnLang
+heroText: OwnLang
+tagline: Dynamic functional programming language
+actions:
+ - text: English
+ link: /en/
+ type: primary
+ - text: Русский
+ link: /ru/
+ type: primary
+footer: © 2024 aNNiMON
+---
+
\ No newline at end of file
diff --git a/docs/docs/code/basics/destructuring_assignment1.own b/docs/docs/code/basics/destructuring_assignment1.own
new file mode 100644
index 00000000..893d4c8a
--- /dev/null
+++ b/docs/docs/code/basics/destructuring_assignment1.own
@@ -0,0 +1,5 @@
+arr = ["a", "b", "c"]
+extract(var1, var2, var3) = arr
+print var1 // a
+print var2 // b
+print var3 // c
\ No newline at end of file
diff --git a/docs/docs/code/basics/destructuring_assignment2.own b/docs/docs/code/basics/destructuring_assignment2.own
new file mode 100644
index 00000000..bb1b128a
--- /dev/null
+++ b/docs/docs/code/basics/destructuring_assignment2.own
@@ -0,0 +1,4 @@
+arr = ["a", "b", "c"]
+var1 = arr[0]
+var2 = arr[1]
+var3 = arr[2]
\ No newline at end of file
diff --git a/docs/docs/code/basics/destructuring_assignment3.own b/docs/docs/code/basics/destructuring_assignment3.own
new file mode 100644
index 00000000..1c8a6a14
--- /dev/null
+++ b/docs/docs/code/basics/destructuring_assignment3.own
@@ -0,0 +1,4 @@
+map = {"key1": 1, "test": "text"}
+extract(var1, var2) = map
+println var1 // [key1, 1]
+println var2 // [test, text]
\ No newline at end of file
diff --git a/docs/docs/code/basics/destructuring_assignment4.own b/docs/docs/code/basics/destructuring_assignment4.own
new file mode 100644
index 00000000..3538b909
--- /dev/null
+++ b/docs/docs/code/basics/destructuring_assignment4.own
@@ -0,0 +1,3 @@
+extract(x, , z) = [93, 58, 90]
+println x // 93
+println z // 90
\ No newline at end of file
diff --git a/docs/docs/code/basics/fibonacci.own b/docs/docs/code/basics/fibonacci.own
new file mode 100644
index 00000000..eae9e8bf
--- /dev/null
+++ b/docs/docs/code/basics/fibonacci.own
@@ -0,0 +1,9 @@
+def fibonacci(count) {
+ def fib(n) {
+ if n < 2 return n
+ return fib(n-2) + fib(n-1)
+ }
+ return fib(count)
+}
+
+println fibonacci(10) // 55
\ No newline at end of file
diff --git a/docs/docs/code/basics/loops1.own b/docs/docs/code/basics/loops1.own
new file mode 100644
index 00000000..4a2ae95b
--- /dev/null
+++ b/docs/docs/code/basics/loops1.own
@@ -0,0 +1,9 @@
+arr = [1, 2, 3, 4]
+for v : arr {
+ println v
+}
+
+map = {"key1": 1, "key2": 2}
+for key, value : map
+ println key + " = " value
+}
\ No newline at end of file
diff --git a/docs/docs/code/basics/pattern_matching1.own b/docs/docs/code/basics/pattern_matching1.own
new file mode 100644
index 00000000..a67666f8
--- /dev/null
+++ b/docs/docs/code/basics/pattern_matching1.own
@@ -0,0 +1,7 @@
+x = 2
+print match x {
+ case 1: "One"
+ case 2: "Two"
+ case "str": "String"
+ case _: "Unknown"
+}
\ No newline at end of file
diff --git a/docs/docs/code/basics/pattern_matching2.own b/docs/docs/code/basics/pattern_matching2.own
new file mode 100644
index 00000000..80e6dccb
--- /dev/null
+++ b/docs/docs/code/basics/pattern_matching2.own
@@ -0,0 +1,9 @@
+x = "str"
+match x {
+ case "": {
+ println "Empty string"
+ }
+ case "str": {
+ println "String!"
+ }
+}
\ No newline at end of file
diff --git a/docs/docs/code/basics/pattern_matching3.own b/docs/docs/code/basics/pattern_matching3.own
new file mode 100644
index 00000000..ddacb268
--- /dev/null
+++ b/docs/docs/code/basics/pattern_matching3.own
@@ -0,0 +1,10 @@
+def test(x) = match x {
+ case a: "case a: " + a
+ case b: "case b: " + b
+ case c: "case c: " + c
+}
+a = 10
+b = 20
+println test(15) // case c: 15
+println test(20) // case b: 20
+println test("test") // case c: test
\ No newline at end of file
diff --git a/docs/docs/code/basics/pattern_matching4.own b/docs/docs/code/basics/pattern_matching4.own
new file mode 100644
index 00000000..3ddbd67e
--- /dev/null
+++ b/docs/docs/code/basics/pattern_matching4.own
@@ -0,0 +1,9 @@
+def test(x) = match x {
+ case x if x < 0: "(-∞ .. 0)"
+ case x if x > 0: "(0 .. +∞)"
+ case x: "0"
+}
+
+println test(-10) // (-∞ .. 0)
+println test(0) // 0
+println test(10) // (0 .. +∞)
\ No newline at end of file
diff --git a/docs/docs/code/basics/pattern_matching5.own b/docs/docs/code/basics/pattern_matching5.own
new file mode 100644
index 00000000..97d5e40d
--- /dev/null
+++ b/docs/docs/code/basics/pattern_matching5.own
@@ -0,0 +1,7 @@
+def arrayRecursive(arr) = match arr {
+ case [head :: tail]: "[" + head + ", " + arrayRecursive(tail) + "]"
+ case []: "[]"
+ case last: "[" + last + ", []]"
+}
+
+println arrayRecursive([1, 2, 3, 4, 5, 6, 7]) // [1, [2, [3, [4, [5, [6, [7, []]]]]]]]
\ No newline at end of file
diff --git a/docs/docs/code/basics/pattern_matching6.own b/docs/docs/code/basics/pattern_matching6.own
new file mode 100644
index 00000000..0ff5e70a
--- /dev/null
+++ b/docs/docs/code/basics/pattern_matching6.own
@@ -0,0 +1,8 @@
+for i = 1, i <= 100, i++ {
+ println match [i % 3 == 0, i % 5 == 0] {
+ case (true, false): "Fizz"
+ case (false, true): "Buzz"
+ case (true, true): "FizzBuzz"
+ case _: i
+ }
+}
\ No newline at end of file
diff --git a/docs/docs/code/basics/string_functions1.own b/docs/docs/code/basics/string_functions1.own
new file mode 100644
index 00000000..954d1714
--- /dev/null
+++ b/docs/docs/code/basics/string_functions1.own
@@ -0,0 +1,7 @@
+str = " ababcaab "
+println indexOf(str, "abc")
+println str.indexOf("abc")
+
+def isBlank(s) = s.trim().isEmpty()
+println isBlank(str)
+println str.isBlank()
\ No newline at end of file
diff --git a/docs/docs/code/functional_en.own b/docs/docs/code/functional_en.own
new file mode 100644
index 00000000..9de63c2e
--- /dev/null
+++ b/docs/docs/code/functional_en.own
@@ -0,0 +1,15 @@
+use std, functional
+
+nums = [1,2,3,4,5,6,7,8,9,10]
+nums = filter(nums, def(x) = x % 2 == 0)
+// Squares of even numbers
+squares = map(nums, def(x) = x * x)
+foreach(squares, ::echo)
+// Sum of squares
+sum = reduce(squares, 0, def(x, y) = x + y)
+println "Sum: " + sum
+// Same using stream
+println "Sum: " + stream(range(1, 11))
+ .filter(def(x) = x % 2 == 0)
+ .map(def(x) = x * x)
+ .reduce(0, def(x, y) = x + y)
diff --git a/docs/docs/code/functional_ru.own b/docs/docs/code/functional_ru.own
new file mode 100644
index 00000000..ef710b16
--- /dev/null
+++ b/docs/docs/code/functional_ru.own
@@ -0,0 +1,15 @@
+use std, functional
+
+nums = [1,2,3,4,5,6,7,8,9,10]
+nums = filter(nums, def(x) = x % 2 == 0)
+// Квадраты чётных чисел
+squares = map(nums, def(x) = x * x)
+foreach(squares, ::echo)
+// Сумма квадратов
+sum = reduce(squares, 0, def(x, y) = x + y)
+println "Сумма: " + sum
+// То же самое с использованием stream
+println "Сумма: " + stream(range(1, 11))
+ .filter(def(x) = x % 2 == 0)
+ .map(def(x) = x * x)
+ .reduce(0, def(x, y) = x + y)
diff --git a/docs/docs/code/high_order_functions_en.own b/docs/docs/code/high_order_functions_en.own
new file mode 100644
index 00000000..a6c24356
--- /dev/null
+++ b/docs/docs/code/high_order_functions_en.own
@@ -0,0 +1,14 @@
+operations = {
+ "+" : def(a,b) = a+b,
+ "-" : def(a,b) = a-b,
+ "*" : def(a,b) = a*b,
+ "/" : ::division
+}
+def division(v1, v2) {
+ if (v2 == 0) return "error: division by zero"
+ return v1 / v2
+}
+
+for operation : operations {
+ println operation(2, 3)
+}
\ No newline at end of file
diff --git a/docs/docs/code/high_order_functions_ru.own b/docs/docs/code/high_order_functions_ru.own
new file mode 100644
index 00000000..f3abd153
--- /dev/null
+++ b/docs/docs/code/high_order_functions_ru.own
@@ -0,0 +1,14 @@
+operations = {
+ "+" : def(a,b) = a+b,
+ "-" : def(a,b) = a-b,
+ "*" : def(a,b) = a*b,
+ "/" : ::division
+}
+def division(v1, v2) {
+ if (v2 == 0) return "ошибка: деление на ноль"
+ return v1 / v2
+}
+
+for operation : operations {
+ println operation(2, 3)
+}
\ No newline at end of file
diff --git a/docs/docs/code/http_en.own b/docs/docs/code/http_en.own
new file mode 100644
index 00000000..38e283b1
--- /dev/null
+++ b/docs/docs/code/http_en.own
@@ -0,0 +1,20 @@
+use std, http, functional
+
+// GET request
+http("https://api.github.com/events", def(r) {
+ use json
+ events = jsondecode(r)
+})
+
+// POST request
+http("http://jsonplaceholder.typicode.com/users", "POST", {
+ "name": "OwnLang",
+ "versionCode": 10
+}, ::echo)
+
+// PATCH request
+http("http://jsonplaceholder.typicode.com/users/2", "PATCH", {"name": "Patched Name"}, ::patch_callback)
+
+def patch_callback(v) {
+ println v
+}
diff --git a/docs/docs/code/http_ru.own b/docs/docs/code/http_ru.own
new file mode 100644
index 00000000..abc3f799
--- /dev/null
+++ b/docs/docs/code/http_ru.own
@@ -0,0 +1,20 @@
+use std, http, functional
+
+// GET-запрос
+http("https://api.github.com/events", def(r) {
+ use json
+ events = jsondecode(r)
+})
+
+// POST-запрос
+http("http://jsonplaceholder.typicode.com/users", "POST", {
+ "name": "OwnLang",
+ "versionCode": 10
+}, ::echo)
+
+// PATCH-запрос
+http("http://jsonplaceholder.typicode.com/users/2", "PATCH", {"name": "Патч"}, ::patch_callback)
+
+def patch_callback(v) {
+ println v
+}
diff --git a/docs/docs/code/operator_overloading.own b/docs/docs/code/operator_overloading.own
new file mode 100644
index 00000000..d823b227
--- /dev/null
+++ b/docs/docs/code/operator_overloading.own
@@ -0,0 +1,7 @@
+use std, types, math
+
+def `..`(a, b) = range(a, b - 1)
+def `**`(a, b) = int(pow(a, b))
+for y : 1 .. 10 {
+ println sprintf("2 ^ %d = %d", y, 2 ** y)
+}
\ No newline at end of file
diff --git a/docs/docs/code/pattern_matching.own b/docs/docs/code/pattern_matching.own
new file mode 100644
index 00000000..6beb3e85
--- /dev/null
+++ b/docs/docs/code/pattern_matching.own
@@ -0,0 +1,16 @@
+def factorial(n) = match n {
+ case 0: 1
+ case n if n < 0: 0
+ case _: n * factorial(n - 1)
+}
+
+def fizzbuzz(limit = 100) {
+ for i = 1, i <= limit, i++ {
+ println match [i % 3 == 0, i % 5 == 0] {
+ case (true, false): "Fizz"
+ case (false, true): "Buzz"
+ case (true, true): "FizzBuzz"
+ case _: i
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/docs/en/README.md b/docs/docs/en/README.md
new file mode 100644
index 00000000..7b4b5931
--- /dev/null
+++ b/docs/docs/en/README.md
@@ -0,0 +1,35 @@
+# Overview
+
+OwnLang — dynamic functional programming language inspired by Scala and Python. Available for PC and Android devices.
+
+## Key features
+
+### Higher-order functions
+
+Functions are values, so we can store them to variables for operating.
+
+@[code](../code/high_order_functions_en.own)
+
+### Pattern Matching
+
+Pattern matching with value pattern, tuple pattern, list pattern and optional condition.
+
+@[code](../code/pattern_matching.own)
+
+### Functional data operations
+
+Operate data in functional style.
+
+@[code](../code/functional_en.own)
+
+### Operator overloading
+
+Why not?
+
+@[code](../code/operator_overloading.own)
+
+### Network module
+
+Easy async HTTP requests with `http` module.
+
+@[code](../code/http_en.own)
\ No newline at end of file
diff --git a/docs/docs/en/basics/README.md b/docs/docs/en/basics/README.md
new file mode 100644
index 00000000..b68cc02f
--- /dev/null
+++ b/docs/docs/en/basics/README.md
@@ -0,0 +1,11 @@
+# Basics
+
+* [Comments](comments.md)
+* [Strings](strings.md)
+* [Types](types.md)
+* [Loops](loops.md)
+* [Functions definition](functions.md)
+* [Destructuring assignment](destructuring_assignment.md)
+* [Pattern matching](pattern_matching.md)
+* [String functions](string_functions.md)
+* [Array functions](array_functions.md)
diff --git a/docs/docs/en/basics/array_functions.md b/docs/docs/en/basics/array_functions.md
new file mode 100644
index 00000000..16e827dc
--- /dev/null
+++ b/docs/docs/en/basics/array_functions.md
@@ -0,0 +1,8 @@
+# Array functions
+
+Fields:
+ - `length` - number of elements of the array
+
+Functions:
+ - `isEmpty()` - returns true, if the array is empty
+ - `joinToString(delimiter = "", prefix = "", suffix = "")` - joins array into a string
diff --git a/docs/docs/en/basics/comments.md b/docs/docs/en/basics/comments.md
new file mode 100644
index 00000000..01eaa68b
--- /dev/null
+++ b/docs/docs/en/basics/comments.md
@@ -0,0 +1,9 @@
+# Comments
+
+```own
+// Line comment
+/* multiline
+ comment
+*/
+print /*inner comment*/ "Text"
+```
\ No newline at end of file
diff --git a/docs/docs/en/basics/destructuring_assignment.md b/docs/docs/en/basics/destructuring_assignment.md
new file mode 100644
index 00000000..fca2558b
--- /dev/null
+++ b/docs/docs/en/basics/destructuring_assignment.md
@@ -0,0 +1,19 @@
+# Destructuring assignment
+
+Destructuring assignment allows to define multiple variables for each element of an array or map.
+
+For arrays, value is assigned to variable:
+
+@[code](../../code/basics/destructuring_assignment1.own)
+
+Which is equivalent to:
+
+@[code](../../code/basics/destructuring_assignment2.own)
+
+For maps, key and value are assigned to variable:
+
+@[code](../../code/basics/destructuring_assignment3.own)
+
+To skip value just leave argument empty:
+
+@[code](../../code/basics/destructuring_assignment4.own)
diff --git a/docs/docs/en/basics/functions.md b/docs/docs/en/basics/functions.md
new file mode 100644
index 00000000..b12be6e2
--- /dev/null
+++ b/docs/docs/en/basics/functions.md
@@ -0,0 +1,54 @@
+# Functions definition
+
+To define function uses the `def` keyword:
+
+```own
+def function(arg1, arg2) {
+ println arg1
+}
+```
+
+## Shorthand definition
+
+There is short syntax fot function body:
+
+```own
+def repeat(str, count) = str * count
+```
+
+Which is equivalent to:
+
+```own
+def repeat(str, count) {
+ return str * count
+}
+```
+
+## Default arguments
+
+Function arguments can have default values.
+
+```own
+def repeat(str, count = 5) = str * count
+```
+
+In this case only `str` argument is required.
+
+```own
+repeat("*") // *****
+repeat("+", 3) // +++
+```
+
+Default arguments can't be declared before required arguments.
+
+```own
+def repeat(str = "*", count) = str * count
+```
+
+Causes parsing error: `ParseError on line 1: Required argument cannot be after optional`
+
+## Inner functions
+
+You can define function in other function.
+
+@[code](../../code/basics/fibonacci.own)
diff --git a/docs/docs/en/basics/loops.md b/docs/docs/en/basics/loops.md
new file mode 100644
index 00000000..ace5bff0
--- /dev/null
+++ b/docs/docs/en/basics/loops.md
@@ -0,0 +1,113 @@
+# Loops
+
+## while loop
+
+```own
+while condition {
+ body
+}
+```
+
+Parentheses in condition are not necessary.
+
+```own
+i = 0
+while i < 5 {
+ print i++
+}
+
+// or
+
+i = 0
+while (i < 5) {
+ print i++
+}
+```
+
+## do-while loop
+
+```own
+do {
+ body
+} while condition
+```
+
+Parentheses in condition are not necessary.
+
+```own
+i = 0
+do {
+ print i++
+} while i < 5
+
+// or
+
+i = 0
+do {
+ print i++
+} while (i < 5)
+```
+
+## for loop
+
+```own
+for initializing, condition, increment {
+ body
+}
+
+for (initializing, condition, increment) {
+ body
+}
+```
+
+```own
+for i = 0, i < 5, i++
+ print i++
+
+// or
+
+for (i = 0, i < 5, i++) {
+ print i++
+}
+```
+
+## foreach loop
+
+Iterates elements of an string, array or map.
+
+Iterating over string:
+
+```own
+for char : string {
+ body
+}
+for char, code : string {
+ body
+}
+```
+
+Iterating over array:
+
+```own
+for value : array {
+ body
+}
+for value, index : array {
+ body
+}
+```
+
+Iterating over map:
+
+```own
+for key, value : map {
+ body
+}
+for (key, value : map) {
+ body
+}
+```
+
+Parentheses are not necessary.
+
+@[code](../../code/basics/loops1.own)
diff --git a/docs/docs/en/basics/pattern_matching.md b/docs/docs/en/basics/pattern_matching.md
new file mode 100644
index 00000000..86d775cc
--- /dev/null
+++ b/docs/docs/en/basics/pattern_matching.md
@@ -0,0 +1,79 @@
+# Pattern matching
+
+The `match` operator allows to match values by pattern.
+
+@[code](../../code/basics/pattern_matching1.own)
+
+@[code](../../code/basics/pattern_matching2.own)
+
+In this case value and type are checking. If none of `case` branches doesn't match, the body of `case _` branch will executes.
+
+
+In addition to the constant values, you can set variable name to `case`.
+
+@[code](../../code/basics/pattern_matching3.own)
+
+In this case there is two scenarios:
+
+1. Variable is already defined. Matching to its value.
+2. Variable is not defined. Assign matching value to it and executes body of the `case` branch.
+
+In the example above, the interpreter sees the first two branches as:
+
+```own
+case 10:
+case 20:
+```
+
+For the last branch `c` variable is not defined, so assign `c = x` and execute body of the `case c` branch.
+
+
+## Refinements
+
+`case` branch may have additional comparison
+
+@[code](../../code/basics/pattern_matching4.own)
+
+
+## Matching arrays
+
+To compare elements of arrays, the following syntax is used:
+
+* `case []:` executes if there are no elements in array
+* `case [a]:` executes if an array contains one element
+* `case [a :: b]:` executes if an array contains two or more elements
+* `case [a :: b :: c :: d :: e]:` executes if an array contain five or more elements
+
+There are two rules for the last two cases:
+
+* If variables count matches array elements count - all variables are assigned to the value of the array.
+
+```own
+match [0, 1, 2] {
+ case [x :: y :: z]: // x = 0, y = 1, z = 2
+}
+```
+
+* If array elements count is greater, then the rest of the array will be assigned to the last variable.
+
+```own
+match [0, 1, 2, 3, 4] {
+ case [x :: y :: z]: // x = 0, y = 1, z = [2, 3, 4]
+}
+```
+
+An example of a recursive output array
+
+@[code](../../code/basics/pattern_matching5.own)
+
+
+## Matching array's value
+
+To compare values of array's elements, the following syntax is used:
+
+* `case (expr1, expr2, expr3):` executes if an array contain 3 elements and first element is equal to expr1 result, second element is equal to expr2 and third element is equal to expr3.
+* `case (expr1, _):` executes if an array contain 2 elements and first element is equal to expr1 result and result of the second element is not importand.
+
+FizzBuzz classical problem can be solved using Pattern Matching:
+
+@[code](../../code/basics/pattern_matching6.own)
diff --git a/docs/docs/en/basics/string_functions.md b/docs/docs/en/basics/string_functions.md
new file mode 100644
index 00000000..070dcb63
--- /dev/null
+++ b/docs/docs/en/basics/string_functions.md
@@ -0,0 +1,20 @@
+# String functions
+
+Fields:
+ - `length` - string length
+ - `lower` - lower case string
+ - `upper` - upper case string
+ - `chars` - ASCII characters array
+
+Functions:
+ - `trim()` - removes any leading and trailing whitespaces in string
+ - `startsWith(str, offset = 0)` - checks whether the string starts with the substring str at offset
+ - `endsWith(str)` - checks whether the string ends with the str
+ - `matches(regex)` - checks whether the string matches regex pattern
+ - `contains(str)` - checks whether the string contains substring str
+ - `equalsIgnoreCase(str)` - checks equality of two strings ignore case (tEsT = TEST)
+ - `isEmpty()` - returns true, if the string is empty
+
+In addition, there are automatic function extensions available if the function accepts a string as the first argument:
+
+@[code](../../code/basics/string_functions1.own)
diff --git a/docs/docs/en/basics/strings.md b/docs/docs/en/basics/strings.md
new file mode 100644
index 00000000..d44a99bb
--- /dev/null
+++ b/docs/docs/en/basics/strings.md
@@ -0,0 +1,12 @@
+# Strings
+
+Strings are defined in double quotes and can be multiline. Escaping Unicode characters is also supported.:
+
+```own
+str = "\n\tThis is
+\tmultiline
+\ttext
+"
+```
+
+`print` and `println` operators are used to output text.
\ No newline at end of file
diff --git a/docs/docs/en/basics/types.md b/docs/docs/en/basics/types.md
new file mode 100644
index 00000000..c7b5b116
--- /dev/null
+++ b/docs/docs/en/basics/types.md
@@ -0,0 +1,25 @@
+# Types
+
+OwnLang types are:
+
+ * Number - numbers (integer, float)
+ * String - strings
+ * Array - arrays
+ * Map - objects (an associative arrays)
+ * Function - functions
+ * Class
+
+Since OwnLang is dynamic programming language, which means that explicitly declare the types is not necessary.
+
+```own
+x = 10 // integer
+y = 1.61803 // float
+z = "abcd" // string
+```
+
+If some function requires string as argument, but number was passed, then numeric value will automatically converts to string.
+
+```own
+x = 90
+print x // Ok, 90 converts to "90"
+```
\ No newline at end of file
diff --git a/docs/docs/en/changelog.md b/docs/docs/en/changelog.md
new file mode 100644
index 00000000..89621261
--- /dev/null
+++ b/docs/docs/en/changelog.md
@@ -0,0 +1,113 @@
+# Changelog
+
+## Next
+
+
+## 2.1.0
+
+### Changes
+- Add `own` package manager. Usage examples: `own`, `own init`, `own add openai`.
+- Use relative path in include statement.
+
+### Fixes
+- Fix passing command-line arguments to scripts.
+- Fix `this` in non-static class methods.
+- Fix program is not finished if using any http call (okhttp issue).
+- Fix visitor and linter checks inside functions.
+
+### Modules
+- [okhttp] Added `okhttp.newClient()` and `HttpClientBuilderValue`.
+- [canvasfx] Updated JavaFX version.
+
+
+## 2.0.0
+
+### Breaking changes
+- Minimal Java version is 17.
+- Simplified use statement. `use std, math` instead of `use ["std", "math"]`.
+- Change `case [x]` behavior in list pattern matching to match single element.
+- More strict lexer. Fixed escaping backslash in strings. Fixed HEX numbers println 0x0123456789, 0x०१२३४५६७८९.
+
+### Changes
+- Introducing Constants. Constant can be imported only when using a module.
+- Support for long number declaration: `700L`, `0xABL`
+- Fixed variables scope in shadowing.
+- Better error visualizing. Parse errors shows exact line in which an error occurs. Same for Linter and Runtime errors.
+- Semantic linter as a required stage.
+- Preserve the order of Map elements by default.
+- Ability to run programs from resources by adding "resource:" prefix to path.
+- Added internal scripts and command `ownlang run` to run them. Added script `checkUpdate` that checks app updates.
+- Updated [documentation](https://annimon.com/docs/ownlang/). New documentation engine based on vuepress.
+
+### Modules
+- [std] Added parseDouble, nanotime, exit, getenv, getprop functions.
+- [http] Added httpSync function.
+- [functional] Added groupby, tomap, Stream.groupBy, Stream.filterNot, Stream.forEachIndexed, Stream::toMap, Stream.anyMatch, Stream.allMatch, Stream.noneMatch operators.
+- [canvasfx] Works for Java 17+ with Java FX 17 (Windows only).
+- [server] New server module.
+
+
+## 1.5.0
+
+- Added modules `zip`, `gzip`, `okhttp`
+- Added functions `std::getBytes`, `std::stringFromBytes`, `std::stripMargin`
+- Added JProgressBar, JTextArea, JScrollPane to `forms`, methods for JButton, JTextField and WindowListener
+- Added function `joining` to `functional::stream`
+- Added array properties: `arr.length`, `arr.isEmpty()`, `arr.joinToString(...)`
+- Added null coalesce operator `??`
+- Added basic support for classes
+- Strict string to number conversion
+- `for` supports iterating strings and arrays with index:
+ `for ch : "test"`
+ `for ch, code : "test"`
+ `for el : arr`
+ `for el, index : arr`
+- Pretty-print for `jsonencode`:
+ `jsonencode(obj)` — minified json
+ `jsonencode(obj, 2)` — pretty-print json with 2 spaces indent
+- Ability to set options for yaml parser/dumper
+- Fixed mysql connection in `jdbc`
+- Fixed `str::range` for reversed ranges
+- Fixed files::readBytes with offset and length
+- Fixed matching class constructor in `java::new`. Ability to instantiate classes with `new` operator
+- Other minor changes
+
+
+## 1.4.0
+
+- Added modules `downloader`, `regex`
+- Added functions `std::arraySplice`, `std::default`
+- Added constant `std::OwnLang` which stores language version and platform metadata
+- Added `peek`, `sorted` to StreamValue
+- An ability to import several modules `use ["std", "types", "math"]`
+- String internal fields support (length, lower, upper, chars, trim(), startsWith(s), endsWith(s), matches(s), contains(s), equalsIgnoreCase(s), isEmpty()). Also support for extensions: `"%d. %s".sprintf(1, "OwnLang")` -> `sprintf("%d. %s", 1, "OwnLang")`
+- Added kawaii-operator `^^`
+- Improved REPL mode. Now command history (up key) supported on all platforms. Added autocompletion by Tab key.
+- Improved error output
+- Updated examples
+
+
+## 1.3.0
+
+- Function and function call chaining support (`func().func()` and `func()()`)
+- Added `takewhile`, `dropwhile`, `stream` functions to `functional` module
+- Added `parseInt`, `parseLong`, `toHexString` functions to `std` module
+- Added `copy` function to `files` module
+- Added `socket`, `base64`, `java`, `forms`, `jdbc` modules
+- Improved optimization
+- Updated examples
+- Minor fixes and improvements
+
+## 1.2.0
+
+- Added `canvasfx`, `date`, `yml`, `aimp` modules
+- Updated `std`, `math`, `files`, `functional` modules
+- Added `std::ARGS` constant for accessing command-line arguments
+- Added REPL mode, Beautifier, Linter, Optimizer
+- Fixed error recovering in parser and deadlock in lexer
+- Added merging objects operation `map1 + map2`
+- Fixed variables scope
+- Speed up files reading
+- Added NumberValue cache
+- Updated Netbeans plugin
+- Added examples and help
diff --git a/docs/docs/en/links.md b/docs/docs/en/links.md
new file mode 100644
index 00000000..345725c1
--- /dev/null
+++ b/docs/docs/en/links.md
@@ -0,0 +1,13 @@
+# Links
+
+## Downloads
+
+Android: [Free](https://play.google.com/store/apps/details?id=com.annimon.ownlang.free) / [Pro](https://play.google.com/store/apps/details?id=com.annimon.ownlang)
+PC / Netbeans Plugin / etc: [GitHub Releases](https://github.com/aNNiMON/Own-Programming-Language-Tutorial/releases)
+Source code: [GitHub](https://github.com/aNNiMON/Own-Programming-Language-Tutorial)
+
+Also available as AUR package:
+
+```
+paru -S ownlang
+```
diff --git a/docs/docs/ru/README.md b/docs/docs/ru/README.md
new file mode 100644
index 00000000..0e7c2b2e
--- /dev/null
+++ b/docs/docs/ru/README.md
@@ -0,0 +1,35 @@
+# Возможности
+
+OwnLang — скриптовый функциональный язык программирования с динамической типизацией для ПК и Android устройств.
+
+## Ключевые особенности
+
+### Функции высшего порядка
+
+Функции выступают как значения, а значит мы можем сохранять их в переменные для дальнейшего использования.
+
+@[code](../code/high_order_functions_ru.own)
+
+### Pattern Matching
+
+Сопоставление по образцу с шаблоном значений, шаблоном кортежей, шаблоном списков и дополнительным сравнением.
+
+@[code](../code/pattern_matching.own)
+
+### Функциональные операции над данными
+
+Оперирование данными в функциональном стиле.
+
+@[code](../code/functional_ru.own)
+
+### Перегрузка операторов
+
+Почему бы и нет?
+
+@[code](../code/operator_overloading.own)
+
+### Модуль для работы с сетью Интернет
+
+Простые асинхронные HTTP-запросы с модулем `http`.
+
+@[code](../code/http_ru.own)
\ No newline at end of file
diff --git a/docs/docs/ru/basics/README.md b/docs/docs/ru/basics/README.md
new file mode 100644
index 00000000..0b843ddb
--- /dev/null
+++ b/docs/docs/ru/basics/README.md
@@ -0,0 +1,11 @@
+# Синтаксис и основы языка
+
+* [Комментарии](comments.md)
+* [Строки](strings.md)
+* [Типы](types.md)
+* [Циклы](loops.md)
+* [Определение функций](functions.md)
+* [Реструктуризующее присваивание](destructuring_assignment.md)
+* [Pattern matching](pattern_matching.md) (сопоставление с образцом)
+* [Функции строк](string_functions.md)
+* [Функции массивов](array_functions.md)
\ No newline at end of file
diff --git a/docs/docs/ru/basics/array_functions.md b/docs/docs/ru/basics/array_functions.md
new file mode 100644
index 00000000..cba7892e
--- /dev/null
+++ b/docs/docs/ru/basics/array_functions.md
@@ -0,0 +1,8 @@
+# Функции массивов
+
+Поля:
+ - `length` - количество элементов массива
+
+Функции:
+ - `isEmpty()` - возвращает true, если массив пуст
+ - `joinToString(delimiter = "", prefix = "", suffix = "")` - склеивает массив в строку
diff --git a/docs/docs/ru/basics/comments.md b/docs/docs/ru/basics/comments.md
new file mode 100644
index 00000000..189f8405
--- /dev/null
+++ b/docs/docs/ru/basics/comments.md
@@ -0,0 +1,9 @@
+# Комментарии
+
+```own
+// Однострочный комментарий
+/* многострочный
+ комментарий
+*/
+print /*или так*/ "Текст"
+```
\ No newline at end of file
diff --git a/docs/docs/ru/basics/destructuring_assignment.md b/docs/docs/ru/basics/destructuring_assignment.md
new file mode 100644
index 00000000..b2b21cb3
--- /dev/null
+++ b/docs/docs/ru/basics/destructuring_assignment.md
@@ -0,0 +1,19 @@
+# Реструктуризующее присваивание
+
+Реструктуризующее (деструктивное) присваивание позволяет определить сразу несколько переменных по каждому элементу массива или объекта.
+
+Для массивов, переменным присваивается значение.
+
+@[code](../../code/basics/destructuring_assignment1.own)
+
+Что равносильно:
+
+@[code](../../code/basics/destructuring_assignment2.own)
+
+Для объектов, переменным присваивается массив [ключ, значение]
+
+@[code](../../code/basics/destructuring_assignment3.own)
+
+Если нужно пропустить какое-либо значение, название переменной можно не писать:
+
+@[code](../../code/basics/destructuring_assignment4.own)
\ No newline at end of file
diff --git a/docs/docs/ru/basics/functions.md b/docs/docs/ru/basics/functions.md
new file mode 100644
index 00000000..a1cc0fc5
--- /dev/null
+++ b/docs/docs/ru/basics/functions.md
@@ -0,0 +1,54 @@
+# Определение функций
+
+Для определения функции используется ключевое слово `def`. Затем идёт имя, аргументы и тело функции. Пример:
+
+```own
+def function(arg1, arg2) {
+ println arg1
+}
+```
+
+## Короткий синтаксис
+
+Возможен короткий синтаксис:
+
+```own
+def repeat(str, count) = str * count
+```
+
+что равносильно:
+
+```own
+def repeat(str, count) {
+ return str * count
+}
+```
+
+## Аргументы по умолчанию
+
+Аргументы функции могут иметь значения по умолчанию.
+
+```own
+def repeat(str, count = 5) = str * count
+```
+
+В этом случае обязательным будет только аргумент `str`
+
+```own
+repeat("*") // *****
+repeat("+", 3) // +++
+```
+
+Аргументы по умолчанию обязательно должны идти после обязательных аргументов, если такие были.
+
+```own
+def repeat(str = "*", count) = str * count
+```
+
+Приведёт к ошибки парсинга: `ParseError on line 1: Required argument cannot be after optional`
+
+## Внутренние функции
+
+Внутри функции можно объявить другую функцию.
+
+@[code](../../code/basics/fibonacci.own)
\ No newline at end of file
diff --git a/docs/docs/ru/basics/loops.md b/docs/docs/ru/basics/loops.md
new file mode 100644
index 00000000..fae20b42
--- /dev/null
+++ b/docs/docs/ru/basics/loops.md
@@ -0,0 +1,115 @@
+# Циклы
+
+## Цикл while
+
+```own
+while условие {
+ тело цикла
+}
+```
+
+Скобки в условии необязательны.
+
+```own
+i = 0
+while i < 5 {
+ print i++
+}
+
+// или
+
+i = 0
+while (i < 5) {
+ print i++
+}
+```
+
+## Цикл do-while
+
+```own
+do {
+ тело цикла
+} while условие
+```
+
+Скобки в условии необязательны.
+
+```own
+i = 0
+do {
+ print i++
+} while i < 5
+
+// или
+
+i = 0
+do {
+ print i++
+} while (i < 5)
+```
+
+## Цикл for
+
+```own
+for инициализация, условие_работы, инкремент {
+ тело цикла
+}
+
+for (инициализация, условие_работы, инкремент) {
+ тело цикла
+}
+```
+
+Скобки в условии необязательны.
+
+```own
+for i = 0, i < 5, i++
+ print i++
+
+// или
+
+for (i = 0, i < 5, i++) {
+ print i++
+}
+```
+
+## Цикл foreach
+
+Перебирает элементы строки, массива или карты.
+
+Перебор строки:
+
+```own
+for символ : строка {
+ тело цикла
+}
+for символ, код : строка {
+ тело цикла
+}
+```
+
+Перебор массива:
+
+```own
+for значение : массив {
+ тело цикла
+}
+for значение, индекс : массив {
+ тело цикла
+}
+for (значение : массив) {
+ тело цикла
+}
+```
+
+Перебор карты:
+
+```own
+for (ключ, значение : карта) {
+ тело цикла
+}
+```
+
+Скобки необязательны.
+
+@[code](../../code/basics/loops1.own)
\ No newline at end of file
diff --git a/docs/docs/ru/basics/pattern_matching.md b/docs/docs/ru/basics/pattern_matching.md
new file mode 100644
index 00000000..ab96bc37
--- /dev/null
+++ b/docs/docs/ru/basics/pattern_matching.md
@@ -0,0 +1,79 @@
+# Pattern Matching (сопоставление с образцом)
+
+Оператор `match` позволяет выполнить сопоставление значения с образцом.
+
+@[code](../../code/basics/pattern_matching1.own)
+
+@[code](../../code/basics/pattern_matching2.own)
+
+Проверяется тип и значение. Если ни одна из веток `case` не обнаружила совпадение, выполняется тело ветки `case _`.
+
+
+Помимо константных значений, в `case` может присутствовать имя переменной.
+
+@[code](../../code/basics/pattern_matching3.own)
+
+В таком случае возможен один из двух сценариев:
+
+1. Переменная уже определена. Сравнивается её значение.
+2. Переменная не определена. Ей присваивается сопоставляемое значение и выполняется ветка `case`.
+
+В примере выше, интерпретатор видит первые две ветки так:
+
+```own
+case 10:
+case 20:
+```
+
+Для последней ветки переменная `c` не определена, поэтому выполнится присваивание `c = x`, после чего вызов передаётся телу ветки `case c`.
+
+
+## Уточнения
+
+Ветка `case` может иметь дополнительное сравнение
+
+@[code](../../code/basics/pattern_matching4.own)
+
+
+## Сопоставление массивов
+
+Для сопоставления элементов массивов, в блоке case используется следующий синтаксис:
+
+* `case []:` выполняется, если в массиве нет элементов
+* `case [a]:` выполняется, если в массиве есть один элемент
+* `case [a :: b]:` выполняется, если в массиве есть два и более элементов
+* `case [a :: b :: c :: d :: e]:` выполняется, если в массиве есть пять и более элементов
+
+Для двух последних случаев справедливы такие правила:
+
+* Если количество переменных в списке совпадает с количество элементов массива, то всем переменным присваивается значение массива.
+
+```own
+match [0, 1, 2] {
+ case [x :: y :: z]: // x = 0, y = 1, z = 2
+}
+```
+
+* Если элементов массива больше, то в последней переменной будут сохранены оставшиеся элементы массива.
+
+```own
+match [0, 1, 2, 3, 4] {
+ case [x :: y :: z]: // x = 0, y = 1, z = [2, 3, 4]
+}
+```
+
+Пример рекурсивного вывода элементов массива
+
+@[code](../../code/basics/pattern_matching5.own)
+
+
+## Сопоставление значений массивов
+
+Для сопоставления значений элементов массивов, используется синтаксис:
+
+* `case (expr1, expr2, expr3):` выполняется, если в массиве есть 3 элемента и первый элемент равен результату выражения expr1, второй - результату expr2 и третий - результату expr3.
+* `case (expr1, _):` выполняется, если в массиве есть 2 элемента и первый элемент равен результату выражения expr1, а результат второго не важен.
+
+Классическая задача FizzBuzz может быть решена с использованием Pattern Matching:
+
+@[code](../../code/basics/pattern_matching6.own)
diff --git a/docs/docs/ru/basics/string_functions.md b/docs/docs/ru/basics/string_functions.md
new file mode 100644
index 00000000..17d1c9ed
--- /dev/null
+++ b/docs/docs/ru/basics/string_functions.md
@@ -0,0 +1,20 @@
+# Функции строк
+
+Поля:
+ - `length` - длина строки
+ - `lower` - строка в нижнем регистре
+ - `upper` - строка в верхнем регистре
+ - `chars` - массив символов в виде ASCII-кодов
+
+Функции:
+ - `trim()` - обрезает пробельные невидимые символы по обоим концам строки
+ - `startsWith(str, offset = 0)` - проверяет, начинается ли строка с подстроки str в позиции offset
+ - `endsWith(str)` - проверяет, заканчивается ли строка подстрокой str
+ - `matches(regex)` - проверяет соответствие строки с заданным шаблоном
+ - `contains(str)` - проверяет, содержится ли в строке подстрока str
+ - `equalsIgnoreCase(str)` - проверяет, равны ли строки вне зависимости от регистра (tEsT = TEST)
+ - `isEmpty()` - возвращает true, если строка пустая
+
+Кроме того, доступны автоматические функции-расширения, если функция принимает в качестве первого аргумента строку:
+
+@[code](../../code/basics/string_functions1.own)
diff --git a/docs/docs/ru/basics/strings.md b/docs/docs/ru/basics/strings.md
new file mode 100644
index 00000000..8ad5fa99
--- /dev/null
+++ b/docs/docs/ru/basics/strings.md
@@ -0,0 +1,12 @@
+# Строки
+
+Строки задаются в двойных кавычках и могут быть многострочные. Поддерживается юникод и экранирование символов:
+
+```own
+str = "\n\tЭто
+\tмногострочный
+\tтекст
+"
+```
+
+Для вывода строк есть два оператора `print` и `println`
\ No newline at end of file
diff --git a/docs/docs/ru/basics/types.md b/docs/docs/ru/basics/types.md
new file mode 100644
index 00000000..0d0f55ca
--- /dev/null
+++ b/docs/docs/ru/basics/types.md
@@ -0,0 +1,25 @@
+# Типы
+
+В OwnLang есть такие типы:
+
+ * Number - числа (охватывает как целые, так и вещественные числа)
+ * String - строки
+ * Array - массивы
+ * Map - объекты (ассоциативные массивы)
+ * Function - функции
+ * Class - классы
+
+Поскольку OwnLang - динамически типизируемый язык программирования, это значит, что явно объявлять типы не нужно.
+
+```own
+x = 10 // целое число
+y = 1.61803 // вещественное число
+z = "abcd" // строка
+```
+
+Если какая-либо функция предполагает использование строк в качестве аргументов, а были переданы числа, то значения автоматически приведутся к строке.
+
+```own
+x = 90
+print x
+```
\ No newline at end of file
diff --git a/docs/docs/ru/changelog.md b/docs/docs/ru/changelog.md
new file mode 100644
index 00000000..f996edcd
--- /dev/null
+++ b/docs/docs/ru/changelog.md
@@ -0,0 +1,115 @@
+# История изменений
+
+## Next
+
+
+## 2.1.0
+
+### Изменения
+- Добавлен `own` пакетный менеджер. Примеры испльзования: `own`, `own init`, `own add openai`.
+- Относительные пути в include.
+
+### Исправления
+- Исправлена передача аргументов командной строки скриптам.
+- Исправлен `this` в нестатических методах классов.
+- Исправлено завершение программы при использовании любого http запроса (баг в okhttp).
+- Исправлен visitor и проверки линтера внутри функций.
+
+### Модули
+- [okhttp] Добавлен `okhttp.newClient()` и `HttpClientBuilderValue`.
+- [canvasfx] Обновлена версия JavaFX.
+
+
+## 2.0.0
+
+### Критические изменения
+- Минимальная версия Java — 17.
+- Упрощён оператор use. `use std, math` вместо `use ["std", "math"]`.
+- `case [x]` при сопоставлении списков теперь соответствует лишь одному элементу.
+- Более строгий лексер. Исправлено экранирование обратного слэша в строках. Исправлены HEX числа println 0x0123456789, 0x०१२३४५६७८९.
+
+### Изменения
+- Добавлены константы. Константа может быть импортирована только при подключении модуля.
+- Возможность задать числа типа long: `700L`, `0xABL`
+- Исправлена область видимости переменных при шедоуинге.
+- Улучшена визуализация ошибок. Ошибки парсинга показывают конкретное место, где возникла ошибка. То же самое с линтером и ошибками времени исполнения.
+- Семантический линтер как обязательный этап работы интерпретатора.
+- Сохранение порядка элементов в Map по умолчанию.
+- Возможность запускать программы из ресурсов, указав "resource:" в качестве префикса пути.
+- Добавлены внутренние скрипты и команда `ownlang run` для их запуска. Добавлен скрипт `checkUpdate` для проверки новых версий.
+- Обновлена [документация](https://annimon.com/docs/ownlang/). Новый движок документации, основанный на vuepress.
+
+### Модули
+- [std] Добавлены функции parseDouble, nanotime, exit, getenv, getprop.
+- [http] Добавлена функция httpSync.
+- [functional] Добавлены функции groupby, tomap и операторы Stream.groupBy, Stream.filterNot, Stream.forEachIndexed, Stream::toMap, Stream.anyMatch, Stream.allMatch, Stream.noneMatch
+- [canvasfx] Исправлено для Java 17+ с Java FX 17 (только Windows)
+- [server] Новый модуль сервера
+
+
+## 1.5.0
+
+- Добавлены модули `zip`, `gzip`, `okhttp`
+- Добавлены функции `std::getBytes`, `std::stringFromBytes`, `std::stripMargin`
+- В `forms` добавлены JProgressBar, JTextArea, JScrollPane, методы для JButton, JTextField и WindowListener
+- В `functional::stream` добавлена функция `joining`
+- Добавлены свойства и функции для массивов: `arr.length`, `arr.isEmpty()`, `arr.joinToString(...)`
+- Добавлен оператор объединения с null `??` (null coalesce)
+- Добавлены классы (пока без наследования, как структура)
+- Строгое преобразование строк в числа (раньше int("test") выдавало 0, а теперь ошибку)
+- В `for` теперь можно итерировать строки и массивы с индексом:
+ `for ch : "test"`
+ `for ch, code : "test"`
+ `for el : arr`
+ `for el, index : arr`
+- В jsonencode можно задать отступ для читабельного форматирования:
+ `jsonencode(obj)` — минифицированный json
+ `jsonencode(obj, 2)` — pretty-print с отступом в 2 пробела
+- Возможность задать параметры парсера/дампера yaml
+- Исправлено подключение к mysql в модуле `jdbc`
+- Исправлен `str::range` для реверсивных промежутков
+- Исправлена функция files::readBytes с заданными offset и length
+- Исправлен поиск подходящего конструктора класса в `java::new`, так же можно инстанцировать класс через оператор new
+- Другие мелкие изменения
+
+
+## 1.4.0
+
+- Добавлены модули `downloader`, `regex`
+- Добавлены функции `std::arraySplice`, `std::default`
+- Добавлена константа `OwnLang` в модуль `std`, содержащая метаинформацию о версии языка и платформы
+- В StreamValue добавлены функции `peek`, `sorted`
+- Возможность импортировать сразу несколько модулей `use ["std", "types", "math"]`
+- Поддержка внутренних полей и функций у строк (length, lower, upper, chars, trim(), startsWith(s), endsWith(s), matches(s), contains(s), equalsIgnoreCase(s), isEmpty()). Также доступны автоматические функции расширения: `"%d. %s".sprintf(1, "OwnLang")` -> `sprintf("%d. %s", 1, "OwnLang")`
+- Добавлен kawaii-оператор `^^` для возможного переопределения
+- Улучшен режим REPL, теперь история команд (клавиша вверх) поддерживается на всех платформах, а по табу теперь всплывают подсказки автодополнения
+- Немного улучшен вывод ошибок
+- Обновлены примеры
+
+
+## 1.3.0
+
+- Поддержка цепочек функций и функциональных вызовов (`func().func()` и `func()()`)
+- Добавлены функции `takewhile`, `dropwhile`, `stream` в модуль `functional`
+- Добавлены функции `parseInt`, `parseLong`, `toHexString` в модуль `std`
+- Добавлена функция `copy` в модуль `files`
+- Добавлены модули `socket`, `base64`, `java`, `forms`, `jdbc`
+- Улучшена оптимизация
+- Обновлены примеры
+- Мелкие исправления и улучшения
+
+
+## 1.2.0
+
+- Добавлены модули `canvasfx`, `date`, `yml`, `aimp`
+- Обновлены модули `std`, `math`, `files`, `functional`
+- Добавлена константа `std::ARGS` для доступа к аргументам командной строки
+- Добавлен режим REPL, Beautifier, линтер, оптимизатор
+- Добавлена операция слияния объектов `map1 + map2`
+- Исправлено восстановление при ошибках парсинга и зависание в лексере
+- Исправлена область видимости переменных
+- Ускорено чтение файлов
+- Добавлен кэш числовых значений
+- Обновлён плагин для Netbeans
+- Добавлены примеры и помощь
+
diff --git a/docs/docs/ru/links.md b/docs/docs/ru/links.md
new file mode 100644
index 00000000..60d91f40
--- /dev/null
+++ b/docs/docs/ru/links.md
@@ -0,0 +1,13 @@
+# Ссылки
+
+## Загрузки
+
+Android: [Free](https://play.google.com/store/apps/details?id=com.annimon.ownlang.free) / [Pro](https://play.google.com/store/apps/details?id=com.annimon.ownlang)
+PC / плагин Netbeans / прочее: [GitHub Releases](https://github.com/aNNiMON/Own-Programming-Language-Tutorial/releases)
+Исходный код: [GitHub](https://github.com/aNNiMON/Own-Programming-Language-Tutorial)
+
+Также доступно в виде пакета в AUR:
+
+```
+paru -S ownlang
+```
diff --git a/docs/package.json b/docs/package.json
new file mode 100644
index 00000000..ef6505e1
--- /dev/null
+++ b/docs/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "ownlang-docs",
+ "version": "1.0.0",
+ "description": "OwnLang Documentation",
+ "main": "index.js",
+ "scripts": {
+ "docs:dev": "vuepress dev docs",
+ "docs:build": "vuepress build docs"
+ },
+ "keywords": [
+ "documentation",
+ "ownlang",
+ "programming-language"
+ ],
+ "author": "aNNiMON",
+ "license": "MIT",
+ "devDependencies": {
+ "@vuepress/client": "2.0.0-rc.0",
+ "@vuepress/plugin-prismjs": "2.0.0-rc.0",
+ "@vuepress/plugin-register-components": "2.0.0-rc.0",
+ "@vuepress/plugin-search": "2.0.0-rc.0",
+ "@vuepress/utils": "2.0.0-rc.0",
+ "prismjs": "^1.30.0",
+ "vue": "^3.4.20",
+ "vuepress": "2.0.0-rc.0"
+ }
+}
diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml
new file mode 100644
index 00000000..03c204d5
--- /dev/null
+++ b/docs/pnpm-lock.yaml
@@ -0,0 +1,2177 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ devDependencies:
+ '@vuepress/client':
+ specifier: 2.0.0-rc.0
+ version: 2.0.0-rc.0
+ '@vuepress/plugin-prismjs':
+ specifier: 2.0.0-rc.0
+ version: 2.0.0-rc.0
+ '@vuepress/plugin-register-components':
+ specifier: 2.0.0-rc.0
+ version: 2.0.0-rc.0
+ '@vuepress/plugin-search':
+ specifier: 2.0.0-rc.0
+ version: 2.0.0-rc.0
+ '@vuepress/utils':
+ specifier: 2.0.0-rc.0
+ version: 2.0.0-rc.0
+ prismjs:
+ specifier: ^1.30.0
+ version: 1.30.0
+ vue:
+ specifier: ^3.4.20
+ version: 3.4.20
+ vuepress:
+ specifier: 2.0.0-rc.0
+ version: 2.0.0-rc.0(@types/node@20.11.20)(@vuepress/client@2.0.0-rc.0)(sass@1.71.1)(vue@3.4.20)
+
+packages:
+
+ '@babel/helper-string-parser@7.23.4':
+ resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.22.20':
+ resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.23.9':
+ resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/types@7.23.9':
+ resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@esbuild/aix-ppc64@0.19.12':
+ resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.19.12':
+ resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.19.12':
+ resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.19.12':
+ resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.19.12':
+ resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.19.12':
+ resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.19.12':
+ resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.19.12':
+ resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.19.12':
+ resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.19.12':
+ resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.19.12':
+ resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.19.12':
+ resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.19.12':
+ resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.19.12':
+ resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.19.12':
+ resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.19.12':
+ resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.19.12':
+ resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-x64@0.19.12':
+ resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-x64@0.19.12':
+ resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/sunos-x64@0.19.12':
+ resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.19.12':
+ resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.19.12':
+ resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.19.12':
+ resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
+ '@jridgewell/sourcemap-codec@1.4.15':
+ resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+
+ '@mdit-vue/plugin-component@1.0.0':
+ resolution: {integrity: sha512-ZXsJwxkG5yyTHARIYbR74cT4AZ0SfMokFFjiHYCbypHIeYWgJhso4+CZ8+3V9EWFG3EHlGoKNGqKp9chHnqntQ==}
+
+ '@mdit-vue/plugin-frontmatter@1.0.0':
+ resolution: {integrity: sha512-MMA7Ny+YPZA7eDOY1t4E+rKuEWO39mzDdP/M68fKdXJU6VfcGkPr7gnpnJfW2QBJ5qIvMrK/3lDAA2JBy5TfpA==}
+
+ '@mdit-vue/plugin-headers@1.0.0':
+ resolution: {integrity: sha512-0rK/iKy6x13d/Pp5XxdLBshTD0+YjZvtHIaIV+JO+/H2WnOv7oaRgs48G5d44z3XJVUE2u6fNnTlI169fef0/A==}
+
+ '@mdit-vue/plugin-sfc@1.0.0':
+ resolution: {integrity: sha512-agMUe0fY4YHxsZivSvplBwRwrFvsIf/JNUJCAYq1+2Sg9+2hviTBZwjZDxYqHDHOVLtiNr+wuo68tE24mAx3AQ==}
+
+ '@mdit-vue/plugin-title@1.0.0':
+ resolution: {integrity: sha512-8yC60fCZ95xcJ/cvJH4Lv43Rs4k+33UGyKrRWj5J8TNyMwUyGcwur0XyPM+ffJH4/Bzq4myZLsj/TTFSkXRxvw==}
+
+ '@mdit-vue/plugin-toc@1.0.0':
+ resolution: {integrity: sha512-WN8blfX0X/5Nolic0ClDWP7eVo9IB+U4g0jbycX3lolIZX5Bai1UpsD3QYZr5VVsPbQJMKMGvTrCEtCNTGvyWQ==}
+
+ '@mdit-vue/shared@1.0.0':
+ resolution: {integrity: sha512-nbYBfmEi+pR2Lm0Z6TMVX2/iBjfr/kGEsHW8CC0rQw+3+sG5dY6VG094HuFAkiAmmvZx9DZZb+7ZMWp9vkwCRw==}
+
+ '@mdit-vue/types@1.0.0':
+ resolution: {integrity: sha512-xeF5+sHLzRNF7plbksywKCph4qli20l72of2fMlZQQ7RECvXYrRkE9+bjRFQCyULC7B8ydUYbpbkux5xJlVWyw==}
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@rollup/rollup-android-arm-eabi@4.22.4':
+ resolution: {integrity: sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.22.4':
+ resolution: {integrity: sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.22.4':
+ resolution: {integrity: sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.22.4':
+ resolution: {integrity: sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.22.4':
+ resolution: {integrity: sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.22.4':
+ resolution: {integrity: sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.22.4':
+ resolution: {integrity: sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.22.4':
+ resolution: {integrity: sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.22.4':
+ resolution: {integrity: sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.22.4':
+ resolution: {integrity: sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.22.4':
+ resolution: {integrity: sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.22.4':
+ resolution: {integrity: sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.22.4':
+ resolution: {integrity: sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-win32-arm64-msvc@4.22.4':
+ resolution: {integrity: sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.22.4':
+ resolution: {integrity: sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.22.4':
+ resolution: {integrity: sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==}
+ cpu: [x64]
+ os: [win32]
+
+ '@sindresorhus/merge-streams@2.3.0':
+ resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==}
+ engines: {node: '>=18'}
+
+ '@types/debug@4.1.12':
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
+ '@types/estree@1.0.5':
+ resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+
+ '@types/fs-extra@11.0.4':
+ resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==}
+
+ '@types/hash-sum@1.0.2':
+ resolution: {integrity: sha512-UP28RddqY8xcU0SCEp9YKutQICXpaAq9N8U2klqF5hegGha7KzTOL8EdhIIV3bOSGBzjEpN9bU/d+nNZBdJYVw==}
+
+ '@types/jsonfile@6.1.4':
+ resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==}
+
+ '@types/linkify-it@3.0.5':
+ resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==}
+
+ '@types/markdown-it-emoji@2.0.4':
+ resolution: {integrity: sha512-H6ulk/ZmbDxOayPwI/leJzrmoW1YKX1Z+MVSCHXuYhvqckV4I/c+hPTf6UiqJyn2avWugfj30XroheEb6/Ekqg==}
+
+ '@types/markdown-it@13.0.7':
+ resolution: {integrity: sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==}
+
+ '@types/mdurl@1.0.5':
+ resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==}
+
+ '@types/ms@0.7.34':
+ resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+
+ '@types/node@20.11.20':
+ resolution: {integrity: sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==}
+
+ '@types/web-bluetooth@0.0.20':
+ resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
+
+ '@vitejs/plugin-vue@4.6.2':
+ resolution: {integrity: sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^4.0.0 || ^5.0.0
+ vue: ^3.2.25
+
+ '@vue/compiler-core@3.4.20':
+ resolution: {integrity: sha512-l7M+xUuL8hrGtRLkrf+62d9zucAdgqNBTbJ/NufCOIuJQhauhfyAKH9ra/qUctCXcULwmclGAVpvmxjbBO30qg==}
+
+ '@vue/compiler-dom@3.4.20':
+ resolution: {integrity: sha512-/cSBGL79HFBYgDnqCNKErOav3bPde3n0sJwJM2Z09rXlkiowV/2SG1tgDAiWS1CatS4Cvo0o74e1vNeCK1R3RA==}
+
+ '@vue/compiler-sfc@3.4.20':
+ resolution: {integrity: sha512-nPuTZz0yxTPzjyYe+9nQQsFYImcz/57UX8N3jyhl5oIUUs2jqqAMaULsAlJwve3qNYfjQzq0bwy3pqJrN9ecZw==}
+
+ '@vue/compiler-ssr@3.4.20':
+ resolution: {integrity: sha512-b3gFQPiHLvI12C56otzBPpQhZ5kgkJ5RMv/zpLjLC2BIFwX5GktDqYQ7xg0Q2grP6uFI8al3beVKvAVxFtXmIg==}
+
+ '@vue/devtools-api@6.6.1':
+ resolution: {integrity: sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==}
+
+ '@vue/reactivity@3.4.20':
+ resolution: {integrity: sha512-P5LJcxUkG6inlHr6MHVA4AVFAmRYJQ7ONGWJILNjMjoYuEXFhYviSCb9BEMyszSG/1kWCZbtWQlKSLasFRpThw==}
+
+ '@vue/runtime-core@3.4.20':
+ resolution: {integrity: sha512-MPvsQpGAxoBqLHjqopt4YPtUYBpq0K6oAWDTwIR1CTNZ3y9O/J2ZVh+i2JpxKNYwANJBiZ20O99NE20uisB7xw==}
+
+ '@vue/runtime-dom@3.4.20':
+ resolution: {integrity: sha512-OkbPVP69H+8m74543zMAAx/LIkajxufYyow41gc0s5iF0uplT5uTQ4llDYu1GeJZEI8wjL5ueiPQruk4qwOMmA==}
+
+ '@vue/server-renderer@3.4.20':
+ resolution: {integrity: sha512-w3VH2GuwxQHA6pJo/HCV22OfVC8Mw4oeHQM+vKeqtRK0OPE1Wilnh+P/SDVGGxPjJsGmyfphi0dbw8UKZQJH9w==}
+ peerDependencies:
+ vue: 3.4.20
+
+ '@vue/shared@3.4.20':
+ resolution: {integrity: sha512-KTEngal0aiUvNJ6I1Chk5Ew5XqChsFsxP4GKAYXWb99zKJWjNU72p2FWEOmZWHxHcqtniOJsgnpd3zizdpfEag==}
+
+ '@vuepress/bundler-vite@2.0.0-rc.0':
+ resolution: {integrity: sha512-rX8S8IYpqqlJfNPstS/joorpxXx/4WuE7+gDM31i2HUrxOKGZVzq8ZsRRRU2UdoTwHZSd3LpUS4sMtxE5xLK1A==}
+
+ '@vuepress/cli@2.0.0-rc.0':
+ resolution: {integrity: sha512-XWSIFO9iOR7N4O2lXIwS5vZuLjU9WU/aGAtmhMWEMxrdMx7TQaJbgrfpTUEbHMf+cPI1DXBbUbtmkqIvtfOV0w==}
+ hasBin: true
+
+ '@vuepress/client@2.0.0-rc.0':
+ resolution: {integrity: sha512-TwQx8hJgYONYxX+QltZ2aw9O5Ym6SKelfiUduuIRb555B1gece/jSVap3H/ZwyBhpgJMtG4+/Mrmf8nlDSHjvw==}
+
+ '@vuepress/core@2.0.0-rc.0':
+ resolution: {integrity: sha512-uoOaZP1MdxZYJIAJcRcmYKKeCIVnxZeOuLMOOB9CPuAKSalT1RvJ1lztw6RX3q9SPnlqtSZPQXDncPAZivw4pA==}
+
+ '@vuepress/markdown@2.0.0-rc.0':
+ resolution: {integrity: sha512-USmqdKKMT6ZFHYRztTjKUlO8qgGfnEygMAAq4AzC/uYXiEfrbMBLAWJhteyGS56P3rGLj0OPAhksE681bX/wOg==}
+
+ '@vuepress/plugin-active-header-links@2.0.0-rc.0':
+ resolution: {integrity: sha512-UJdXLYNGL5Wjy5YGY8M2QgqT75bZ95EHebbqGi8twBdIJE9O+bM+dPJyYtAk2PIVqFORiw3Hj+PchsNSxdn9+g==}
+
+ '@vuepress/plugin-back-to-top@2.0.0-rc.0':
+ resolution: {integrity: sha512-6GPfuzV5lkAnR00BxRUhqMXwMWt741alkq2R6bln4N8BneSOwEpX/7vi19MGf232aKdS/Va4pF5p0/nJ8Sed/g==}
+
+ '@vuepress/plugin-container@2.0.0-rc.0':
+ resolution: {integrity: sha512-b7vrLN11YE7qiUDPfA3N9P7Z8fupe9Wbcr9KAE/bmfZ9VT4d6kzpVyoU7XHi99XngitsmnkaXP4aBvBF1c2AnA==}
+
+ '@vuepress/plugin-external-link-icon@2.0.0-rc.0':
+ resolution: {integrity: sha512-o8bk0oIlj/BkKc02mq91XLDloq1VOz/8iNcRwKAeqBE6svXzdYiyoTGet0J/4iPuAetsCn75S57W6RioDJHMnQ==}
+
+ '@vuepress/plugin-git@2.0.0-rc.0':
+ resolution: {integrity: sha512-r7UF77vZxaYeJQLygzodKv+15z3/dTLuGp4VcYO21W6BlJZvd4u9zqgiV7A//bZQvK4+3Hprylr0G3KgXqMewA==}
+
+ '@vuepress/plugin-medium-zoom@2.0.0-rc.0':
+ resolution: {integrity: sha512-peU1lYKsmKikIe/0pkJuHzD/k6xW2TuqdvKVhV4I//aOE1WxsREKJ4ACcldmoIsnysoDydAUqKT6xDPGyDsH2g==}
+
+ '@vuepress/plugin-nprogress@2.0.0-rc.0':
+ resolution: {integrity: sha512-rI+eK0Pg1KiZE+7hGmDUeSbgdWCid8Vnw0hFKNmjinDzGVmx4m03M6qfvclsI0SryH+lR7itZGLaR4gbTlrz/w==}
+
+ '@vuepress/plugin-palette@2.0.0-rc.0':
+ resolution: {integrity: sha512-wW70SCp3/K7s1lln5YQsBGTog2WXaQv5piva5zhXcQ47YGf4aAJpThDa5C/ot4HhkPOKn8Iz5s0ckxXZzW8DIg==}
+
+ '@vuepress/plugin-prismjs@2.0.0-rc.0':
+ resolution: {integrity: sha512-c5WRI7+FhVjdbymOKQ8F2KY/Bnv7aQtWScVk8vCMUimNi7v7Wff/A/i3KSFNz/tge3LxiAeH/Dc2WS/OnQXwCg==}
+
+ '@vuepress/plugin-register-components@2.0.0-rc.0':
+ resolution: {integrity: sha512-yN71x93j8ce99bqOwHn3lVfgiwsfhv21ByW/3em1kGXANjzOOoXOvt7ITbXNa5g6bsfjdJpoeUkUtFPwfK8dNA==}
+
+ '@vuepress/plugin-search@2.0.0-rc.0':
+ resolution: {integrity: sha512-1ikJUgIN+7QrcAftxpWUKTrNVHEN2+k/az0Sjz7Ok7EthMHcG6qQsIb+AoK4WIQMsJkwVPLxwym/M1FbBTZDWQ==}
+
+ '@vuepress/plugin-theme-data@2.0.0-rc.0':
+ resolution: {integrity: sha512-FXY3/Ml+rM6gNKvwdBF6vKAcwnSvtXCzKgQwJAw3ppQTKUkLcbOxqM+h4d8bzHWAAvdnEvQFug5uEZgWllBQbA==}
+
+ '@vuepress/shared@2.0.0-rc.0':
+ resolution: {integrity: sha512-ikdSfjRv5LGM1iv4HHwF9P6gqTjaFCXKPK+hzlkHFHNZO1GLqk7/BPc4F51tAG1s8TcLhUZc+54LrfgS7PkXXA==}
+
+ '@vuepress/theme-default@2.0.0-rc.0':
+ resolution: {integrity: sha512-I8Y08evDmMuD1jh3NftPpFFSlCWOizQDJLjN7EQwcg7jiAP4A7c2REo6nBN2EmP24Mi7UrRM+RnytHR5V+pElA==}
+ peerDependencies:
+ sass-loader: ^13.3.2
+ peerDependenciesMeta:
+ sass-loader:
+ optional: true
+
+ '@vuepress/utils@2.0.0-rc.0':
+ resolution: {integrity: sha512-Q1ay/woClDHcW0Qe91KsnHoupdNN0tp/vhjvVLuAYxlv/1Obii7hz9WFcajyyGEhmsYxdvG2sGmcxFA02tuKkw==}
+
+ '@vueuse/core@10.8.0':
+ resolution: {integrity: sha512-G9Ok9fjx10TkNIPn8V1dJmK1NcdJCtYmDRyYiTMUyJ1p0Tywc1zmOoCQ2xhHYyz8ULBU4KjIJQ9n+Lrty74iVw==}
+
+ '@vueuse/metadata@10.8.0':
+ resolution: {integrity: sha512-Nim/Vle5OgXcXhAvGOgkJQXB1Yb+Kq/fMbLuv3YYDYbiQrwr39ljuD4k9fPeq4yUyokYRo2RaNQmbbIMWB/9+w==}
+
+ '@vueuse/shared@10.8.0':
+ resolution: {integrity: sha512-dUdy6zwHhULGxmr9YUg8e+EnB39gcM4Fe2oKBSrh3cOsV30JcMPtsyuspgFCUo5xxFNaeMf/W2yyKfST7Bg8oQ==}
+
+ ansi-regex@6.0.1:
+ resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
+ engines: {node: '>=12'}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ autoprefixer@10.4.17:
+ resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ binary-extensions@2.2.0:
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+ engines: {node: '>=8'}
+
+ bl@5.1.0:
+ resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browserslist@4.23.0:
+ resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ buffer@6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+
+ cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+
+ caniuse-lite@1.0.30001589:
+ resolution: {integrity: sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==}
+
+ chalk@5.3.0:
+ resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
+ cli-cursor@4.0.0:
+ resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+
+ connect-history-api-fallback@2.0.0:
+ resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==}
+ engines: {node: '>=0.8'}
+
+ cross-spawn@7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ debug@4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+ electron-to-chromium@1.4.681:
+ resolution: {integrity: sha512-1PpuqJUFWoXZ1E54m8bsLPVYwIVCRzvaL+n5cjigGga4z854abDnFRc+cTa2th4S79kyGqya/1xoR7h+Y5G5lg==}
+
+ emoji-regex@10.3.0:
+ resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==}
+
+ entities@3.0.1:
+ resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==}
+ engines: {node: '>=0.12'}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ envinfo@7.11.1:
+ resolution: {integrity: sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ esbuild@0.19.12:
+ resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ escalade@3.1.2:
+ resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
+ engines: {node: '>=6'}
+
+ esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ execa@8.0.1:
+ resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
+ engines: {node: '>=16.17'}
+
+ extend-shallow@2.0.1:
+ resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
+ engines: {node: '>=0.10.0'}
+
+ fast-glob@3.3.2:
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+ engines: {node: '>=8.6.0'}
+
+ fastq@1.17.1:
+ resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ fraction.js@4.3.7:
+ resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+
+ fs-extra@11.2.0:
+ resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
+ engines: {node: '>=14.14'}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ get-stream@8.0.1:
+ resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+ engines: {node: '>=16'}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ globby@14.0.1:
+ resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==}
+ engines: {node: '>=18'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ gray-matter@4.0.3:
+ resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
+ engines: {node: '>=6.0'}
+
+ hash-sum@2.0.0:
+ resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==}
+
+ human-signals@5.0.0:
+ resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
+ engines: {node: '>=16.17.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ ignore@5.3.1:
+ resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
+ engines: {node: '>= 4'}
+
+ immutable@4.3.5:
+ resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==}
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-extendable@0.1.1:
+ resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
+ engines: {node: '>=0.10.0'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-interactive@2.0.0:
+ resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
+ engines: {node: '>=12'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-stream@3.0.0:
+ resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ is-unicode-supported@1.3.0:
+ resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
+ engines: {node: '>=12'}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ js-yaml@3.14.1:
+ resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+ hasBin: true
+
+ jsonfile@6.1.0:
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+
+ kind-of@6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+ engines: {node: '>=0.10.0'}
+
+ lilconfig@3.1.1:
+ resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==}
+ engines: {node: '>=14'}
+
+ linkify-it@4.0.1:
+ resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==}
+
+ log-symbols@5.1.0:
+ resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==}
+ engines: {node: '>=12'}
+
+ magic-string@0.30.7:
+ resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==}
+ engines: {node: '>=12'}
+
+ markdown-it-anchor@8.6.7:
+ resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==}
+ peerDependencies:
+ '@types/markdown-it': '*'
+ markdown-it: '*'
+
+ markdown-it-container@3.0.0:
+ resolution: {integrity: sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==}
+
+ markdown-it-emoji@2.0.2:
+ resolution: {integrity: sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==}
+
+ markdown-it@13.0.2:
+ resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==}
+ hasBin: true
+
+ mdurl@1.0.1:
+ resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==}
+
+ medium-zoom@1.1.0:
+ resolution: {integrity: sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==}
+
+ merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micromatch@4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+
+ mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+
+ mimic-fn@4.0.0:
+ resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+ engines: {node: '>=12'}
+
+ ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+ nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ node-releases@2.0.14:
+ resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ normalize-range@0.1.2:
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+ engines: {node: '>=0.10.0'}
+
+ npm-run-path@5.3.0:
+ resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+
+ onetime@6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
+
+ ora@7.0.1:
+ resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==}
+ engines: {node: '>=16'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+
+ path-type@5.0.0:
+ resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==}
+ engines: {node: '>=12'}
+
+ picocolors@1.0.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ postcss-load-config@4.0.2:
+ resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
+ engines: {node: '>= 14'}
+ peerDependencies:
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+
+ postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+ postcss@8.4.35:
+ resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ prismjs@1.30.0:
+ resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
+ engines: {node: '>=6'}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
+ restore-cursor@4.0.0:
+ resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rollup@4.22.4:
+ resolution: {integrity: sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ sass@1.71.1:
+ resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ section-matter@1.0.0:
+ resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
+ engines: {node: '>=4'}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ slash@5.1.0:
+ resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
+ engines: {node: '>=14.16'}
+
+ source-map-js@1.0.2:
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+ engines: {node: '>=0.10.0'}
+
+ sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+ stdin-discarder@0.1.0:
+ resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ string-width@6.1.0:
+ resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==}
+ engines: {node: '>=16'}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+
+ strip-bom-string@1.0.0:
+ resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==}
+ engines: {node: '>=0.10.0'}
+
+ strip-final-newline@3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
+
+ to-fast-properties@2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ ts-debounce@4.0.0:
+ resolution: {integrity: sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==}
+
+ uc.micro@1.0.6:
+ resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==}
+
+ undici-types@5.26.5:
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+
+ unicorn-magic@0.1.0:
+ resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
+ engines: {node: '>=18'}
+
+ universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+
+ upath@2.0.1:
+ resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==}
+ engines: {node: '>=4'}
+
+ update-browserslist-db@1.0.13:
+ resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ vite@5.0.13:
+ resolution: {integrity: sha512-/9ovhv2M2dGTuA+dY93B9trfyWMDRQw2jdVBhHNP6wr0oF34wG2i/N55801iZIpgUpnHDm4F/FabGQLyc+eOgg==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || >=20.0.0
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+
+ vue-demi@0.14.7:
+ resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==}
+ engines: {node: '>=12'}
+ hasBin: true
+ peerDependencies:
+ '@vue/composition-api': ^1.0.0-rc.1
+ vue: ^3.0.0-0 || ^2.6.0
+ peerDependenciesMeta:
+ '@vue/composition-api':
+ optional: true
+
+ vue-router@4.3.0:
+ resolution: {integrity: sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ==}
+ peerDependencies:
+ vue: ^3.2.0
+
+ vue@3.4.20:
+ resolution: {integrity: sha512-xF4zDKXp67NjgORFX/HOuaiaKYjgxkaToK0KWglFQEYlCw9AqgBlj1yu5xa6YaRek47w2IGiuvpvrGg/XuQFCw==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ vuepress-vite@2.0.0-rc.0:
+ resolution: {integrity: sha512-+2XBejeiskPyr2raBeA2o4uDFDsjtadpUVmtio3qqFtQpOhidz/ORuiTLr2UfLtFn1ASIHP6Vy2YjQ0e/TeUVw==}
+ engines: {node: '>=18.16.0'}
+ hasBin: true
+ peerDependencies:
+ '@vuepress/client': 2.0.0-rc.0
+ vue: ^3.3.4
+
+ vuepress@2.0.0-rc.0:
+ resolution: {integrity: sha512-sydt/B7+pIw926G5PntYmptLkC5o2buXKh+WR1+P2KnsvkXU+UGnQrJJ0FBvu/4RNuY99tkUZd59nyPhEmRrCg==}
+ engines: {node: '>=18.16.0'}
+ hasBin: true
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ yaml@2.4.0:
+ resolution: {integrity: sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==}
+ engines: {node: '>= 14'}
+ hasBin: true
+
+snapshots:
+
+ '@babel/helper-string-parser@7.23.4': {}
+
+ '@babel/helper-validator-identifier@7.22.20': {}
+
+ '@babel/parser@7.23.9':
+ dependencies:
+ '@babel/types': 7.23.9
+
+ '@babel/types@7.23.9':
+ dependencies:
+ '@babel/helper-string-parser': 7.23.4
+ '@babel/helper-validator-identifier': 7.22.20
+ to-fast-properties: 2.0.0
+
+ '@esbuild/aix-ppc64@0.19.12':
+ optional: true
+
+ '@esbuild/android-arm64@0.19.12':
+ optional: true
+
+ '@esbuild/android-arm@0.19.12':
+ optional: true
+
+ '@esbuild/android-x64@0.19.12':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.19.12':
+ optional: true
+
+ '@esbuild/darwin-x64@0.19.12':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.19.12':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.19.12':
+ optional: true
+
+ '@esbuild/linux-arm64@0.19.12':
+ optional: true
+
+ '@esbuild/linux-arm@0.19.12':
+ optional: true
+
+ '@esbuild/linux-ia32@0.19.12':
+ optional: true
+
+ '@esbuild/linux-loong64@0.19.12':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.19.12':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.19.12':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.19.12':
+ optional: true
+
+ '@esbuild/linux-s390x@0.19.12':
+ optional: true
+
+ '@esbuild/linux-x64@0.19.12':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.19.12':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.19.12':
+ optional: true
+
+ '@esbuild/sunos-x64@0.19.12':
+ optional: true
+
+ '@esbuild/win32-arm64@0.19.12':
+ optional: true
+
+ '@esbuild/win32-ia32@0.19.12':
+ optional: true
+
+ '@esbuild/win32-x64@0.19.12':
+ optional: true
+
+ '@jridgewell/sourcemap-codec@1.4.15': {}
+
+ '@mdit-vue/plugin-component@1.0.0':
+ dependencies:
+ '@types/markdown-it': 13.0.7
+ markdown-it: 13.0.2
+
+ '@mdit-vue/plugin-frontmatter@1.0.0':
+ dependencies:
+ '@mdit-vue/types': 1.0.0
+ '@types/markdown-it': 13.0.7
+ gray-matter: 4.0.3
+ markdown-it: 13.0.2
+
+ '@mdit-vue/plugin-headers@1.0.0':
+ dependencies:
+ '@mdit-vue/shared': 1.0.0
+ '@mdit-vue/types': 1.0.0
+ '@types/markdown-it': 13.0.7
+ markdown-it: 13.0.2
+
+ '@mdit-vue/plugin-sfc@1.0.0':
+ dependencies:
+ '@mdit-vue/types': 1.0.0
+ '@types/markdown-it': 13.0.7
+ markdown-it: 13.0.2
+
+ '@mdit-vue/plugin-title@1.0.0':
+ dependencies:
+ '@mdit-vue/shared': 1.0.0
+ '@mdit-vue/types': 1.0.0
+ '@types/markdown-it': 13.0.7
+ markdown-it: 13.0.2
+
+ '@mdit-vue/plugin-toc@1.0.0':
+ dependencies:
+ '@mdit-vue/shared': 1.0.0
+ '@mdit-vue/types': 1.0.0
+ '@types/markdown-it': 13.0.7
+ markdown-it: 13.0.2
+
+ '@mdit-vue/shared@1.0.0':
+ dependencies:
+ '@mdit-vue/types': 1.0.0
+ '@types/markdown-it': 13.0.7
+ markdown-it: 13.0.2
+
+ '@mdit-vue/types@1.0.0': {}
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.17.1
+
+ '@rollup/rollup-android-arm-eabi@4.22.4':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.22.4':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.22.4':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.22.4':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.22.4':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.22.4':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.22.4':
+ optional: true
+
+ '@sindresorhus/merge-streams@2.3.0': {}
+
+ '@types/debug@4.1.12':
+ dependencies:
+ '@types/ms': 0.7.34
+
+ '@types/estree@1.0.5': {}
+
+ '@types/fs-extra@11.0.4':
+ dependencies:
+ '@types/jsonfile': 6.1.4
+ '@types/node': 20.11.20
+
+ '@types/hash-sum@1.0.2': {}
+
+ '@types/jsonfile@6.1.4':
+ dependencies:
+ '@types/node': 20.11.20
+
+ '@types/linkify-it@3.0.5': {}
+
+ '@types/markdown-it-emoji@2.0.4':
+ dependencies:
+ '@types/markdown-it': 13.0.7
+
+ '@types/markdown-it@13.0.7':
+ dependencies:
+ '@types/linkify-it': 3.0.5
+ '@types/mdurl': 1.0.5
+
+ '@types/mdurl@1.0.5': {}
+
+ '@types/ms@0.7.34': {}
+
+ '@types/node@20.11.20':
+ dependencies:
+ undici-types: 5.26.5
+
+ '@types/web-bluetooth@0.0.20': {}
+
+ '@vitejs/plugin-vue@4.6.2(vite@5.0.13(@types/node@20.11.20)(sass@1.71.1))(vue@3.4.20)':
+ dependencies:
+ vite: 5.0.13(@types/node@20.11.20)(sass@1.71.1)
+ vue: 3.4.20
+
+ '@vue/compiler-core@3.4.20':
+ dependencies:
+ '@babel/parser': 7.23.9
+ '@vue/shared': 3.4.20
+ entities: 4.5.0
+ estree-walker: 2.0.2
+ source-map-js: 1.0.2
+
+ '@vue/compiler-dom@3.4.20':
+ dependencies:
+ '@vue/compiler-core': 3.4.20
+ '@vue/shared': 3.4.20
+
+ '@vue/compiler-sfc@3.4.20':
+ dependencies:
+ '@babel/parser': 7.23.9
+ '@vue/compiler-core': 3.4.20
+ '@vue/compiler-dom': 3.4.20
+ '@vue/compiler-ssr': 3.4.20
+ '@vue/shared': 3.4.20
+ estree-walker: 2.0.2
+ magic-string: 0.30.7
+ postcss: 8.4.35
+ source-map-js: 1.0.2
+
+ '@vue/compiler-ssr@3.4.20':
+ dependencies:
+ '@vue/compiler-dom': 3.4.20
+ '@vue/shared': 3.4.20
+
+ '@vue/devtools-api@6.6.1': {}
+
+ '@vue/reactivity@3.4.20':
+ dependencies:
+ '@vue/shared': 3.4.20
+
+ '@vue/runtime-core@3.4.20':
+ dependencies:
+ '@vue/reactivity': 3.4.20
+ '@vue/shared': 3.4.20
+
+ '@vue/runtime-dom@3.4.20':
+ dependencies:
+ '@vue/runtime-core': 3.4.20
+ '@vue/shared': 3.4.20
+ csstype: 3.1.3
+
+ '@vue/server-renderer@3.4.20(vue@3.4.20)':
+ dependencies:
+ '@vue/compiler-ssr': 3.4.20
+ '@vue/shared': 3.4.20
+ vue: 3.4.20
+
+ '@vue/shared@3.4.20': {}
+
+ '@vuepress/bundler-vite@2.0.0-rc.0(@types/node@20.11.20)(sass@1.71.1)':
+ dependencies:
+ '@vitejs/plugin-vue': 4.6.2(vite@5.0.13(@types/node@20.11.20)(sass@1.71.1))(vue@3.4.20)
+ '@vuepress/client': 2.0.0-rc.0
+ '@vuepress/core': 2.0.0-rc.0
+ '@vuepress/shared': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ autoprefixer: 10.4.17(postcss@8.4.35)
+ connect-history-api-fallback: 2.0.0
+ postcss: 8.4.35
+ postcss-load-config: 4.0.2(postcss@8.4.35)
+ rollup: 4.22.4
+ vite: 5.0.13(@types/node@20.11.20)(sass@1.71.1)
+ vue: 3.4.20
+ vue-router: 4.3.0(vue@3.4.20)
+ transitivePeerDependencies:
+ - '@types/node'
+ - '@vue/composition-api'
+ - less
+ - lightningcss
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - ts-node
+ - typescript
+
+ '@vuepress/cli@2.0.0-rc.0':
+ dependencies:
+ '@vuepress/core': 2.0.0-rc.0
+ '@vuepress/shared': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ cac: 6.7.14
+ chokidar: 3.6.0
+ envinfo: 7.11.1
+ esbuild: 0.19.12
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - supports-color
+ - typescript
+
+ '@vuepress/client@2.0.0-rc.0':
+ dependencies:
+ '@vue/devtools-api': 6.6.1
+ '@vuepress/shared': 2.0.0-rc.0
+ '@vueuse/core': 10.8.0(vue@3.4.20)
+ vue: 3.4.20
+ vue-router: 4.3.0(vue@3.4.20)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - typescript
+
+ '@vuepress/core@2.0.0-rc.0':
+ dependencies:
+ '@vuepress/client': 2.0.0-rc.0
+ '@vuepress/markdown': 2.0.0-rc.0
+ '@vuepress/shared': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ vue: 3.4.20
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - supports-color
+ - typescript
+
+ '@vuepress/markdown@2.0.0-rc.0':
+ dependencies:
+ '@mdit-vue/plugin-component': 1.0.0
+ '@mdit-vue/plugin-frontmatter': 1.0.0
+ '@mdit-vue/plugin-headers': 1.0.0
+ '@mdit-vue/plugin-sfc': 1.0.0
+ '@mdit-vue/plugin-title': 1.0.0
+ '@mdit-vue/plugin-toc': 1.0.0
+ '@mdit-vue/shared': 1.0.0
+ '@mdit-vue/types': 1.0.0
+ '@types/markdown-it': 13.0.7
+ '@types/markdown-it-emoji': 2.0.4
+ '@vuepress/shared': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ markdown-it: 13.0.2
+ markdown-it-anchor: 8.6.7(@types/markdown-it@13.0.7)(markdown-it@13.0.2)
+ markdown-it-emoji: 2.0.2
+ mdurl: 1.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vuepress/plugin-active-header-links@2.0.0-rc.0':
+ dependencies:
+ '@vuepress/client': 2.0.0-rc.0
+ '@vuepress/core': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ ts-debounce: 4.0.0
+ vue: 3.4.20
+ vue-router: 4.3.0(vue@3.4.20)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - supports-color
+ - typescript
+
+ '@vuepress/plugin-back-to-top@2.0.0-rc.0':
+ dependencies:
+ '@vuepress/client': 2.0.0-rc.0
+ '@vuepress/core': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ ts-debounce: 4.0.0
+ vue: 3.4.20
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - supports-color
+ - typescript
+
+ '@vuepress/plugin-container@2.0.0-rc.0':
+ dependencies:
+ '@types/markdown-it': 13.0.7
+ '@vuepress/core': 2.0.0-rc.0
+ '@vuepress/markdown': 2.0.0-rc.0
+ '@vuepress/shared': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ markdown-it: 13.0.2
+ markdown-it-container: 3.0.0
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - supports-color
+ - typescript
+
+ '@vuepress/plugin-external-link-icon@2.0.0-rc.0':
+ dependencies:
+ '@vuepress/client': 2.0.0-rc.0
+ '@vuepress/core': 2.0.0-rc.0
+ '@vuepress/markdown': 2.0.0-rc.0
+ '@vuepress/shared': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ vue: 3.4.20
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - supports-color
+ - typescript
+
+ '@vuepress/plugin-git@2.0.0-rc.0':
+ dependencies:
+ '@vuepress/core': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ execa: 8.0.1
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - supports-color
+ - typescript
+
+ '@vuepress/plugin-medium-zoom@2.0.0-rc.0':
+ dependencies:
+ '@vuepress/client': 2.0.0-rc.0
+ '@vuepress/core': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ medium-zoom: 1.1.0
+ vue: 3.4.20
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - supports-color
+ - typescript
+
+ '@vuepress/plugin-nprogress@2.0.0-rc.0':
+ dependencies:
+ '@vuepress/client': 2.0.0-rc.0
+ '@vuepress/core': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ vue: 3.4.20
+ vue-router: 4.3.0(vue@3.4.20)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - supports-color
+ - typescript
+
+ '@vuepress/plugin-palette@2.0.0-rc.0':
+ dependencies:
+ '@vuepress/core': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ chokidar: 3.6.0
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - supports-color
+ - typescript
+
+ '@vuepress/plugin-prismjs@2.0.0-rc.0':
+ dependencies:
+ '@vuepress/core': 2.0.0-rc.0
+ prismjs: 1.30.0
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - supports-color
+ - typescript
+
+ '@vuepress/plugin-register-components@2.0.0-rc.0':
+ dependencies:
+ '@vuepress/core': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ chokidar: 3.6.0
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - supports-color
+ - typescript
+
+ '@vuepress/plugin-search@2.0.0-rc.0':
+ dependencies:
+ '@vuepress/client': 2.0.0-rc.0
+ '@vuepress/core': 2.0.0-rc.0
+ '@vuepress/shared': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ chokidar: 3.6.0
+ vue: 3.4.20
+ vue-router: 4.3.0(vue@3.4.20)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - supports-color
+ - typescript
+
+ '@vuepress/plugin-theme-data@2.0.0-rc.0':
+ dependencies:
+ '@vue/devtools-api': 6.6.1
+ '@vuepress/client': 2.0.0-rc.0
+ '@vuepress/core': 2.0.0-rc.0
+ '@vuepress/shared': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ vue: 3.4.20
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - supports-color
+ - typescript
+
+ '@vuepress/shared@2.0.0-rc.0':
+ dependencies:
+ '@mdit-vue/types': 1.0.0
+ '@vue/shared': 3.4.20
+
+ '@vuepress/theme-default@2.0.0-rc.0':
+ dependencies:
+ '@vuepress/client': 2.0.0-rc.0
+ '@vuepress/core': 2.0.0-rc.0
+ '@vuepress/plugin-active-header-links': 2.0.0-rc.0
+ '@vuepress/plugin-back-to-top': 2.0.0-rc.0
+ '@vuepress/plugin-container': 2.0.0-rc.0
+ '@vuepress/plugin-external-link-icon': 2.0.0-rc.0
+ '@vuepress/plugin-git': 2.0.0-rc.0
+ '@vuepress/plugin-medium-zoom': 2.0.0-rc.0
+ '@vuepress/plugin-nprogress': 2.0.0-rc.0
+ '@vuepress/plugin-palette': 2.0.0-rc.0
+ '@vuepress/plugin-prismjs': 2.0.0-rc.0
+ '@vuepress/plugin-theme-data': 2.0.0-rc.0
+ '@vuepress/shared': 2.0.0-rc.0
+ '@vuepress/utils': 2.0.0-rc.0
+ '@vueuse/core': 10.8.0(vue@3.4.20)
+ sass: 1.71.1
+ vue: 3.4.20
+ vue-router: 4.3.0(vue@3.4.20)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - supports-color
+ - typescript
+
+ '@vuepress/utils@2.0.0-rc.0':
+ dependencies:
+ '@types/debug': 4.1.12
+ '@types/fs-extra': 11.0.4
+ '@types/hash-sum': 1.0.2
+ '@vuepress/shared': 2.0.0-rc.0
+ debug: 4.3.4
+ fs-extra: 11.2.0
+ globby: 14.0.1
+ hash-sum: 2.0.0
+ ora: 7.0.1
+ picocolors: 1.0.0
+ upath: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vueuse/core@10.8.0(vue@3.4.20)':
+ dependencies:
+ '@types/web-bluetooth': 0.0.20
+ '@vueuse/metadata': 10.8.0
+ '@vueuse/shared': 10.8.0(vue@3.4.20)
+ vue-demi: 0.14.7(vue@3.4.20)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+
+ '@vueuse/metadata@10.8.0': {}
+
+ '@vueuse/shared@10.8.0(vue@3.4.20)':
+ dependencies:
+ vue-demi: 0.14.7(vue@3.4.20)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+
+ ansi-regex@6.0.1: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
+ argparse@1.0.10:
+ dependencies:
+ sprintf-js: 1.0.3
+
+ argparse@2.0.1: {}
+
+ autoprefixer@10.4.17(postcss@8.4.35):
+ dependencies:
+ browserslist: 4.23.0
+ caniuse-lite: 1.0.30001589
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ picocolors: 1.0.0
+ postcss: 8.4.35
+ postcss-value-parser: 4.2.0
+
+ base64-js@1.5.1: {}
+
+ binary-extensions@2.2.0: {}
+
+ bl@5.1.0:
+ dependencies:
+ buffer: 6.0.3
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ browserslist@4.23.0:
+ dependencies:
+ caniuse-lite: 1.0.30001589
+ electron-to-chromium: 1.4.681
+ node-releases: 2.0.14
+ update-browserslist-db: 1.0.13(browserslist@4.23.0)
+
+ buffer@6.0.3:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ cac@6.7.14: {}
+
+ caniuse-lite@1.0.30001589: {}
+
+ chalk@5.3.0: {}
+
+ chokidar@3.6.0:
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ cli-cursor@4.0.0:
+ dependencies:
+ restore-cursor: 4.0.0
+
+ cli-spinners@2.9.2: {}
+
+ connect-history-api-fallback@2.0.0: {}
+
+ cross-spawn@7.0.3:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ csstype@3.1.3: {}
+
+ debug@4.3.4:
+ dependencies:
+ ms: 2.1.2
+
+ eastasianwidth@0.2.0: {}
+
+ electron-to-chromium@1.4.681: {}
+
+ emoji-regex@10.3.0: {}
+
+ entities@3.0.1: {}
+
+ entities@4.5.0: {}
+
+ envinfo@7.11.1: {}
+
+ esbuild@0.19.12:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.19.12
+ '@esbuild/android-arm': 0.19.12
+ '@esbuild/android-arm64': 0.19.12
+ '@esbuild/android-x64': 0.19.12
+ '@esbuild/darwin-arm64': 0.19.12
+ '@esbuild/darwin-x64': 0.19.12
+ '@esbuild/freebsd-arm64': 0.19.12
+ '@esbuild/freebsd-x64': 0.19.12
+ '@esbuild/linux-arm': 0.19.12
+ '@esbuild/linux-arm64': 0.19.12
+ '@esbuild/linux-ia32': 0.19.12
+ '@esbuild/linux-loong64': 0.19.12
+ '@esbuild/linux-mips64el': 0.19.12
+ '@esbuild/linux-ppc64': 0.19.12
+ '@esbuild/linux-riscv64': 0.19.12
+ '@esbuild/linux-s390x': 0.19.12
+ '@esbuild/linux-x64': 0.19.12
+ '@esbuild/netbsd-x64': 0.19.12
+ '@esbuild/openbsd-x64': 0.19.12
+ '@esbuild/sunos-x64': 0.19.12
+ '@esbuild/win32-arm64': 0.19.12
+ '@esbuild/win32-ia32': 0.19.12
+ '@esbuild/win32-x64': 0.19.12
+
+ escalade@3.1.2: {}
+
+ esprima@4.0.1: {}
+
+ estree-walker@2.0.2: {}
+
+ execa@8.0.1:
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 8.0.1
+ human-signals: 5.0.0
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.3.0
+ onetime: 6.0.0
+ signal-exit: 4.1.0
+ strip-final-newline: 3.0.0
+
+ extend-shallow@2.0.1:
+ dependencies:
+ is-extendable: 0.1.1
+
+ fast-glob@3.3.2:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.5
+
+ fastq@1.17.1:
+ dependencies:
+ reusify: 1.0.4
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ fraction.js@4.3.7: {}
+
+ fs-extra@11.2.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+
+ fsevents@2.3.3:
+ optional: true
+
+ get-stream@8.0.1: {}
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ globby@14.0.1:
+ dependencies:
+ '@sindresorhus/merge-streams': 2.3.0
+ fast-glob: 3.3.2
+ ignore: 5.3.1
+ path-type: 5.0.0
+ slash: 5.1.0
+ unicorn-magic: 0.1.0
+
+ graceful-fs@4.2.11: {}
+
+ gray-matter@4.0.3:
+ dependencies:
+ js-yaml: 3.14.1
+ kind-of: 6.0.3
+ section-matter: 1.0.0
+ strip-bom-string: 1.0.0
+
+ hash-sum@2.0.0: {}
+
+ human-signals@5.0.0: {}
+
+ ieee754@1.2.1: {}
+
+ ignore@5.3.1: {}
+
+ immutable@4.3.5: {}
+
+ inherits@2.0.4: {}
+
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.2.0
+
+ is-extendable@0.1.1: {}
+
+ is-extglob@2.1.1: {}
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-interactive@2.0.0: {}
+
+ is-number@7.0.0: {}
+
+ is-stream@3.0.0: {}
+
+ is-unicode-supported@1.3.0: {}
+
+ isexe@2.0.0: {}
+
+ js-yaml@3.14.1:
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+
+ jsonfile@6.1.0:
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ kind-of@6.0.3: {}
+
+ lilconfig@3.1.1: {}
+
+ linkify-it@4.0.1:
+ dependencies:
+ uc.micro: 1.0.6
+
+ log-symbols@5.1.0:
+ dependencies:
+ chalk: 5.3.0
+ is-unicode-supported: 1.3.0
+
+ magic-string@0.30.7:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.4.15
+
+ markdown-it-anchor@8.6.7(@types/markdown-it@13.0.7)(markdown-it@13.0.2):
+ dependencies:
+ '@types/markdown-it': 13.0.7
+ markdown-it: 13.0.2
+
+ markdown-it-container@3.0.0: {}
+
+ markdown-it-emoji@2.0.2: {}
+
+ markdown-it@13.0.2:
+ dependencies:
+ argparse: 2.0.1
+ entities: 3.0.1
+ linkify-it: 4.0.1
+ mdurl: 1.0.1
+ uc.micro: 1.0.6
+
+ mdurl@1.0.1: {}
+
+ medium-zoom@1.1.0: {}
+
+ merge-stream@2.0.0: {}
+
+ merge2@1.4.1: {}
+
+ micromatch@4.0.5:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
+ mimic-fn@2.1.0: {}
+
+ mimic-fn@4.0.0: {}
+
+ ms@2.1.2: {}
+
+ nanoid@3.3.7: {}
+
+ node-releases@2.0.14: {}
+
+ normalize-path@3.0.0: {}
+
+ normalize-range@0.1.2: {}
+
+ npm-run-path@5.3.0:
+ dependencies:
+ path-key: 4.0.0
+
+ onetime@5.1.2:
+ dependencies:
+ mimic-fn: 2.1.0
+
+ onetime@6.0.0:
+ dependencies:
+ mimic-fn: 4.0.0
+
+ ora@7.0.1:
+ dependencies:
+ chalk: 5.3.0
+ cli-cursor: 4.0.0
+ cli-spinners: 2.9.2
+ is-interactive: 2.0.0
+ is-unicode-supported: 1.3.0
+ log-symbols: 5.1.0
+ stdin-discarder: 0.1.0
+ string-width: 6.1.0
+ strip-ansi: 7.1.0
+
+ path-key@3.1.1: {}
+
+ path-key@4.0.0: {}
+
+ path-type@5.0.0: {}
+
+ picocolors@1.0.0: {}
+
+ picomatch@2.3.1: {}
+
+ postcss-load-config@4.0.2(postcss@8.4.35):
+ dependencies:
+ lilconfig: 3.1.1
+ yaml: 2.4.0
+ optionalDependencies:
+ postcss: 8.4.35
+
+ postcss-value-parser@4.2.0: {}
+
+ postcss@8.4.35:
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.0.0
+ source-map-js: 1.0.2
+
+ prismjs@1.30.0: {}
+
+ queue-microtask@1.2.3: {}
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.1
+
+ restore-cursor@4.0.0:
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+
+ reusify@1.0.4: {}
+
+ rollup@4.22.4:
+ dependencies:
+ '@types/estree': 1.0.5
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.22.4
+ '@rollup/rollup-android-arm64': 4.22.4
+ '@rollup/rollup-darwin-arm64': 4.22.4
+ '@rollup/rollup-darwin-x64': 4.22.4
+ '@rollup/rollup-linux-arm-gnueabihf': 4.22.4
+ '@rollup/rollup-linux-arm-musleabihf': 4.22.4
+ '@rollup/rollup-linux-arm64-gnu': 4.22.4
+ '@rollup/rollup-linux-arm64-musl': 4.22.4
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.22.4
+ '@rollup/rollup-linux-riscv64-gnu': 4.22.4
+ '@rollup/rollup-linux-s390x-gnu': 4.22.4
+ '@rollup/rollup-linux-x64-gnu': 4.22.4
+ '@rollup/rollup-linux-x64-musl': 4.22.4
+ '@rollup/rollup-win32-arm64-msvc': 4.22.4
+ '@rollup/rollup-win32-ia32-msvc': 4.22.4
+ '@rollup/rollup-win32-x64-msvc': 4.22.4
+ fsevents: 2.3.3
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ safe-buffer@5.2.1: {}
+
+ sass@1.71.1:
+ dependencies:
+ chokidar: 3.6.0
+ immutable: 4.3.5
+ source-map-js: 1.0.2
+
+ section-matter@1.0.0:
+ dependencies:
+ extend-shallow: 2.0.1
+ kind-of: 6.0.3
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ signal-exit@3.0.7: {}
+
+ signal-exit@4.1.0: {}
+
+ slash@5.1.0: {}
+
+ source-map-js@1.0.2: {}
+
+ sprintf-js@1.0.3: {}
+
+ stdin-discarder@0.1.0:
+ dependencies:
+ bl: 5.1.0
+
+ string-width@6.1.0:
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 10.3.0
+ strip-ansi: 7.1.0
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ strip-ansi@7.1.0:
+ dependencies:
+ ansi-regex: 6.0.1
+
+ strip-bom-string@1.0.0: {}
+
+ strip-final-newline@3.0.0: {}
+
+ to-fast-properties@2.0.0: {}
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ ts-debounce@4.0.0: {}
+
+ uc.micro@1.0.6: {}
+
+ undici-types@5.26.5: {}
+
+ unicorn-magic@0.1.0: {}
+
+ universalify@2.0.1: {}
+
+ upath@2.0.1: {}
+
+ update-browserslist-db@1.0.13(browserslist@4.23.0):
+ dependencies:
+ browserslist: 4.23.0
+ escalade: 3.1.2
+ picocolors: 1.0.0
+
+ util-deprecate@1.0.2: {}
+
+ vite@5.0.13(@types/node@20.11.20)(sass@1.71.1):
+ dependencies:
+ esbuild: 0.19.12
+ postcss: 8.4.35
+ rollup: 4.22.4
+ optionalDependencies:
+ '@types/node': 20.11.20
+ fsevents: 2.3.3
+ sass: 1.71.1
+
+ vue-demi@0.14.7(vue@3.4.20):
+ dependencies:
+ vue: 3.4.20
+
+ vue-router@4.3.0(vue@3.4.20):
+ dependencies:
+ '@vue/devtools-api': 6.6.1
+ vue: 3.4.20
+
+ vue@3.4.20:
+ dependencies:
+ '@vue/compiler-dom': 3.4.20
+ '@vue/compiler-sfc': 3.4.20
+ '@vue/runtime-dom': 3.4.20
+ '@vue/server-renderer': 3.4.20(vue@3.4.20)
+ '@vue/shared': 3.4.20
+
+ vuepress-vite@2.0.0-rc.0(@types/node@20.11.20)(@vuepress/client@2.0.0-rc.0)(sass@1.71.1)(vue@3.4.20):
+ dependencies:
+ '@vuepress/bundler-vite': 2.0.0-rc.0(@types/node@20.11.20)(sass@1.71.1)
+ '@vuepress/cli': 2.0.0-rc.0
+ '@vuepress/client': 2.0.0-rc.0
+ '@vuepress/core': 2.0.0-rc.0
+ '@vuepress/theme-default': 2.0.0-rc.0
+ vue: 3.4.20
+ transitivePeerDependencies:
+ - '@types/node'
+ - '@vue/composition-api'
+ - less
+ - lightningcss
+ - sass
+ - sass-loader
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - ts-node
+ - typescript
+
+ vuepress@2.0.0-rc.0(@types/node@20.11.20)(@vuepress/client@2.0.0-rc.0)(sass@1.71.1)(vue@3.4.20):
+ dependencies:
+ vuepress-vite: 2.0.0-rc.0(@types/node@20.11.20)(@vuepress/client@2.0.0-rc.0)(sass@1.71.1)(vue@3.4.20)
+ transitivePeerDependencies:
+ - '@types/node'
+ - '@vue/composition-api'
+ - '@vuepress/client'
+ - less
+ - lightningcss
+ - sass
+ - sass-loader
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - ts-node
+ - typescript
+ - vue
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ yaml@2.4.0: {}
diff --git a/docs/src/docgen-md.own b/docs/src/docgen-md.own
new file mode 100644
index 00000000..53e61abe
--- /dev/null
+++ b/docs/src/docgen-md.own
@@ -0,0 +1,200 @@
+use std, types, files, json, yaml, functional
+
+INPUT_PATH_FMT = "./modules/%s.yml"
+OUTPUT_DIR_FMT = "../docs/%s/modules"
+OUTPUT_PATH_FMT = OUTPUT_DIR_FMT + "/%s.md"
+
+LANGS = ["en", "ru"]
+MODULES = [
+ "std",
+ "collections",
+ "date",
+ "downloader",
+ "files",
+ "functional",
+ "http",
+ "okhttp",
+ "java",
+ "math",
+ "ounit",
+ "regex",
+ "robot",
+ "socket",
+ "types",
+ // formats
+ "base64",
+ "json",
+ "yaml",
+ "gzip",
+ "zip"
+
+ // Desktop-only
+ "canvas",
+ "canvasfx",
+ "forms",
+ "jdbc",
+ "server",
+
+ // Android-only
+ "android",
+ "canvas_android",
+ "forms_android",
+ "gps_android",
+ "imageprocessing_android"
+]
+
+messages = {
+ "constants": {"en": "Constants", "ru": "Константы"},
+ "functions": {"en": "Functions", "ru": "Функции"},
+ "types": {"en": "Types", "ru": "Типы"},
+ "example": {"en": "Example", "ru": "Пример"},
+ "since": {"en": "Since", "ru": "Начиная с"},
+ "elements": {"en": " elements", "ru": " элементов"}
+}
+
+// Write modules pages to vuepress config
+modulesPages = jsonencode(map(MODULES, def(m) = m + ".md"))
+f = fopen("../docs/.vuepress/configs/modules.js", "w")
+writeLine(f, "export default " + modulesPages)
+flush(f)
+fclose(f)
+
+// Create output dirs
+for lang : LANGS {
+ mkdirs(sprintf(OUTPUT_DIR_FMT, lang))
+}
+
+for moduleName : MODULES {
+ module = readYml(sprintf(INPUT_PATH_FMT, moduleName))
+ for lang : LANGS {
+ println "" + module.name + " / " + lang
+ file = sprintf(OUTPUT_PATH_FMT, lang, moduleName)
+ f = fopen(file, "w")
+
+ writeHeader(f, module, lang)
+ writeConstants(f, module.constants ?? [], lang)
+ writeFunctions(f, module.functions ?? [], lang, 2);
+ writeTypes(f, module.types ?? [], lang);
+
+ flush(f)
+ fclose(f)
+ }
+}
+
+// -- write
+def writeHeader(f, module, lang) {
+ writeText(f, header(module.name, 1))
+ if length(module.scope ?? "") && (module.scope != "both") {
+ writeText(f, " (" + module.scope + ")")
+ }
+ writeLine(f, "\n")
+ if length(module.since ?? "") {
+ writeSince(f, module.since, lang)
+ }
+ writeDescription(f, module, lang, "\n%s\n")
+}
+
+def writeConstants(f, constants, lang) {
+ if (constants.isEmpty()) return 0
+
+ writeLine(f, "\n\n## " + messages.constants[lang])
+ for info : constants {
+ writeText(f, "\n`%s` : *%s*".sprintf(info.name, info.typeName))
+ writeScope(f, info.scope ?? "")
+ writeText(f, " = ")
+ constValue = getValue(info, "value", lang)
+ if (info.type != MAP && info.type != CLASS) {
+ writeText(f, "`%s`".sprintf(constValue))
+ } else {
+ mapValues = constValue.substring(1, constValue.length - 1).split(", ")
+ if (mapValues.length >= 7) {
+ writeText(f, "\n\n::: details %d %s".sprintf(mapValues.length, messages.elements[lang]));
+ writeText(f, "\n\n```own:no-line-numbers\n{\n ");
+ writeText(f, mapValues.joinToString(",\n "));
+ writeText(f, "\n}\n```");
+ writeText(f, "\n:::");
+ } else {
+ writeText(f, "`%s`".sprintf(constValue));
+ }
+ }
+ writeLine(f, "")
+ writeDescription(f, info, lang, "\n%s\n")
+ }
+
+}
+
+def writeFunctions(f, functions, lang, level = 2) {
+ if (functions.isEmpty()) return 0
+
+ writeLine(f, "\n\n" + header(messages.functions[lang], level))
+ for info : functions {
+ writeText(f, "\n`%s(%s)`".sprintf(info.name, info.args))
+ writeScope(f, info.scope ?? "")
+ if length(info.since ?? "") {
+ writeSince(f, info.since, lang, true)
+ }
+ writeDescription(f, info, lang, " — %s")
+ writeLine(f, "")
+
+ writeExample(f, info, lang)
+ }
+}
+
+def writeTypes(f, types, lang) {
+ if (types.isEmpty()) return 0
+
+ writeLine(f, "\n\n" + header(messages.types[lang]))
+ for info : types {
+ writeText(f, "\n\n" + header("`%s`".sprintf(info.name), 3))
+ writeScope(f, info.scope ?? "")
+ writeDescription(f, info, lang, "%s\n")
+ writeFunctions(f, info.functions ?? [], lang, 4);
+ writeLine(f, "")
+ writeExample(f, info, lang)
+ }
+}
+
+def writeScope(f, scope) = match(scope) {
+ case "android": writeText(f, " ")
+ case "desktop": writeText(f, " ")
+ case _: { }
+}
+
+def writeDescription(f, obj, lang, format = "%s") {
+ str = getValue(obj, "desc", lang)
+ if (str != "") {
+ writeText(f, sprintf(format, str))
+ }
+}
+
+def writeSince(f, version, lang, isInline = false) {
+ if (isInline) {
+ writeText(f, "".sprintf(version))
+ } else {
+ writeText(f, "".sprintf(messages.since[lang], version))
+ }
+}
+
+def writeExample(f, info, lang) {
+ example = getValue(info, "example", lang)
+ if (length(example ?? "")) {
+ writeLine(f, "\n```own")
+ writeLine(f, example)
+ writeLine(f, "```")
+ }
+}
+
+// -- utils
+def getValue(object, key, lang = "en") {
+ newKey = (lang != "en") ? (key + "_" + lang) : key
+ return object[newKey] ?? object[key] ?? ""
+}
+
+def header(text, level = 2) = ("#" * level) + " " + text
+
+def readYml(filename) {
+ f = fopen(filename, "r")
+ s = readText(f)
+ fclose(f)
+ return yamldecode(s)
+}
\ No newline at end of file
diff --git a/docs/src/main/java/com/annimon/ownlang/docs/ModuleInfo.java b/docs/src/main/java/com/annimon/ownlang/docs/ModuleInfo.java
new file mode 100644
index 00000000..d47f0fec
--- /dev/null
+++ b/docs/src/main/java/com/annimon/ownlang/docs/ModuleInfo.java
@@ -0,0 +1,84 @@
+package com.annimon.ownlang.docs;
+
+import com.annimon.ownlang.Version;
+import com.annimon.ownlang.lib.MapValue;
+import com.annimon.ownlang.lib.Types;
+import com.annimon.ownlang.lib.Value;
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class ModuleInfo {
+ private final String name;
+ final List functions;
+ final Map constants;
+ final List types;
+
+ public ModuleInfo(String name) {
+ this.name = name;
+ functions = new ArrayList<>();
+ constants = new HashMap<>();
+ types = new ArrayList<>();
+ }
+
+ public String name() {
+ return name;
+ }
+
+ public List