├── LICENSE ├── README.md └── docs ├── CNAME ├── README.md ├── cover.md ├── index.html └── vendor ├── docsify-themeable ├── theme-simple-dark.css └── theme-simple-dark.css.map ├── docsify └── docsify@4.13.1.min.js └── prismjs ├── prism-bash.min.js ├── prism-ruby.min.js ├── prism-tomorrow.min.css └── prism-yaml.min.js /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 icebaker 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nano Bots 2 | 3 | ![Nano Bot](https://user-images.githubusercontent.com/113217272/237534390-3f0e0dc7-1f92-4490-a12d-bfc9d145cddb.png) 4 | _Image artificially created by Midjourney through a prompt generated by a Nano Bot specialized in Midjourney._ 5 | 6 | **Nano Bots** is an open specification that can be implemented in any programming language. It specifies a configuration file with human-readable instructions for creating small and specialized AI-powered bots that can be effortlessly shared as a single, lightweight file. 7 | 8 | - [Full Specification](https://spec.nbots.io) 9 | - [Implementations](#implementations) 10 | - [Projects](#projects) 11 | - [Example](#example) 12 | 13 | ## Implementations 14 | 15 | Implementations of this specification: 16 | 17 | - [Nano Bots CLI (Ruby)](https://github.com/icebaker/ruby-nano-bots) 18 | 19 | ### Projects 20 | 21 | - [Nano Bots CLI (Ruby)](https://github.com/icebaker/ruby-nano-bots) 22 | - [Nano Bots for Sublime Text](https://github.com/icebaker/sublime-nano-bots) 23 | - [Nano Bots for Visual Studio Code](https://github.com/icebaker/vscode-nano-bots) 24 | - [Nano Bots for Obsidian](https://github.com/icebaker/obsidian-nano-bots) 25 | - [Nano Bots API](https://github.com/icebaker/nano-bots-api) 26 | - [Public API](https://api.nbots.io) 27 | - [Nano Bots Clinic (Live Editor)](https://clinic.nbots.io) 28 | - [Nano Bots Marketplace](https://nbots.io) 29 | 30 | ## Example 31 | 32 | Here's what a Nano Bot _Cartridge_ looks like: 33 | 34 | ```yaml 35 | --- 36 | meta: 37 | symbol: 🤖 38 | name: Nano Bot Name 39 | author: Your Name 40 | version: 1.0.0 41 | license: CC0-1.0 42 | description: A helpful assistant. 43 | 44 | behaviors: 45 | interaction: 46 | directive: You are a helpful assistant. 47 | 48 | provider: 49 | id: openai 50 | credentials: 51 | address: ENV/OPENAI_API_ADDRESS 52 | access-token: ENV/OPENAI_API_KEY 53 | settings: 54 | user: ENV/NANO_BOTS_END_USER 55 | model: gpt-4o 56 | ``` 57 | 58 | Here's what a fully-functional implementation of Nano Bots feels like: 59 | 60 | ```bash 61 | nb - - eval "hello" 62 | # => Hello! How may I assist you today? 63 | 64 | nb to-en-us-translator.yml - eval "Salut, comment ça va?" 65 | # => Hello, how are you doing? 66 | 67 | nb midjourney.yml - eval "happy cyberpunk robot" 68 | # => A cheerful and fun-loving robot is dancing wildly amidst a 69 | # futuristic and lively cityscape. Holographic advertisements 70 | # and vibrant neon colors can be seen in the background. 71 | 72 | nb lisp.yml - eval "(+ 1 2)" 73 | # => 3 74 | 75 | cat article.txt | 76 | nb to-en-us-translator.yml - eval | 77 | nb summarizer.yml - eval 78 | # -> LLM stands for Large Language Model, which refers to an 79 | # artificial intelligence algorithm capable of processing 80 | # and understanding vast amounts of natural language data, 81 | # allowing it to generate human-like responses and perform 82 | # a range of language-related tasks. 83 | ``` 84 | 85 | ```bash 86 | nb - - repl 87 | 88 | nb assistant.yml - repl 89 | ``` 90 | 91 | ```text 92 | 🤖> Hi, how are you doing? 93 | 94 | As an AI language model, I do not experience emotions but I am functioning 95 | well. How can I assist you? 96 | 97 | 🤖> | 98 | ``` 99 | 100 | Nano Bots can also be powered by _Tools_ (Functions): 101 | 102 | ```yaml 103 | --- 104 | tools: 105 | - name: random-number 106 | description: Generates a random number between 1 and 100. 107 | fennel: | 108 | (math.random 1 100) 109 | ``` 110 | 111 | ``` 112 | 🤖> please generate a random number 113 | 114 | random-number {} [yN] y 115 | 116 | random-number {} 117 | 59 118 | 119 | The randomly generated number is 59. 120 | 121 | 🤖> | 122 | ``` 123 | 124 | Check out the full specification for Nano Bots: https://spec.nbots.io 125 | -------------------------------------------------------------------------------- /docs/CNAME: -------------------------------------------------------------------------------- 1 | spec.nbots.io -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Nano Bots 2 | 3 | ![Nano Bot](https://user-images.githubusercontent.com/113217272/237534390-3f0e0dc7-1f92-4490-a12d-bfc9d145cddb.png) 4 | _Image artificially created by Midjourney through a prompt generated by a Nano Bot specialized in Midjourney._ 5 | 6 | **Nano Bots** is an open specification that can be implemented in any programming language. It specifies a configuration file with human-readable instructions for creating small and specialized AI-powered bots that can be effortlessly shared as a single, lightweight file. 7 | 8 | Here's what a Nano Bot _Cartridge_ looks like: 9 | 10 | ```yaml 11 | --- 12 | meta: 13 | symbol: 🤖 14 | name: Nano Bot Name 15 | author: Your Name 16 | version: 1.0.0 17 | license: CC0-1.0 18 | description: A helpful assistant. 19 | 20 | behaviors: 21 | interaction: 22 | directive: You are a helpful assistant. 23 | 24 | provider: 25 | id: openai 26 | credentials: 27 | address: ENV/OPENAI_API_ADDRESS 28 | access-token: ENV/OPENAI_API_KEY 29 | settings: 30 | user: ENV/NANO_BOTS_END_USER 31 | model: gpt-4o 32 | ``` 33 | 34 | Here's what a fully-functional implementation of Nano Bots feels like: 35 | 36 | ```bash 37 | nb - - eval "hello" 38 | # => Hello! How may I assist you today? 39 | 40 | nb to-en-us-translator.yml - eval "Salut, comment ça va?" 41 | # => Hello, how are you doing? 42 | 43 | nb midjourney.yml - eval "happy cyberpunk robot" 44 | # => A cheerful and fun-loving robot is dancing wildly amidst a 45 | # futuristic and lively cityscape. Holographic advertisements 46 | # and vibrant neon colors can be seen in the background. 47 | 48 | nb lisp.yml - eval "(+ 1 2)" 49 | # => 3 50 | 51 | cat article.txt | 52 | nb to-en-us-translator.yml - eval | 53 | nb summarizer.yml - eval 54 | # -> LLM stands for Large Language Model, which refers to an 55 | # artificial intelligence algorithm capable of processing 56 | # and understanding vast amounts of natural language data, 57 | # allowing it to generate human-like responses and perform 58 | # a range of language-related tasks. 59 | ``` 60 | 61 | ```bash 62 | nb - - repl 63 | 64 | nb assistant.yml - repl 65 | ``` 66 | 67 | ```text 68 | 🤖> Hi, how are you doing? 69 | 70 | As an AI language model, I do not experience emotions but I am functioning 71 | well. How can I assist you? 72 | 73 | 🤖> | 74 | ``` 75 | 76 | ## Rationale 77 | 78 | While Artificial Intelligence and Large Language Models continue to evolve with increasingly larger and more complex projects emerging, Nano Bots takes a different approach. It focuses on creating smaller, specialized bots inspired by the [Unix philosophy](https://en.wikipedia.org/wiki/Unix_philosophy), which emphasizes simplicity, modularity, and composability in software design: 79 | 80 | - Simplicity: Each Nano Bot focuses on a single task or domain, resulting in more efficient and manageable bots. 81 | 82 | - Modularity: Nano Bots are designed as independent and self-contained modules, each responsible for a specific functionality. This allows for easier development, testing, and maintenance. 83 | 84 | - Composability: Inspired by the [Unix pipeline](https://en.wikipedia.org/wiki/Pipeline_(Unix)), Nano Bots can be combined and composed to create more complex AI workflows, allowing users to tailor AI solutions to their needs without relying on monolithic projects. 85 | 86 | ## Definition 87 | 88 | A **Nano Bot** is a cohesive combination of a `cartridge` [YAML](https://yaml.org) file, an `implementation`, and a `provider`. 89 | 90 | The `cartridge` YAML file contains human-readable data that outlines the bot's goals, expected behaviors, and settings for authentication and provider utilization. 91 | 92 | The `implementation` processes the YAML _cartridge_ file, comprehending its instructions, and interacts with the `provider`'s AI Service to enable the bot to perform the expected behavior. 93 | 94 | Together, these components create a fully functional **Nano Bot**: 95 | 96 | ```text 97 | Nano Bot = (cartridge.yml + implementation + provider) 98 | ``` 99 | 100 | ## Implementations 101 | 102 | Implementations of this specification: 103 | 104 | - [Nano Bots CLI (Ruby)](https://github.com/icebaker/ruby-nano-bots) 105 | 106 | ### Projects 107 | 108 | - [Nano Bots CLI (Ruby)](https://github.com/icebaker/ruby-nano-bots) 109 | - [Nano Bots for Sublime Text](https://github.com/icebaker/sublime-nano-bots) 110 | - [Nano Bots for Visual Studio Code](https://github.com/icebaker/vscode-nano-bots) 111 | - [Nano Bots for Obsidian](https://github.com/icebaker/obsidian-nano-bots) 112 | - [Nano Bots API](https://github.com/icebaker/nano-bots-api) 113 | - [Public API](https://api.nbots.io) 114 | - [Nano Bots Clinic (Live Editor)](https://clinic.nbots.io) 115 | - [Nano Bots Marketplace](https://nbots.io) 116 | 117 | # Cartridges 118 | 119 | ![Cartridges](https://user-images.githubusercontent.com/113217272/237534411-61cd7610-5a8c-4294-8840-559a1c58c603.png) 120 | _Image artificially created by Midjourney through a prompt generated by a Nano Bot specialized in Midjourney._ 121 | 122 | A cartridge (inspired by _[Game ROM Cartridges](https://en.wikipedia.org/wiki/ROM_cartridge)_) should contain all the information required for a Nano Bot to be functional in any implementation of this specification. 123 | 124 | Here is a minimal sample of a cartridge [YAML](https://yaml.org) file: 125 | 126 | ```yaml 127 | --- 128 | meta: 129 | symbol: 🤖 130 | name: Nano Bot Name 131 | author: Your Name 132 | version: 1.0.0 133 | license: CC0-1.0 134 | description: A helpful assistant. 135 | 136 | behaviors: 137 | interaction: 138 | directive: You are a helpful assistant. 139 | 140 | provider: 141 | id: openai 142 | credentials: 143 | address: ENV/OPENAI_API_ADDRESS 144 | access-token: ENV/OPENAI_API_KEY 145 | settings: 146 | user: ENV/NANO_BOTS_END_USER 147 | model: gpt-4o 148 | ``` 149 | 150 | ## Meta 151 | 152 | The `meta:` section provides basic information about the Cartridge. 153 | 154 | ```yaml 155 | --- 156 | meta: 157 | symbol: 🤖 158 | name: Nano Bot Name 159 | author: Your Name 160 | version: 1.0.0 161 | license: CC0-1.0 162 | description: A helpful assistant. 163 | ``` 164 | 165 | `symbol:` is a single [Unicode emoji character](https://home.unicode.org/emoji/about-emoji/). 166 | 167 | `name:` and `author:` are single-line text values encouraged to be short. 168 | 169 | `version:` must follow [Semantic Versioning 2.0.0](https://semver.org). 170 | 171 | `license:` must comply with the [SPDX Identifier](https://spdx.dev/ids/). 172 | 173 | `description:` is a brief text that details what to expect from the Nano Bot, encouraged to be concise. 174 | 175 | ### License 176 | 177 | The classification of _prompts_ for Large Language Models as code, art, or intellectual property, as well as their applicability to licensing, intellectual property rights, copyright, or patenting, remain subjects of ongoing and complex debate without a clear answer or definitive understanding at present. 178 | 179 | When Nano Bots expand prompt writing into a more detailed scheme and add small pieces of code like [adapters](?id=adapters), the debate becomes even trickier and blurrier. 180 | 181 | Due to the complexities of this debate, we recommend that authors publish their creations under licenses. 182 | In doubt, in the spirit of openness, sharing, and open source, we recommend the license [CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/) wich enables commercial exploration of the licensed works and the creation of derivative works without copyleft. However, any [SPDX-known license](https://spdx.org/licenses/) may be chosen. 183 | 184 | Please note that we are uncertain if this approach is practical or enforceable, so it should not be considered a guarantee of licensing but rather a statement of your intention. 185 | 186 | ## Behaviors 187 | 188 | The `behaviors:` section provides information to influence the expected behavior of the bot. There are three types of concepts that can influence a behavior: 189 | 190 | 191 | - `directive` communicates about how the bot should behave and aligns with the concept of a rule or guideline. 192 | - `backdrop` sets the stage and provides contextual information to help the bot understand the situation and respond accordingly. 193 | - `instruction` implies a direct command about what the bot should do next, it represents a specific action that the bot is expected to perform. 194 | 195 | Sample of a behaviors section: 196 | 197 | ```yaml 198 | --- 199 | behaviors: 200 | interaction: 201 | directive: You are a helpful assistant. 202 | backdrop: | 203 | The Moon is Earth's natural satellite, orbiting our planet. 204 | The user might use the term "Selene" when referring to the Moon. 205 | boot: 206 | directive: You are a helpful assistant. 207 | instruction: Provide a welcome message. 208 | ``` 209 | 210 | - `interaction:` is used when users directly interact with the Nano Bot through _REPL_ or _Eval_. 211 | - `boot:` is used when the Nano Bot starts in interfaces that support an initial boot message, like _REPL_. 212 | 213 | ### Directive 214 | 215 | ```yaml 216 | --- 217 | behaviors: 218 | interaction: 219 | directive: You are a helpful assistant. 220 | ``` 221 | 222 | A `directive` serves as a guideline for how the bot is expected to behave, also known as _system messages_. Some non-exhaustive examples of directives include: 223 | 224 | ```text 225 | You are a helpful assistant. 226 | ``` 227 | 228 | ```text 229 | You are an AI assistant that responds strictly in JSON format for all answers. 230 | ``` 231 | 232 | ```text 233 | You are a helpful assistant that specializes in providing information about historical events. 234 | ``` 235 | 236 | ```text 237 | You are a programming tutor, helping users learn and troubleshoot code in various programming languages. 238 | ``` 239 | 240 | ```text 241 | You are an AI personality emulator that responds to all questions in the style of Shakespeare. 242 | ``` 243 | 244 | ### Backdrop 245 | 246 | ```yaml 247 | --- 248 | behaviors: 249 | interaction: 250 | backdrop: | 251 | The Moon is Earth's natural satellite, orbiting our planet. 252 | The user might use the term "Selene" when referring to the Moon. 253 | ``` 254 | 255 | Backdrop provides contextual information to help the bot understand the situation and respond appropriately. This may involve sharing examples of expected responses, supplying information the bot needs to learn before answering, among other strategies. 256 | 257 | ### Instruction 258 | 259 | ```yaml 260 | --- 261 | behaviors: 262 | boot: 263 | instruction: Provide a welcome message. 264 | ``` 265 | 266 | An `instruction` is a clear and concise directive given to the bot, intended to guide it in performing a particular action or task. 267 | 268 | ## Safety 269 | 270 | The `safety:` section provides safety configurations: 271 | 272 | ```yaml 273 | --- 274 | safety: 275 | functions: 276 | sandboxed: true 277 | tools: 278 | confirmable: true 279 | ``` 280 | 281 | ### Functions 282 | 283 | The key `sandboxed:` within `functions:` defines that any function executed by the Nano Bot, whether it's an _adapter_ or a _tool_, should be _sandboxed_. This implies that it is expected to have limited functionality and operate within an isolated environment. Consequently, it should not be capable of performing actions such as accessing the internet, manipulating disk files, or accessing the user's computer operating system and environment. When set to `false`, functions may potentially have unrestricted access to all of these capabilities. 284 | 285 | ```yaml 286 | --- 287 | safety: 288 | functions: 289 | sandboxed: true 290 | ``` 291 | 292 | ### Tools 293 | 294 | The key `confirmable:` within `tools:` specifies that any tool (function) execution request that the Nano Bot wants to run should not be executed until the user confirms that they allow the function to be executed. When set to `false`, the Nano Bot should freely run any available tool without confirmation. 295 | 296 | ```yaml 297 | --- 298 | safety: 299 | tools: 300 | confirmable: true 301 | ``` 302 | 303 | ## Interfaces 304 | 305 | Implementations should support two possible interaction interfaces: REPL and Eval. 306 | 307 | You can customize both the _input_ and _output_ with prefixes, suffixes, colors, and adapters for all interfaces. Additionally, the feedback loop involved in the execution of tools (functions) can be customized. 308 | 309 | ```yaml 310 | --- 311 | interfaces: 312 | input: 313 | prefix: "\n" 314 | suffix: "\n" 315 | adapter: 316 | fennel: | 317 | (.. "```" content "```") 318 | lua: | 319 | return "```" .. content .. "```" 320 | output: 321 | stream: true 322 | prefix: "\n" 323 | suffix: "\n" 324 | color: cyan 325 | adapter: 326 | fennel: | 327 | (.. "```" content "```") 328 | lua: | 329 | return "```" .. content .. "```" 330 | tools: 331 | confirming: 332 | yeses: ['y', 'yes'] 333 | default: 'n' 334 | prefix: "\n" 335 | suffix: " [yN] > " 336 | color: orangered 337 | adapter: 338 | fennel: | 339 | (.. name " | " parameters-as-json) 340 | lua: | 341 | return name .. " | " .. parameters_as_json 342 | executing: 343 | feedback: true 344 | prefix: "\n" 345 | suffix: "\n" 346 | color: olive 347 | adapter: 348 | fennel: | 349 | (.. name " | " parameters-as-json) 350 | lua: | 351 | return name .. " | " .. parameters_as_json 352 | responding: 353 | feedback: true 354 | color: aqua 355 | prefix: "\n" 356 | suffix: "\n\n" 357 | adapter: 358 | fennel: | 359 | (.. name " | " parameters-as-json "\n" output) 360 | lua: | 361 | return name .. " | " .. parameters_as_json .. "\n" .. output 362 | ``` 363 | 364 | ### REPL 365 | 366 | ```yaml 367 | --- 368 | interfaces: 369 | repl: 370 | input: 371 | prefix: "\n" 372 | suffix: "\n" 373 | adapter: 374 | fennel: | 375 | (.. "```" content "```") 376 | lua: | 377 | return "```" .. content .. "```" 378 | output: 379 | stream: true 380 | prefix: "\n" 381 | suffix: "\n" 382 | color: aqua 383 | adapter: 384 | fennel: | 385 | (.. "```" content "```") 386 | lua: | 387 | return "```" .. content .. "```" 388 | prompt: 389 | - text: '🤖' 390 | - text: '> ' 391 | tools: 392 | 393 | ``` 394 | 395 | A Read-Eval-Print Loop (REPL) is a streamlined interactive programming environment that allows users to input individual commands, processes them, and returns the results to the user in real-time. 396 | 397 | An implementation may opt to build its REPL from scratch or leverage existing technologies such as [nREPL](https://github.com/nrepl/nrepl), [Pry](https://github.com/pry/pry), [SLIME](https://slime.common-lisp.dev), [IPython](https://github.com/ipython/ipython), [LSP](https://microsoft.github.io/language-server-protocol/), [Jupyter Notebook](https://github.com/jupyter/notebook), etc. 398 | 399 | An implementation would likely provide access to the REPL as follows: 400 | ```bash 401 | nb assistant.yml - repl 402 | ``` 403 | 404 | This is an example of a functioning REPL based on the following YAML fragment: 405 | 406 | ```yaml 407 | --- 408 | interfaces: 409 | repl: 410 | output: 411 | prefix: "\n" 412 | suffix: "\n" 413 | prompt: 414 | - text: '🤖' 415 | - text: '> ' 416 | ``` 417 | 418 | ```text 419 | 🤖> Hi, how are you doing? 420 | 421 | As an AI language model, I do not experience emotions but I am functioning 422 | well. How can I assist you? 423 | 424 | 🤖> I like the color pink. 425 | 426 | That's great to hear! Is there anything related to the color pink that you 427 | would like to know or need assistance with? 428 | 429 | 🤖> What color do I like? 430 | 431 | Based on your previous statement, you mentioned that you like the color 432 | pink. So, it can be assumed that you like the color pink. Is there 433 | anything related to the color pink you need help with? 434 | 435 | 🤖> | 436 | ``` 437 | 438 | #### Boot 439 | 440 | If specified in the cartridge YAML, a REPL should display a boot message: 441 | 442 | ```yaml 443 | --- 444 | behaviors: 445 | boot: 446 | directive: You are a helpful assistant. 447 | instruction: Provide a welcome message. 448 | ``` 449 | 450 | ```text 451 | Hello and welcome! As your virtual assistant, I am here to assist you with 452 | any questions or tasks you may have. Please don't hesitate to ask me anything. 453 | I am here to make your life easier and more efficient. 454 | 455 | 🤖> | 456 | ``` 457 | 458 | #### Prompt 459 | 460 | You can personalize your prompt using an array of texts, with optional color formatting available for each element: 461 | 462 | ```yaml 463 | --- 464 | interfaces: 465 | repl: 466 | prompt: 467 | - text: 💀 468 | - text: '➜ ' 469 | color: deeppink 470 | ``` 471 | 472 | You have the option to utilize [ANSI colors](https://github.com/sickill/rainbow#ansi-colors) such as `blue`, `magenta`, and so on, or [X11 colors](https://github.com/sickill/rainbow#x11-colors) such as `aquamarine`, `deeppink`, and so forth. 473 | 474 | The previous fragment would result in the following prompt: 475 | 476 | 477 | > 💀 | 478 | 479 | ### Eval 480 | 481 | ```yaml 482 | --- 483 | interfaces: 484 | eval: 485 | input: 486 | prefix: "\n" 487 | suffix: "\n" 488 | adapter: 489 | fennel: | 490 | (.. "```" content "```") 491 | lua: | 492 | return "```" .. content .. "```" 493 | output: 494 | stream: true 495 | prefix: "\n" 496 | suffix: "\n" 497 | color: olive 498 | adapter: 499 | fennel: | 500 | (.. "```" content "```") 501 | lua: | 502 | return "```" .. content .. "```" 503 | tools: 504 | 505 | ``` 506 | 507 | Eval (short for evaluation) refers to single-turn executions of the Nano Bot that, when given an input, produce an output. 508 | 509 | An implementation would likely provide access to eval as follows: 510 | ```bash 511 | nb assistant.yml - eval "What is the distance to the Moon?" 512 | ``` 513 | 514 | ```text 515 | The average distance between the Earth and the Moon 516 | is about 238,855 miles (384,400 kilometers). 517 | ``` 518 | 519 | Evaluation executions do not provide boot messages. 520 | 521 | Implementations should also be capable of receiving input from [standard streams](https://en.wikipedia.org/wiki/Standard_streams), allowing execution with [pipe operators](https://en.wikipedia.org/wiki/Pipeline_(Unix)): 522 | 523 | ```bash 524 | echo "What is the distance to the Moon?" | nb assistant.yml - eval 525 | ``` 526 | 527 | ```text 528 | The average distance from the Earth to the Moon 529 | is about 238,855 miles (384,400 kilometers). 530 | ``` 531 | 532 | ### Tools (Functions) 533 | 534 | This section allows customization of the feedback loop involved in executing tools (functions). 535 | 536 | ```yaml 537 | --- 538 | interfaces: 539 | tools: 540 | confirming: 541 | executing: 542 | responding: 543 | 544 | ``` 545 | 546 | #### Confirming 547 | 548 | When _tools (functions)_ are defined as _confirmable_ in the [safety](?id=safety) section, we can customize how the user is prompted to confirm that the Nano Bot is allowed to execute them. 549 | 550 | The key `yeses` defines answers that are considered as affirmative confirmations by the user, thereby allowing the Nano Bot to execute the tool (function). Implementations should treat answers as case-insensitive. This means that if "yes" is included in `yeses`, then "Yes," "YES," and any other case variations of "yes" should also be recognized as confirmation. Anything that does not match the `yeses` values should be interpreted as the user not confirming/allowing the execution. 551 | 552 | The `default` key defines what should be considered the default answer for when the user provides an empty answer, such as just pressing _Enter_ without typing anything. 553 | 554 | The keys `prefix`, `suffix`, `color`, and `adapter` can be used to customize the output when prompting the user for an answer. 555 | 556 | The `adapter:` environment and available values are described in the section [Adapters](?id=adapters). 557 | 558 | ```yaml 559 | --- 560 | interfaces: 561 | tools: 562 | confirming: 563 | yeses: ['y', 'yes'] 564 | default: 'n' 565 | prefix: "\n" 566 | suffix: " [yN] > " 567 | color: orangered 568 | adapter: 569 | fennel: | 570 | (.. name " | " parameters-as-json) 571 | lua: | 572 | return name .. " | " .. parameters_as_json 573 | ``` 574 | 575 | #### Executing 576 | 577 | The key `feedback` determines whether interfaces should provide feedback when the Nano Bot **starts** the execution of a tool (function). When set to `false`, no feedback should be provided, and the other keys should be ignored. 578 | 579 | The keys `prefix`, `suffix`, `color`, and `adapter` can be used to customize the output when informing the user about the start of execution. 580 | 581 | The `adapter:` environment and available values are described in the section [Adapters](?id=adapters). 582 | 583 | ```yaml 584 | --- 585 | interfaces: 586 | tools: 587 | executing: 588 | feedback: false 589 | prefix: "\n" 590 | suffix: "\n" 591 | color: olive 592 | adapter: 593 | fennel: | 594 | (.. name " | " parameters-as-json) 595 | lua: | 596 | return name .. " | " .. parameters_as_json 597 | ``` 598 | 599 | #### Responding 600 | 601 | The key `feedback:` determines whether interfaces should provide feedback when the Nano Bot **completes** the execution of a tool (function). When set to `false`, no feedback should be provided, and the other keys should be ignored. 602 | 603 | The keys `prefix`, `suffix`, `color`, and `adapter` can be used to customize the output when informing the user about a received response from a tool (function) execution completion. 604 | 605 | The `adapter:` environment and available values are described in the section [Adapters](?id=adapters). 606 | 607 | ```yaml 608 | --- 609 | interfaces: 610 | tools: 611 | responding: 612 | feedback: true 613 | color: aqua 614 | prefix: "\n" 615 | suffix: "\n\n" 616 | adapter: 617 | fennel: | 618 | (.. name " | " parameters-as-json "\n" output) 619 | lua: | 620 | return name .. " | " .. parameters_as_json .. "\n" .. output 621 | ``` 622 | 623 | ### Adapters 624 | 625 | Adapters are simple and small pieces of code that can manipulate inputs and outputs. Implementations should support two languages for adapters: [Lua](https://www.lua.org/about.html) and [Fennel](https://fennel-lang.org). 626 | 627 | These languages were chosen for their proven portability, widespread availability, lightweight nature, and ease of embedding. They are small, simple, fast, and support multiple platforms across various operating systems. Additionally, they can be seamlessly integrated into numerous other programming languages. 628 | 629 | ```yaml 630 | --- 631 | adapter: 632 | fennel: | 633 | (.. "```" content "```") 634 | ``` 635 | 636 | ```yaml 637 | --- 638 | adapter: 639 | lua: | 640 | return "```" .. content .. "```" 641 | ``` 642 | 643 | An important note on the use of adapters: They should return a value that the implementation can use to properly print on appropriate interfaces. This means that actions such as calling _print_ functions should not occur inside adapters. 644 | 645 | The values available within each adapter enviroment will depend on the context of the adapter. 646 | 647 | #### REPL and Eval 648 | 649 | REPL and Eval inside `interfaces:` have `input:` and `output:` keys with support for adapters. In this context, they will have a `content` value available that holds either the user's input or the Nano Bot's output: 650 | 651 | ```yaml 652 | --- 653 | adapter: 654 | fennel: | 655 | (.. "```" content "```") 656 | lua: | 657 | return "```" .. content .. "```" 658 | ``` 659 | 660 | Output adapters are only activated when the stream functionality is not enabled. 661 | 662 | Regarding input, the prefix, suffix, and any modifications made by the adapter are sent to the bot. If the interaction is not stateless, these elements are also preserved in the state history. 663 | 664 | In contrast, for outputs, any changes made by the adapter, prefix, and suffix aren't saved or used in later messages to the bot. These changes are used only for displaying purposes or for pipeline operations. 665 | 666 | #### Tools (Functions) 667 | 668 | All adapters related to `tools:` will have access to the following values: 669 | 670 | | Name | Value | 671 | |---------------------:|-----------------------------------------------------| 672 | | `id` | Identification of the specific execution. | 673 | | `name` | The name of the tool. | 674 | | `parameters` | The parameters values for the tool execution. | 675 | | `parameters-as-json` | The parameters values represented as a JSON string. | 676 | | `output` | The resulting response from the execution. | 677 | 678 | ```yaml 679 | --- 680 | adapter: 681 | fennel: | 682 | (.. id " | " name " | " parameters-as-json "\n" output) 683 | lua: | 684 | return id .. " | " name .. " | " .. parameters_as_json .. "\n" .. output 685 | ``` 686 | 687 | Note that, following language conventions and syntax, Lua uses `parameters_as_json` instead. 688 | 689 | For simple inspection purposes, the `parameters-as-json` value is available, so there is no need to parse potentially complex nested structures just to inspect the parameters. However, the original parameters remain accessible: 690 | 691 | ```yaml 692 | --- 693 | adapter: 694 | fennel: | 695 | (fenne.view parameters) 696 | ``` 697 | 698 | ## Tools (Functions) 699 | 700 | Tools (Functions) are powerful means to extend the capabilities of Nano Bots. Just as humans can amplify their capabilities with access to tools such as a wrench, a calculator, or internet access, a Nano Bot can enhance its capabilities when equipped with appropriate tools. 701 | 702 | The definition of a tool includes a piece of code that embodies the function behind the tool and a specification that enables providers to become aware of the tool's availability and to reason about when and how to properly request its execution. 703 | 704 | The tools' source code is written in [Lua](https://www.lua.org/about.html) or [Fennel](https://fennel-lang.org), chosen for their proven portability, widespread availability, lightweight nature, and ease of embedding. They are small, simple, fast, and support multiple platforms across various operating systems. Additionally, they can be seamlessly integrated into numerous other programming languages. 705 | 706 | As an example, this tool provides a random number generator for the Nano Bot: 707 | 708 | ```yaml 709 | --- 710 | tools: 711 | - name: random-number 712 | description: Generates a random number between 1 and 100. 713 | fennel: | 714 | (math.random 1 100) 715 | ``` 716 | 717 | `name:` is the identifier name for the function behind the tool. The `description:` helps the Nano Bot understand the purpose of the tool so it can reason about when to properly use it. `fennel:` provides the source code for the function. Like adapters, you could use `lua:` instead: 718 | 719 | ```yaml 720 | --- 721 | tools: 722 | - name: random-number 723 | description: Generates a random number between 1 and 100. 724 | lua: | 725 | return math.random(1, 100) 726 | ``` 727 | 728 | This is what a REPL execution of a Nano Bot powered by this tool would look like: 729 | ```text 730 | 🤖> generate a random number 731 | 732 | random-number {} [yN] y 733 | 734 | random-number {} 735 | 39 736 | 737 | The random number generated is 39. 738 | ``` 739 | 740 | ### Parameters 741 | 742 | A tool may expect parameters. Parameters are described following the [JSON Schema](https://json-schema.org) specification: 743 | 744 | ```yaml 745 | --- 746 | tools: 747 | - name: random-number 748 | description: Generates a random number within a given range. 749 | parameters: 750 | type: object 751 | properties: 752 | from: 753 | type: integer 754 | description: The minimum expected number for random generation. 755 | to: 756 | type: integer 757 | description: The maximum expected number for random generation. 758 | required: 759 | - from 760 | - to 761 | fennel: | 762 | (let [{ : from : to } parameters] 763 | (math.random from to)) 764 | ``` 765 | 766 | Note that the function now has access to `parameters`. The same should be true for Lua source code: 767 | 768 | ```yaml 769 | --- 770 | tools: 771 | - name: random-number 772 | description: Generates a random number within a given range. 773 | parameters: 774 | type: object 775 | properties: 776 | from: 777 | type: integer 778 | description: The minimum expected number for random generation. 779 | to: 780 | type: integer 781 | description: The maximum expected number for random generation. 782 | required: 783 | - from 784 | - to 785 | lua: | 786 | return math.random(parameters['from'], parameters['to']) 787 | ``` 788 | 789 | This is what a REPL execution of a Nano Bot powered by this tool would look like: 790 | 791 | ```text 792 | 🤖> generate a random number between 15 and 25 793 | 794 | random-number {"from":15,"to":25} [yN] y 795 | 796 | random-number {"from":15,"to":25} 797 | 21 798 | 799 | The random number generated between 15 and 25 is 21. 800 | ``` 801 | 802 | ### Safety 803 | 804 | By default, executions are [sandboxed](?id=functions) and [confirmable](?id=tools), meaning they will not have access to potentially dangerous operations such as accessing the user's computer operating system, executing commands with access to disk files, or performing requests to the internet, and they will not be executed without confirmation from the user. 805 | 806 | You can change this behavior by [disabling the safety configurations](?id=safety). A non-sandboxed tool may have powers, such as the ability to access information from the users' computers. 807 | 808 | ```yaml 809 | --- 810 | tools: 811 | - name: what-time-is-it 812 | description: Returns the current date and time. 813 | fennel: | 814 | (os.date) 815 | ``` 816 | 817 | This level of access would allow aslo the execution of [system calls](https://en.wikipedia.org/wiki/System_call), meaning that the source could hipotetically does anything it wants in the operation system. The are two words of cautions here: 818 | 819 | #### Predictability 820 | 821 | As execution requests for the tools are generated by the Nano Bot through providers, their outcomes are unpredictable. This means that without being sandboxed and having a function that offers this possibility, they may perform unexpected [system calls](https://en.wikipedia.org/wiki/System_call), which could be dangerous, especially without [confirmability](?id=tools). 822 | 823 | #### Portability 824 | 825 | Without being sandboxed and having a function that offers the possibility of _system calls_, you may achieve unlimited powers regarding what a Nano Bot can do. However, you may start to go against the Nano Bot principle of portability, where: 826 | 827 | > _A Cartridge YAML file should ultimately be the sole and only necessary information for the bot to operate as expected._ 828 | 829 | If you create a Nano Bot that performs a system call to locally installed software, which in turn depends on a local database, you may end up creating a non-portable Nano Bot. Such a Nano Bot could not be used by another user who only has the Cartridge YAML file without proper additional instructions and an extended setup process. 830 | 831 | ## Providers 832 | 833 | Nano Bots should be **provider-agnostic**, which means that the same Nano Bot should be able to run on different providers. 834 | 835 | Examples of popular providers include: 836 | 837 | - [01.AI Yi](https://01.ai) 838 | - [Anthropic Claude](https://www.anthropic.com) 839 | - [Cohere Command](https://cohere.com) 840 | - [Google Gemini](https://deepmind.google/technologies/gemini) 841 | - [LMSYS Vicuna](https://github.com/lm-sys/FastChat) 842 | - [Maritaca AI Sabiá](https://www.maritaca.ai) 843 | - [Meta Llama](https://ai.meta.com/llama/) 844 | - [Mistral AI](https://mistral.ai) 845 | - [Ollama](https://ollama.ai) 846 | - [Open AI ChatGPT](https://openai.com/chatgpt) 847 | - [WizardLM](https://wizardlm.github.io) 848 | 849 | The `provider:` section of the Cartridge must specify the `id` of the provider, followed by a `credentials` and a `settings` section that includes appropriate information for allowing the Nano Bot to communicate successfully with the provider while adhering to the provider's expected API schema. An extra `options` key may be provided if the provider requires options unrelated to its expected API schema. 850 | 851 | Minimal sample of a provider section: 852 | 853 | ```yaml 854 | --- 855 | provider: 856 | id: openai 857 | credentials: 858 | address: ENV/OPENAI_API_ADDRESS 859 | access-token: ENV/OPENAI_API_KEY 860 | settings: 861 | user: ENV/NANO_BOTS_END_USER 862 | model: gpt-4o 863 | ``` 864 | 865 | ### Credentials 866 | 867 | Although it is possible to set credentials directly in the cartridge YAML, it is important to consider that cartridges may be widely shared, and exposing your credentials poses a security risk. Therefore, it is recommended to use environment variables for credentials. 868 | 869 | Implementations should apply the regular expression `^ENV.` and replace data with prefixes like `ENV/` or `ENV-` with the corresponding environment variable value. For example, `ENV/OPENAI_API_KEY` should load the environment variable `OPENAI_API_KEY`. 870 | 871 | ### Anthropic Claude 872 | 873 | API Documentation: https://docs.anthropic.com/en/api/messages 874 | 875 | ```yaml 876 | --- 877 | provider: 878 | id: anthropic 879 | credentials: 880 | api-key: ENV/ANTHROPIC_API_KEY 881 | anthropic-version: '2023-06-01' 882 | settings: 883 | model: claude-3-5-sonnet-20240620 884 | stream: true 885 | max_tokens: 4096 886 | temperature: 1.0 887 | top_k: null 888 | top_p: null 889 | tool_choice: 890 | type: auto 891 | name: null 892 | metadata: 893 | user_id: ENV/NANO_BOTS_END_USER 894 | stop_sequences: 895 | - . 896 | ``` 897 | 898 | ### Cohere Command 899 | 900 | API Documentation: https://docs.cohere.com/reference/chat 901 | 902 | ```yaml 903 | --- 904 | provider: 905 | id: cohere 906 | credentials: 907 | address: ENV/COHERE_API_ADDRESS 908 | api-key: ENV/COHERE_API_KEY 909 | settings: 910 | model: command-r-plus 911 | stream: true 912 | prompt_truncation: 'OFF' 913 | connectors: 914 | - id: web-search 915 | search_queries_only: false 916 | documents: 917 | - title: Tall penguins 918 | text: Emperor penguins are the tallest. 919 | citation_quality: accurate 920 | temperature: 0.3 921 | max_tokens: null 922 | max_input_tokens: null 923 | k: 0 924 | p: 0.75 925 | seed: null 926 | stop_sequences: 927 | - . 928 | frequency_penalty: 0.0 929 | presence_penalty: 0.0 930 | force_single_step: false 931 | ``` 932 | 933 | ### Google Gemini 934 | 935 | API Documentation: https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/gemini 936 | 937 | ```yaml 938 | --- 939 | provider: 940 | id: google 941 | credentials: 942 | service: generative-language-api 943 | api-key: ENV/GOOGLE_API_KEY 944 | credentials: 945 | service: vertex-ai-api 946 | region: ENV/GOOGLE_REGION 947 | credentials: 948 | service: vertex-ai-api 949 | region: ENV/GOOGLE_REGION 950 | file-path: ENV/GOOGLE_CREDENTIALS_FILE_PATH 951 | credentials: 952 | service: vertex-ai-api 953 | region: ENV/GOOGLE_REGION 954 | file_contents: ENV/GOOGLE_CREDENTIALS_FILE_CONTENTS 955 | credentials: 956 | service: vertex-ai-api 957 | region: ENV/GOOGLE_REGION 958 | file-path: ENV/GOOGLE_CREDENTIALS_FILE_PATH 959 | project-id: ENV/GOOGLE_PROJECT_ID 960 | options: 961 | model: gemini-1.5-pro 962 | stream: true 963 | settings: 964 | safetySettings: 965 | - category: HARM_CATEGORY_DANGEROUS_CONTENT 966 | threshold: BLOCK_NONE 967 | generationConfig: 968 | temperature: 0.9 969 | maxOutputTokens: null 970 | candidateCount: 1 971 | presencePenalty: null 972 | frequencyPenalty: null 973 | topK: null 974 | topP: 1.0 975 | stopSequences: 976 | - . 977 | responseMimeType: application/json 978 | responseSchema: 979 | type: object 980 | properties: 981 | name: 982 | type: string 983 | ``` 984 | 985 | ### Maritaca AI Sabiá 986 | 987 | API Documentation: https://chat.maritaca.ai/docs 988 | 989 | ```yaml 990 | --- 991 | provider: 992 | id: maritaca 993 | credentials: 994 | address: ENV/MARITACA_API_ADDRESS 995 | api-key: ENV/MARITACA_API_KEY 996 | settings: 997 | stream: true 998 | model: sabia-2-medium 999 | max_tokens: null 1000 | do_sample: true 1001 | temperature: 0.7 1002 | top_p: 0.95 1003 | repetition_penalty: 1 1004 | num_tokens_per_message: null 1005 | stopping_tokens: 1006 | - . 1007 | 1008 | ``` 1009 | 1010 | ### Mistral AI 1011 | 1012 | API Documentation: https://docs.mistral.ai/api/ 1013 | 1014 | ```yaml 1015 | --- 1016 | provider: 1017 | id: mistral 1018 | credentials: 1019 | address: ENV/MISTRAL_API_ADDRESS 1020 | api-key: ENV/MISTRAL_API_KEY 1021 | settings: 1022 | model: mistral-large 1023 | temperature: 0.7 1024 | top_p: 1 1025 | max_tokens: null 1026 | stream: true 1027 | safe_prompt: false 1028 | random_seed: null 1029 | ``` 1030 | 1031 | ### Ollama 1032 | 1033 | API Documentation: 1034 | - https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-chat-completion 1035 | - https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md#valid-parameters-and-values 1036 | 1037 | ```yaml 1038 | --- 1039 | provider: 1040 | id: ollama 1041 | credentials: 1042 | address: ENV/OLLAMA_API_ADDRESS 1043 | settings: 1044 | model: llama3 1045 | format: json 1046 | raw: false 1047 | options: 1048 | num_keep: 5 1049 | seed: 42 1050 | num_predict: 100 1051 | top_k: 20 1052 | top_p: 0.9 1053 | tfs_z: 0.5 1054 | typical_p: 0.7 1055 | repeat_last_n: 33 1056 | temperature: 0.8 1057 | repeat_penalty: 1.2 1058 | presence_penalty: 1.5 1059 | frequency_penalty: 1.0 1060 | mirostat: 1 1061 | mirostat_tau: 0.8 1062 | mirostat_eta: 0.6 1063 | penalize_newline: true 1064 | numa: false 1065 | num_ctx: 1024 1066 | num_batch: 2 1067 | num_gpu: 1 1068 | main_gpu: 0 1069 | low_vram: false 1070 | f16_kv: true 1071 | vocab_only: false 1072 | use_mmap: true 1073 | use_mlock: false 1074 | num_thread: 8 1075 | stop: 1076 | - "\n" 1077 | - "user:" 1078 | ``` 1079 | 1080 | ### OpenAI ChatGPT 1081 | 1082 | API Documentation: https://platform.openai.com/docs/api-reference/chat 1083 | 1084 | ```yaml 1085 | --- 1086 | provider: 1087 | id: openai 1088 | credentials: 1089 | address: ENV/OPENAI_API_ADDRESS 1090 | access-token: ENV/OPENAI_API_KEY 1091 | settings: 1092 | user: ENV/NANO_BOTS_END_USER 1093 | model: gpt-4o 1094 | stream: true 1095 | stream_options: 1096 | include_usage: false 1097 | frequency_penalty: 0 1098 | logit_bias: null 1099 | logprobs: false 1100 | top_logprobs: null 1101 | max_tokens: null 1102 | n: 1 1103 | presence_penalty: 0 1104 | response_format: 1105 | type: json_object 1106 | seed: null 1107 | service_tier: null 1108 | stop: 1109 | - . 1110 | temperature: 1 1111 | top_p: 1 1112 | tool_choice: auto 1113 | parallel_tool_calls: true 1114 | ``` 1115 | 1116 | ## Miscellaneous 1117 | 1118 | ```yaml 1119 | --- 1120 | miscellaneous: 1121 | key: value 1122 | ``` 1123 | 1124 | `miscellaneous:` is an optional key that can hold additional data for purposes other than making the Nano Bot functional. This data may include metadata for marketplaces, educational information, and so on. It's important to note that these keys must be not relevant for the Nano Bot's operation and should be deliberately ignored by implementations. 1125 | 1126 | They can contain any information or structure, as shown in the following examples: 1127 | 1128 | ```yaml 1129 | --- 1130 | miscellaneous: 1131 | some-marketplace: 1132 | background-color: blue 1133 | tags: 1134 | - creativity 1135 | - programming 1136 | ``` 1137 | 1138 | ```yaml 1139 | --- 1140 | miscellaneous: 1141 | some-platform: 1142 | technique: summarization 1143 | details: | 1144 | This Nano Bot exemplifies one of the 1145 | common approaches to summarizing content. 1146 | ``` 1147 | 1148 | # Implementations 1149 | 1150 | Nano Bots can be implemented in any programming language. Typically, implementations provide executable binaries capable of interpreting the cartridge YAML file as specified here, correctly interacting with multiple providers, and offering the expected interaction interfaces (_REPL_ and _Eval_). 1151 | 1152 | Here's what a fully-functional implementation of Nano Bots feels like: 1153 | 1154 | ```bash 1155 | nb - - eval "hello" 1156 | # => Hello! How may I assist you today? 1157 | 1158 | nb to-en-us-translator.yml - eval "Salut, comment ça va?" 1159 | # => Hello, how are you doing? 1160 | 1161 | nb midjourney.yml - eval "happy cyberpunk robot" 1162 | # => A cheerful and fun-loving robot is dancing wildly amidst a 1163 | # futuristic and lively cityscape. Holographic advertisements 1164 | # and vibrant neon colors can be seen in the background. 1165 | 1166 | nb lisp.yml - eval "(+ 1 2)" 1167 | # => 3 1168 | 1169 | cat article.txt | 1170 | nb to-en-us-translator.yml - eval | 1171 | nb summarizer.yml - eval 1172 | # -> LLM stands for Large Language Model, which refers to an 1173 | # artificial intelligence algorithm capable of processing 1174 | # and understanding vast amounts of natural language data, 1175 | # allowing it to generate human-like responses and perform 1176 | # a range of language-related tasks. 1177 | ``` 1178 | 1179 | ```bash 1180 | nb - - repl 1181 | 1182 | nb assistant.yml - repl 1183 | ``` 1184 | 1185 | ```text 1186 | 🤖> Hi, how are you doing? 1187 | 1188 | As an AI language model, I do not experience emotions but I am functioning 1189 | well. How can I assist you? 1190 | 1191 | 🤖> | 1192 | ``` 1193 | 1194 | You may name your binary as you wish, with `nb` being just an illustrative example. 1195 | 1196 | ## Cartridges 1197 | 1198 | Cartridges are YML files and should be loaded according to the path specified by the user: 1199 | 1200 | ```bash 1201 | nb assistant.yml - repl 1202 | ``` 1203 | 1204 | This command should attempt to load the `assistant.yml` file. The user may omit the file extension: 1205 | 1206 | ```bash 1207 | nb assistant - repl 1208 | ``` 1209 | 1210 | In this case, the implementation should attempt to load either the `assistant.yml` or `assistant.yaml` file. 1211 | 1212 | If the environment variable `NANO_BOTS_CARTRIDGES_PATH` is defined and the path was not found in the command's working path, the implementation should attempt to load the file from the path specified in the environment variable: 1213 | 1214 | ```bash 1215 | NANO_BOTS_CARTRIDGES_PATH=/home/aqua/cartridges:/home/lime/cartridges 1216 | 1217 | nb assistant - repl 1218 | ``` 1219 | 1220 | Paths that should be attempted to be loaded: 1221 | 1222 | ```text 1223 | /home/aqua/cartridges/assistant.yml 1224 | /home/aqua/cartridges/assistant.yaml 1225 | 1226 | /home/lime/cartridges/assistant.yml 1227 | /home/lime/cartridges/assistant.yaml 1228 | ``` 1229 | 1230 | If no file is found, the implementation should fallback to attempting to load from the default expected cartridges path, adhering to the [XDG specification](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html): 1231 | 1232 | 1233 | ```text 1234 | /home/user/.local/share/nano-bots/cartridges/assistant.yml 1235 | /home/user/.local/share/nano-bots/cartridges/assistant.yaml 1236 | ``` 1237 | 1238 | ### Default 1239 | 1240 | This is the minimum required Cartridge data: 1241 | 1242 | ```yaml 1243 | --- 1244 | meta: 1245 | symbol: 🤖 1246 | name: Nano Bot Name 1247 | author: Your Name 1248 | version: 1.0.0 1249 | license: CC0-1.0 1250 | description: A helpful assistant. 1251 | 1252 | provider: 1253 | id: openai 1254 | credentials: 1255 | address: ENV/OPENAI_API_ADDRESS 1256 | access-token: ENV/OPENAI_API_KEY 1257 | settings: 1258 | user: ENV/NANO_BOTS_END_USER 1259 | model: gpt-4o 1260 | ``` 1261 | 1262 | These are the default values when the following keys are not specified in the Cartridge file: 1263 | 1264 | ```yaml 1265 | --- 1266 | safety: 1267 | functions: 1268 | sandboxed: true 1269 | tools: 1270 | confirmable: true 1271 | 1272 | interfaces: 1273 | repl: 1274 | output: 1275 | stream: true 1276 | prefix: "\n" 1277 | suffix: "\n" 1278 | prompt: 1279 | - text: '🤖' 1280 | - text: '> ' 1281 | eval: 1282 | output: 1283 | stream: true 1284 | suffix: "\n" 1285 | tools: 1286 | confirming: 1287 | suffix: ' [yN] ' 1288 | default: 'n' 1289 | yeses: ['y', 'yes'] 1290 | executing: 1291 | feedback: false 1292 | responding: 1293 | suffix: "\n\n" 1294 | feedback: true 1295 | 1296 | provider: 1297 | options: 1298 | stream: true 1299 | settings: 1300 | stream: true 1301 | ``` 1302 | 1303 | Users may choose not to provide a Cartridge file by using the `-` character: 1304 | 1305 | ```sh 1306 | nb - - repl 1307 | nb - - eval "Hi" 1308 | ``` 1309 | 1310 | Under this circumstance, the implementation should apply the following default Cartridge: 1311 | 1312 | ```yaml 1313 | --- 1314 | meta: 1315 | symbol: 🤖 1316 | name: Unknown 1317 | author: None 1318 | version: 0.0.0 1319 | license: CC0-1.0 1320 | description: Unknown 1321 | 1322 | provider: 1323 | id: openai 1324 | credentials: 1325 | address: ENV/OPENAI_API_ADDRESS 1326 | access-token: ENV/OPENAI_API_KEY 1327 | settings: 1328 | user: ENV/NANO_BOTS_END_USER 1329 | model: gpt-4o 1330 | ``` 1331 | 1332 | ### Full Specification 1333 | 1334 | This example showcases all the possible keys present in a Nano Bot Cartridge YAML file: 1335 | 1336 | ```yaml 1337 | --- 1338 | meta: 1339 | symbol: 🤖 1340 | name: Nano Bot Name 1341 | author: Your Name 1342 | version: 1.0.0 1343 | license: CC0-1.0 1344 | description: A helpful assistant. 1345 | 1346 | behaviors: 1347 | interaction: 1348 | directive: You are a helpful assistant. 1349 | backdrop: | 1350 | The Moon is Earth's natural satellite, orbiting our planet. 1351 | The user might use the term "Selene" when referring to the Moon. 1352 | instruction: Answer the user's questions. 1353 | boot: 1354 | directive: You are a helpful assistant. 1355 | backdrop: | 1356 | This is a good example of a welcome message: 1357 | "Welcome! How may I assist you?" 1358 | instruction: Provide a welcome message. 1359 | 1360 | interfaces: 1361 | input: 1362 | prefix: "\n" 1363 | suffix: "\n" 1364 | adapter: 1365 | fennel: | 1366 | (.. "```" content "```") 1367 | lua: | 1368 | return "```" .. content .. "```" 1369 | output: 1370 | stream: true 1371 | prefix: "\n" 1372 | suffix: "\n" 1373 | color: aqua 1374 | adapter: 1375 | fennel: | 1376 | (.. "```" content "```") 1377 | lua: | 1378 | return "```" .. content .. "```" 1379 | tools: 1380 | confirming: 1381 | yeses: ['y', 'yes'] 1382 | default: 'n' 1383 | prefix: "\n" 1384 | suffix: " [yN] > " 1385 | color: orangered 1386 | adapter: 1387 | fennel: | 1388 | (.. name " | " parameters-as-json) 1389 | lua: | 1390 | return name .. " | " .. parameters_as_json 1391 | executing: 1392 | feedback: true 1393 | prefix: "\n" 1394 | suffix: "\n" 1395 | color: olive 1396 | adapter: 1397 | fennel: | 1398 | (.. name " | " parameters-as-json) 1399 | lua: | 1400 | return name .. " | " .. parameters_as_json 1401 | responding: 1402 | feedback: true 1403 | color: aqua 1404 | prefix: "\n" 1405 | suffix: "\n\n" 1406 | adapter: 1407 | fennel: | 1408 | (.. name " | " parameters-as-json "\n" output) 1409 | lua: | 1410 | return name .. " | " .. parameters_as_json .. "\n" .. output 1411 | repl: 1412 | input: 1413 | prefix: "\n" 1414 | suffix: "\n" 1415 | adapter: 1416 | fennel: | 1417 | (.. "```" content "```") 1418 | lua: | 1419 | return "```" .. content .. "```" 1420 | output: 1421 | stream: true 1422 | prefix: "\n" 1423 | suffix: "\n" 1424 | color: olive 1425 | adapter: 1426 | fennel: | 1427 | (.. "```" content "```") 1428 | lua: | 1429 | return "```" .. content .. "```" 1430 | prompt: 1431 | - text: '🤖' 1432 | - text: '> ' 1433 | color: blue 1434 | tools: 1435 | confirming: 1436 | yeses: ['y', 'yes'] 1437 | default: 'n' 1438 | prefix: "\n" 1439 | suffix: " [yN] > " 1440 | color: orangered 1441 | adapter: 1442 | fennel: | 1443 | (.. name " | " parameters-as-json) 1444 | lua: | 1445 | return name .. " | " .. parameters_as_json 1446 | executing: 1447 | feedback: true 1448 | prefix: "\n" 1449 | suffix: "\n" 1450 | color: olive 1451 | adapter: 1452 | fennel: | 1453 | (.. name " | " parameters-as-json) 1454 | lua: | 1455 | return name .. " | " .. parameters_as_json 1456 | responding: 1457 | feedback: true 1458 | color: aqua 1459 | prefix: "\n" 1460 | suffix: "\n\n" 1461 | adapter: 1462 | fennel: | 1463 | (.. name " | " parameters-as-json "\n" output) 1464 | lua: | 1465 | return name .. " | " .. parameters_as_json .. "\n" .. output 1466 | eval: 1467 | input: 1468 | prefix: "\n" 1469 | suffix: "\n" 1470 | adapter: 1471 | fennel: | 1472 | (.. "```" content "```") 1473 | lua: | 1474 | return "```" .. content .. "```" 1475 | output: 1476 | stream: true 1477 | prefix: "\n" 1478 | suffix: "\n" 1479 | color: magenta 1480 | adapter: 1481 | fennel: | 1482 | (.. "```" content "```") 1483 | lua: | 1484 | return "```" .. content .. "```" 1485 | tools: 1486 | confirming: 1487 | yeses: ['y', 'yes'] 1488 | default: 'n' 1489 | prefix: "\n" 1490 | suffix: " [yN] > " 1491 | color: orangered 1492 | adapter: 1493 | fennel: | 1494 | (.. name " | " parameters-as-json) 1495 | lua: | 1496 | return name .. " | " .. parameters_as_json 1497 | executing: 1498 | feedback: true 1499 | prefix: "\n" 1500 | suffix: "\n" 1501 | color: olive 1502 | adapter: 1503 | fennel: | 1504 | (.. name " | " parameters-as-json) 1505 | lua: | 1506 | return name .. " | " .. parameters_as_json 1507 | responding: 1508 | feedback: true 1509 | color: aqua 1510 | prefix: "\n" 1511 | suffix: "\n\n" 1512 | adapter: 1513 | fennel: | 1514 | (.. name " | " parameters-as-json "\n" output) 1515 | lua: | 1516 | return name .. " | " .. parameters_as_json .. "\n" .. output 1517 | 1518 | state: 1519 | path: ENV/NANO_BOTS_STATE_PATH 1520 | 1521 | safety: 1522 | functions: 1523 | sandboxed: true 1524 | tools: 1525 | confirmable: true 1526 | 1527 | provider: 1528 | id: openai 1529 | credentials: 1530 | address: ENV/OPENAI_API_ADDRESS 1531 | access-token: ENV/OPENAI_API_KEY 1532 | settings: 1533 | user: ENV/NANO_BOTS_END_USER 1534 | model: gpt-4o 1535 | stream: true 1536 | frequency_penalty: 0 1537 | logit_bias: null 1538 | logprobs: false 1539 | top_logprobs: null 1540 | max_tokens: null 1541 | n: 1 1542 | presence_penalty: 0 1543 | response_format: 1544 | type: json_object 1545 | seed: null 1546 | stop: 1547 | - . 1548 | temperature: 1 1549 | top_p: 1 1550 | tool_choice: auto 1551 | 1552 | provider: 1553 | id: google 1554 | credentials: 1555 | service: generative-language-api 1556 | api-key: ENV/GOOGLE_API_KEY 1557 | credentials: 1558 | service: vertex-ai-api 1559 | region: ENV/GOOGLE_REGION 1560 | credentials: 1561 | service: vertex-ai-api 1562 | region: ENV/GOOGLE_REGION 1563 | file-path: ENV/GOOGLE_CREDENTIALS_FILE_PATH 1564 | credentials: 1565 | service: vertex-ai-api 1566 | region: ENV/GOOGLE_REGION 1567 | file-path: ENV/GOOGLE_CREDENTIALS_FILE_PATH 1568 | project-id: ENV/GOOGLE_PROJECT_ID 1569 | options: 1570 | model: gemini-pro 1571 | stream: true 1572 | settings: 1573 | safetySettings: 1574 | - category: HARM_CATEGORY_DANGEROUS_CONTENT 1575 | threshold: BLOCK_NONE 1576 | generationConfig: 1577 | temperature: 0.9 1578 | maxOutputTokens: 8192 1579 | topK: null 1580 | topP: 1.0 1581 | stopSequences: 1582 | - . 1583 | 1584 | miscellaneous: 1585 | key: value 1586 | ``` 1587 | 1588 | ## State 1589 | 1590 | ### Stateless 1591 | 1592 | By default, Nano Bots are stateless. 1593 | 1594 | An evaluation is a single-turn interaction. 1595 | 1596 | A REPL should be capable of maintaining multi-turn interactions, which means it must retain the conversation history and utilize it during interactions throughout its lifetime. Once the user exits the REPL, all history are discarded. 1597 | 1598 | The default stateless behavior is defined by the `-` character in interactions: 1599 | 1600 | ```bash 1601 | nb assistant.yml - repl 1602 | nb assistant.yml - eval "Hi" 1603 | ``` 1604 | 1605 | ### Stateful 1606 | 1607 | Implementations should support storing state by identifying a state key different from `-`: 1608 | 1609 | ```bash 1610 | nb assistant.yml E15D repl 1611 | nb assistant.yml D9D6 eval "Hi" 1612 | ``` 1613 | 1614 | In this example, both `E15D` and `D9D6` are distinct identifiers used to indicate which state key should be employed for storing and retrieving state information related to that interaction. 1615 | 1616 | In this scenario, both Eval and REPL store their states (history) and should be capable of performing multi-turn interactions. Eval should remember its previous interactions, and a REPL should remember its previous interactions even if it is exited and started again. 1617 | 1618 | By default, implementations should be [XDG compliant](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html), which means that the default storage path would be: 1619 | 1620 | ```text 1621 | /home/user/.local/state/nano-bots/your-implementation 1622 | ``` 1623 | 1624 | If the `NANO_BOTS_STATE_PATH` environment variable exists, it should be used as the path to store the states. 1625 | 1626 | A Cartridge may include a section that defines a custom path for storing the states. In this case, it should override both the default and the path specified by the environment variable: 1627 | 1628 | ```yaml 1629 | --- 1630 | state: 1631 | path: ENV/NANO_BOTS_STATE_PATH 1632 | ``` 1633 | 1634 | The state should be stored in a manner that ensures isolation between multiple Nano Bots and Implementations. 1635 | 1636 | In this example: 1637 | 1638 | ```bash 1639 | nb assistant.yml E15D repl 1640 | ``` 1641 | 1642 | ```yaml 1643 | --- 1644 | meta: 1645 | symbol: 🤖 1646 | name: Nano Bot Name 1647 | author: Author Name 1648 | version: 1.0.0 1649 | license: CC0-1.0 1650 | description: A helpful assistant. 1651 | 1652 | state: 1653 | path: /home/user/.local/state/nano-bots 1654 | 1655 | provider: 1656 | settings: 1657 | user: end-user-name 1658 | ``` 1659 | 1660 | The state should be stored in a path similar to this: 1661 | 1662 | ```text 1663 | /home/user/.local/state/nano-bots/your-implementation/author-name/nano-bot-name/0-0-1/end-user-name/E15D/state.json 1664 | ``` 1665 | 1666 | If not specified in the provider settings, `end-user-name` should be loaded from the environment variable `NANO_BOTS_END_USER`. If the environment variable does not exist, use the default `unknown` value: 1667 | 1668 | ```text 1669 | /home/user/.local/state/nano-bots/your-implementation/author-name/nano-bot-name/0-0-1/unknown/E15D/state.json 1670 | ``` 1671 | 1672 | JSON is merely an example; each implementation can choose the most suitable data format to work with. 1673 | 1674 | > ⚠️ A Nano Bot should **never** depend on or rely on a state to function fully—**absolutely never**. 1675 | 1676 | States serve as a convenience for users and should not be used to influence Nano Bot behaviors. Instead, such behaviors should be managed through the [Behaviors](?id=behaviors) section of the Cartridge YAML. This reinforces the notion that a Cartridge YAML file should ultimately be the sole and only necessary information for the bot to operate as expected. 1677 | 1678 | ## Stream 1679 | 1680 | Unless otherwise specified in the Cartridge file, or if not supported by the provider, both the REPL and Eval Interfaces should be capable of streaming messages. This means they should be able to display content partially, whether character by character, token by token, or word by word. 1681 | 1682 | # Breaking Changes 1683 | 1684 | ## 3.0.0 1685 | 1686 | From version `2.3.0` to version `3.0.0`: 1687 | 1688 | Cartridges must have a `.yml` or `.yaml` extension. 1689 | 1690 | `NANO_BOTS_STATE_DIRECTORY` has been renamed to `NANO_BOTS_STATE_PATH`. 1691 | `NANO_BOTS_CARTRIDGES_DIRECTORY` has been renamed to `NANO_BOTS_CARTRIDGES_PATH`. 1692 | 1693 | Although some implementations may offer backward compatibility for these changes, supporting the old names is not expected in version `3.0.0`. 1694 | 1695 | ## 2.0.0 1696 | 1697 | From version `1.1.0` to version `2.0.0`: 1698 | 1699 | Google Provider requires a new `service` key in `credentials`. 1700 | 1701 | ## 1.0.0 1702 | 1703 | From version `0.2.0` to version `1.0.0`: 1704 | 1705 | Lua functions should start to expect explicit `return` statements. 1706 | 1707 | Before: 1708 | 1709 | ```yaml 1710 | --- 1711 | lua: | 1712 | "```" .. content .. "```" 1713 | ``` 1714 | 1715 | After: 1716 | ```yaml 1717 | --- 1718 | lua: | 1719 | return "```" .. content .. "```" 1720 | ``` 1721 | 1722 | This decision was made to support complex multiline Lua functions. Without explicit `return` statements, implementations would need to infer where to inject the `return` statement to create valid Lua code, which could potentially compromise the functionality of the code through incorrect assumptions. 1723 | 1724 | # Experimental 1725 | 1726 | ## Clojure Support 1727 | 1728 | We are exploring the use of [Clojure](https://clojure.org) through [Babashka](https://babashka.org), powered by [GraalVM](https://www.graalvm.org). 1729 | 1730 | Currently, [Lua](https://www.lua.org/about.html) and [Fennel](https://fennel-lang.org) are our primary supported languages, due to their proven portability, widespread availability, lightweight nature, and ease of embedding. If this specific flavor of Clojure continues to demonstrate the potential to offer the same attributes as observed in Lua and Fennel, it may become an additional language that is expected to be supported in our specification. Regardless of this potential move, we have absolutely no intention of removing or replacing Lua or Fennel as the primary supported languages. 1731 | 1732 | The experimental support for Clojure would be similar to Lua and Fennel, using the `clojure:` key: 1733 | 1734 | ```yaml 1735 | --- 1736 | clojure: | 1737 | (-> (java.time.ZonedDateTime/now) 1738 | (.format (java.time.format.DateTimeFormatter/ofPattern "yyyy-MM-dd HH:mm")) 1739 | (clojure.string/trimr)) 1740 | ``` 1741 | 1742 | ## Markdown Support 1743 | 1744 | We are exploring the use of [Markdown](https://en.wikipedia.org/wiki/Markdown) as a cartridge source code format. The following file extensions become valid cartridges: 1745 | 1746 | ```text 1747 | .md .mkdn .mdown .markdown 1748 | ``` 1749 | 1750 | This is an example of a Markdown cartridge: 1751 | 1752 | ````md 1753 | Start by defining a meta section: 1754 | 1755 | ```yaml 1756 | meta: 1757 | symbol: 🤖 1758 | name: Nano Bot Name 1759 | author: Your Name 1760 | description: A helpful assistant. 1761 | ``` 1762 | 1763 | You can also add version and license information: 1764 | 1765 | ```yaml 1766 | meta: 1767 | version: 1.0.0 1768 | license: CC0-1.0 1769 | ``` 1770 | 1771 | Then, add a behavior section: 1772 | 1773 | ```yaml 1774 | behaviors: 1775 | interaction: 1776 | directive: You are a helpful assistant. 1777 | ``` 1778 | ```` 1779 | 1780 | Implementations should extract each code block and merge them to end up with the complete cartridge's source code, ignoring everything else: 1781 | 1782 | ```yaml 1783 | --- 1784 | meta: 1785 | symbol: 🤖 1786 | name: Nano Bot Name 1787 | author: Your Name 1788 | description: A helpful assistant. 1789 | version: 1.0.0 1790 | license: CC0-1.0 1791 | behaviors: 1792 | interaction: 1793 | directive: You are a helpful assistant. 1794 | ``` 1795 | 1796 | Code blocks in supported languages that appear after a previous tool's definition should be incorporated as the function source code of the last defined tool: 1797 | 1798 | 1799 | ````md 1800 | This is the specification of the tool: 1801 | 1802 | ```yaml 1803 | tools: 1804 | - name: date-and-time 1805 | description: Returns the current date and time. 1806 | ``` 1807 | 1808 | This is the function source code for the tool: 1809 | 1810 | ```fnl 1811 | (os.date) 1812 | ``` 1813 | ```` 1814 | 1815 | The above Markdown cartridge should be extracted as: 1816 | ```yaml 1817 | --- 1818 | tools: 1819 | - name: date-and-time 1820 | description: Returns the current date and time. 1821 | fennel: | 1822 | (os.date) 1823 | ``` 1824 | 1825 | Root keys that are array values should be concatenated: 1826 | 1827 | ````md 1828 | This is the first tool: 1829 | 1830 | ```yaml 1831 | tools: 1832 | - name: date-and-time 1833 | description: Returns the current date and time. 1834 | ``` 1835 | 1836 | That has this source code: 1837 | 1838 | ```fnl 1839 | (os.date) 1840 | ``` 1841 | 1842 | This is the second tool: 1843 | 1844 | ```yaml 1845 | tools: 1846 | - name: random-number 1847 | description: Generates a random number. 1848 | ``` 1849 | 1850 | With this source code: 1851 | 1852 | ```lua 1853 | return math.random() 1854 | ``` 1855 | 1856 | ```` 1857 | 1858 | The above Markdown cartridge should be extracted as: 1859 | 1860 | ```yaml 1861 | --- 1862 | tools: 1863 | - name: date-and-time 1864 | description: Returns the current date and time. 1865 | fennel: | 1866 | (os.date) 1867 | - name: random-number 1868 | description: Generates a random number. 1869 | lua: | 1870 | return math.random() 1871 | ``` 1872 | -------------------------------------------------------------------------------- /docs/cover.md: -------------------------------------------------------------------------------- 1 | # 🤖 2 | # Nano Bots 3 | 4 | > Specification for AI powered Nano Bots. 5 | 6 | - Unlock the remarkable capabilities of AI. 7 | - Quickly create intelligent bots in seconds. 8 | - Effortlessly integrate multiple bots to achieve your goals. 9 | - Share your Nano Bots and enable others to benefit from their abilities. 10 | 11 | Version 3.2.0 12 | 13 | [Specification](README) 14 | [GitHub](https://github.com/icebaker/nano-bots-spec) 15 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Nano Bots Specification 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /docs/vendor/docsify-themeable/theme-simple-dark.css: -------------------------------------------------------------------------------- 1 | .github-corner{position:absolute;z-index:40;top:0;right:0;border-bottom:0;text-decoration:none}.github-corner svg{height:70px;width:70px;fill:var(--theme-color);color:var(--base-background-color)}.github-corner:hover .octo-arm{-webkit-animation:octocat-wave 560ms ease-in-out;animation:octocat-wave 560ms ease-in-out}@-webkit-keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}.progress{position:fixed;z-index:2147483647;top:0;left:0;right:0;height:3px;width:0;background-color:var(--theme-color);transition:width var(--duration-fast),opacity calc(var(--duration-fast)*2)}body.ready-transition:after,body.ready-transition>*:not(.progress){opacity:0;transition:opacity var(--spinner-transition-duration)}body.ready-transition:after{content:"";position:absolute;z-index:1000;top:calc(50% - var(--spinner-size)/2);left:calc(50% - var(--spinner-size)/2);height:var(--spinner-size);width:var(--spinner-size);border:var(--spinner-track-width, 0) solid var(--spinner-track-color);border-left-color:var(--theme-color);border-left-color:var(--theme-color);border-radius:50%;-webkit-animation:spinner var(--duration-slow) infinite linear;animation:spinner var(--duration-slow) infinite linear}body.ready-transition.ready-spinner:after{opacity:1}body.ready-transition.ready-fix:after{opacity:0}body.ready-transition.ready-fix>*:not(.progress){opacity:1;transition-delay:var(--spinner-transition-duration)}@-webkit-keyframes spinner{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes spinner{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}*,*:before,*:after{box-sizing:inherit;font-size:inherit;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-webkit-touch-callout:none}:root{box-sizing:border-box;background-color:var(--base-background-color);font-size:var(--base-font-size);font-weight:var(--base-font-weight);line-height:var(--base-line-height);letter-spacing:var(--base-letter-spacing);color:var(--base-color);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased}html,button,input,optgroup,select,textarea{font-family:var(--base-font-family)}button,input,optgroup,select,textarea{font-size:100%;margin:0}a{text-decoration:none;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}body{margin:0}hr{height:0;margin:2em 0;border:none;border-bottom:var(--hr-border, 0)}img{max-width:100%;border:0}main{display:block}main.hidden{display:none}mark{background:var(--mark-background);color:var(--mark-color)}pre{font-family:var(--pre-font-family);font-size:var(--pre-font-size);font-weight:var(--pre-font-weight);line-height:var(--pre-line-height)}small{display:inline-block;font-size:var(--small-font-size)}strong{font-weight:var(--strong-font-weight);color:var(--strong-color, currentColor)}sub,sup{font-size:var(--subsup-font-size);line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}body:not([data-platform^=Mac]) *{scrollbar-color:hsla(var(--mono-hue), var(--mono-saturation), 50%, 0.3) hsla(var(--mono-hue), var(--mono-saturation), 50%, 0.1);scrollbar-width:thin}body:not([data-platform^=Mac]) * ::-webkit-scrollbar{width:5px;height:5px}body:not([data-platform^=Mac]) * ::-webkit-scrollbar-thumb{background:hsla(var(--mono-hue), var(--mono-saturation), 50%, 0.3)}body:not([data-platform^=Mac]) * ::-webkit-scrollbar-track{background:hsla(var(--mono-hue), var(--mono-saturation), 50%, 0.1)}::-moz-selection{background:var(--selection-color)}::selection{background:var(--selection-color)}.emoji{height:var(--emoji-size);vertical-align:middle}.task-list-item{list-style:none}.task-list-item input{margin-right:.5em;margin-left:0;vertical-align:.075em}.markdown-section code[class*=lang-],.markdown-section pre[data-lang]{font-family:var(--code-font-family);font-size:var(--code-font-size);font-weight:var(--code-font-weight);letter-spacing:normal;line-height:var(--code-block-line-height);-moz-tab-size:var(--code-tab-size);-o-tab-size:var(--code-tab-size);tab-size:var(--code-tab-size);text-align:left;white-space:pre;word-spacing:normal;word-wrap:normal;word-break:normal;-webkit-hyphens:none;hyphens:none}.markdown-section pre[data-lang]{position:relative;overflow:hidden;margin:var(--code-block-margin);padding:0;border-radius:var(--code-block-border-radius)}.markdown-section pre[data-lang]::after{content:attr(data-lang);position:absolute;top:.75em;right:.75em;opacity:.6;color:inherit;font-size:var(--font-size-s);line-height:1}.markdown-section pre[data-lang] code{display:block;overflow:auto;padding:var(--code-block-padding)}code[class*=lang-],pre[data-lang]{color:var(--code-theme-text)}pre[data-lang]::-moz-selection,pre[data-lang] ::-moz-selection,code[class*=lang-]::-moz-selection,code[class*=lang-] ::-moz-selection{background:var(--code-theme-selection, var(--selection-color))}pre[data-lang]::-moz-selection, pre[data-lang] ::-moz-selection, code[class*=lang-]::-moz-selection, code[class*=lang-] ::-moz-selection{background:var(--code-theme-selection, var(--selection-color))}pre[data-lang]::selection,pre[data-lang] ::selection,code[class*=lang-]::selection,code[class*=lang-] ::selection{background:var(--code-theme-selection, var(--selection-color))}:not(pre)>code[class*=lang-],pre[data-lang]{background:var(--code-theme-background)}.namespace{opacity:.7}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:var(--code-theme-comment)}.token.punctuation{color:var(--code-theme-punctuation)}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{color:var(--code-theme-tag)}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:var(--code-theme-selector)}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string{color:var(--code-theme-operator)}.token.atrule,.token.attr-value,.token.keyword{color:var(--code-theme-keyword)}.token.function{color:var(--code-theme-function)}.token.regex,.token.important,.token.variable{color:var(--code-theme-variable)}.token.important,.token.bold{font-weight:bold}.token.italic{font-style:italic}.token.entity{cursor:help}.markdown-section{position:relative;max-width:var(--content-max-width);margin:0 auto;padding:2rem 45px}.app-nav:not(:empty)~main .markdown-section{padding-top:3.5rem}.markdown-section figure,.markdown-section p,.markdown-section ol,.markdown-section ul{margin:1em 0}.markdown-section ol,.markdown-section ul{padding-left:1.5rem}.markdown-section ol ol,.markdown-section ol ul,.markdown-section ul ol,.markdown-section ul ul{margin-top:.15rem;margin-bottom:.15rem}.markdown-section a{border-bottom:var(--link-border-bottom);color:var(--link-color);-webkit-text-decoration:var(--link-text-decoration);text-decoration:var(--link-text-decoration);-webkit-text-decoration-color:var(--link-text-decoration-color);text-decoration-color:var(--link-text-decoration-color)}.markdown-section a:hover{border-bottom:var(--link-border-bottom--hover, var(--link-border-bottom, 0));color:var(--link-color--hover, var(--link-color));-webkit-text-decoration:var(--link-text-decoration--hover, var(--link-text-decoration));text-decoration:var(--link-text-decoration--hover, var(--link-text-decoration));-webkit-text-decoration-color:var(--link-text-decoration-color--hover, var(--link-text-decoration-color));text-decoration-color:var(--link-text-decoration-color--hover, var(--link-text-decoration-color))}.markdown-section a.anchor{border-bottom:0;color:inherit;text-decoration:none}.markdown-section a.anchor:hover{text-decoration:underline}.markdown-section blockquote{overflow:visible;margin:2em 0;padding:var(--blockquote-padding);border-width:var(--blockquote-border-width, 0);border-style:var(--blockquote-border-style);border-color:var(--blockquote-border-color);border-radius:var(--blockquote-border-radius);background:var(--blockquote-background);color:var(--blockquote-color);font-family:var(--blockquote-font-family);font-size:var(--blockquote-font-size);font-style:var(--blockquote-font-style);font-weight:var(--blockquote-font-weight);quotes:"“" "”" "‘" "’"}.markdown-section blockquote em{font-family:var(--blockquote-em-font-family);font-size:var(--blockquote-em-font-size);font-style:var(--blockquote-em-font-style);font-weight:var(--blockquote-em-font-weight)}.markdown-section blockquote p:first-child{margin-top:0}.markdown-section blockquote p:first-child:before,.markdown-section blockquote p:first-child:after{color:var(--blockquote-quotes-color);font-family:var(--blockquote-quotes-font-family);font-size:var(--blockquote-quotes-font-size);line-height:0}.markdown-section blockquote p:first-child:before{content:var(--blockquote-quotes-open);margin-right:.15em;vertical-align:-0.45em}.markdown-section blockquote p:first-child:after{content:var(--blockquote-quotes-close);margin-left:.15em;vertical-align:-0.55em}.markdown-section blockquote p:last-child{margin-bottom:0}.markdown-section code{font-family:var(--code-font-family);font-size:var(--code-font-size);font-weight:var(--code-font-weight);line-height:inherit}.markdown-section code:not([class*=lang-]):not([class*=language-]){margin:var(--code-inline-margin);padding:var(--code-inline-padding);border-radius:var(--code-inline-border-radius);background:var(--code-inline-background);color:var(--code-inline-color, currentColor);white-space:nowrap}.markdown-section h1:first-child,.markdown-section h2:first-child,.markdown-section h3:first-child,.markdown-section h4:first-child,.markdown-section h5:first-child,.markdown-section h6:first-child{margin-top:0}.markdown-section h1 a[data-id],.markdown-section h2 a[data-id],.markdown-section h3 a[data-id],.markdown-section h4 a[data-id],.markdown-section h5 a[data-id],.markdown-section h6 a[data-id]{display:inline-block}.markdown-section h1 code,.markdown-section h2 code,.markdown-section h3 code,.markdown-section h4 code,.markdown-section h5 code,.markdown-section h6 code{font-size:.875em}.markdown-section h1+h2,.markdown-section h1+h3,.markdown-section h1+h4,.markdown-section h1+h5,.markdown-section h1+h6,.markdown-section h2+h3,.markdown-section h2+h4,.markdown-section h2+h5,.markdown-section h2+h6,.markdown-section h3+h4,.markdown-section h3+h5,.markdown-section h3+h6,.markdown-section h4+h5,.markdown-section h4+h6,.markdown-section h5+h6{margin-top:1rem}.markdown-section h1{margin:var(--heading-h1-margin, var(--heading-margin));padding:var(--heading-h1-padding, var(--heading-padding));border-width:var(--heading-h1-border-width, 0);border-style:var(--heading-h1-border-style);border-color:var(--heading-h1-border-color);font-family:var(--heading-h1-font-family, var(--heading-font-family));font-size:var(--heading-h1-font-size);font-weight:var(--heading-h1-font-weight, var(--heading-font-weight));line-height:var(--base-line-height);color:var(--heading-h1-color, var(--heading-color))}.markdown-section h2{margin:var(--heading-h2-margin, var(--heading-margin));padding:var(--heading-h2-padding, var(--heading-padding));border-width:var(--heading-h2-border-width, 0);border-style:var(--heading-h2-border-style);border-color:var(--heading-h2-border-color);font-family:var(--heading-h2-font-family, var(--heading-font-family));font-size:var(--heading-h2-font-size);font-weight:var(--heading-h2-font-weight, var(--heading-font-weight));line-height:var(--base-line-height);color:var(--heading-h2-color, var(--heading-color))}.markdown-section h3{margin:var(--heading-h3-margin, var(--heading-margin));padding:var(--heading-h3-padding, var(--heading-padding));border-width:var(--heading-h3-border-width, 0);border-style:var(--heading-h3-border-style);border-color:var(--heading-h3-border-color);font-family:var(--heading-h3-font-family, var(--heading-font-family));font-size:var(--heading-h3-font-size);font-weight:var(--heading-h3-font-weight, var(--heading-font-weight));color:var(--heading-h3-color, var(--heading-color))}.markdown-section h4{margin:var(--heading-h4-margin, var(--heading-margin));padding:var(--heading-h4-padding, var(--heading-padding));border-width:var(--heading-h4-border-width, 0);border-style:var(--heading-h4-border-style);border-color:var(--heading-h4-border-color);font-family:var(--heading-h4-font-family, var(--heading-font-family));font-size:var(--heading-h4-font-size);font-weight:var(--heading-h4-font-weight, var(--heading-font-weight));color:var(--heading-h4-color, var(--heading-color))}.markdown-section h5{margin:var(--heading-h5-margin, var(--heading-margin));padding:var(--heading-h5-padding, var(--heading-padding));border-width:var(--heading-h5-border-width, 0);border-style:var(--heading-h5-border-style);border-color:var(--heading-h5-border-color);font-family:var(--heading-h5-font-family, var(--heading-font-family));font-size:var(--heading-h5-font-size);font-weight:var(--heading-h5-font-weight, var(--heading-font-weight));color:var(--heading-h5-color, var(--heading-color))}.markdown-section h6{margin:var(--heading-h6-margin, var(--heading-margin));padding:var(--heading-h6-padding, var(--heading-padding));border-width:var(--heading-h6-border-width, 0);border-style:var(--heading-h6-border-style);border-color:var(--heading-h6-border-color);font-family:var(--heading-h6-font-family, var(--heading-font-family));font-size:var(--heading-h6-font-size);font-weight:var(--heading-h6-font-weight, var(--heading-font-weight));color:var(--heading-h6-color, var(--heading-color))}.markdown-section iframe{margin:1em 0}.markdown-section img{max-width:100%}.markdown-section kbd{display:inline-block;min-width:var(--kbd-min-width);margin:var(--kbd-margin);padding:var(--kbd-padding);border:var(--kbd-border);border-radius:var(--kbd-border-radius);background:var(--kbd-background);font-family:inherit;font-size:var(--kbd-font-size);text-align:center;letter-spacing:0;line-height:1;color:var(--kbd-color)}.markdown-section kbd+kbd{margin-left:-0.15em}.markdown-section table{display:block;overflow:auto;margin:1rem 0;border-spacing:0;border-collapse:collapse}.markdown-section th,.markdown-section td{padding:var(--table-cell-padding)}.markdown-section th:not([align]){text-align:left}.markdown-section thead{border-color:var(--table-head-border-color);border-style:solid;border-width:var(--table-head-border-width, 0);background:var(--table-head-background)}.markdown-section th{font-weight:var(--table-head-font-weight);color:var(--strong-color)}.markdown-section td{border-color:var(--table-cell-border-color);border-style:solid;border-width:var(--table-cell-border-width, 0)}.markdown-section tbody{border-color:var(--table-body-border-color);border-style:solid;border-width:var(--table-body-border-width, 0)}.markdown-section tbody tr:nth-child(odd){background:var(--table-row-odd-background)}.markdown-section tbody tr:nth-child(even){background:var(--table-row-even-background)}.markdown-section>ul .task-list-item{margin-left:-1.25em}.markdown-section>ul .task-list-item .task-list-item{margin-left:0}.markdown-section .table-wrapper{overflow-x:auto}.markdown-section .table-wrapper table{display:table;width:100%}.markdown-section .table-wrapper td::before{display:none}@media(max-width: 30em){.markdown-section .table-wrapper tbody,.markdown-section .table-wrapper tr,.markdown-section .table-wrapper td{display:block}.markdown-section .table-wrapper th,.markdown-section .table-wrapper td{border:none}.markdown-section .table-wrapper thead{display:none}.markdown-section .table-wrapper tr{border-color:var(--table-cell-border-color);border-style:solid;border-width:var(--table-cell-border-width, 0);padding:var(--table-cell-padding)}.markdown-section .table-wrapper tr:not(:last-child){border-bottom:0}.markdown-section .table-wrapper td{padding:.15em 0 .15em 8em}.markdown-section .table-wrapper td::before{display:inline-block;float:left;width:8em;margin-left:-8em;font-weight:bold;text-align:left}}.markdown-section .tip,.markdown-section .warn{position:relative;margin:2em 0;padding:var(--notice-padding);border-width:var(--notice-border-width, 0);border-style:var(--notice-border-style);border-color:var(--notice-border-color);border-radius:var(--notice-border-radius);background:var(--notice-background);font-family:var(--notice-font-family);font-weight:var(--notice-font-weight);color:var(--notice-color)}.markdown-section .tip:before,.markdown-section .warn:before{display:inline-block;position:var(--notice-before-position, relative);top:var(--notice-before-top);left:var(--notice-before-left);height:var(--notice-before-height);width:var(--notice-before-width);margin:var(--notice-before-margin);padding:var(--notice-before-padding);border-radius:var(--notice-before-border-radius);line-height:var(--notice-before-line-height);font-family:var(--notice-before-font-family);font-size:var(--notice-before-font-size);font-weight:var(--notice-before-font-weight);text-align:center}.markdown-section .tip{border-width:var(--notice-important-border-width, var(--notice-border-width, 0));border-style:var(--notice-important-border-style, var(--notice-border-style));border-color:var(--notice-important-border-color, var(--notice-border-color));background:var(--notice-important-background, var(--notice-background));color:var(--notice-important-color, var(--notice-color))}.markdown-section .tip:before{content:var(--notice-important-before-content, var(--notice-before-content));background:var(--notice-important-before-background, var(--notice-before-background));color:var(--notice-important-before-color, var(--notice-before-color))}.markdown-section .warn{border-width:var(--notice-tip-border-width, var(--notice-border-width, 0));border-style:var(--notice-tip-border-style, var(--notice-border-style));border-color:var(--notice-tip-border-color, var(--notice-border-color));background:var(--notice-tip-background, var(--notice-background));color:var(--notice-tip-color, var(--notice-color))}.markdown-section .warn:before{content:var(--notice-tip-before-content, var(--notice-before-content));background:var(--notice-tip-before-background, var(--notice-before-background));color:var(--notice-tip-before-color, var(--notice-before-color))}.cover{display:none;position:relative;z-index:20;min-height:100vh;flex-direction:column;align-items:center;justify-content:center;padding:calc(var(--cover-border-inset, 0px) + var(--cover-border-width, 0px));color:var(--cover-color);text-align:var(--cover-text-align)}@media screen and (-ms-high-contrast: active),screen and (-ms-high-contrast: none){.cover{height:100vh}}.cover:before,.cover:after{content:"";position:absolute}.cover:before{top:0;bottom:0;left:0;right:0;background-blend-mode:var(--cover-background-blend-mode);background-color:var(--cover-background-color);background-image:var(--cover-background-image);background-position:var(--cover-background-position);background-repeat:var(--cover-background-repeat);background-size:var(--cover-background-size)}.cover:after{top:var(--cover-border-inset, 0);bottom:var(--cover-border-inset, 0);left:var(--cover-border-inset, 0);right:var(--cover-border-inset, 0);border-width:var(--cover-border-width, 0);border-style:solid;border-color:var(--cover-border-color)}.cover a{border-bottom:var(--cover-link-border-bottom);color:var(--cover-link-color);-webkit-text-decoration:var(--cover-link-text-decoration);text-decoration:var(--cover-link-text-decoration);-webkit-text-decoration-color:var(--cover-link-text-decoration-color);text-decoration-color:var(--cover-link-text-decoration-color)}.cover a:hover{border-bottom:var(--cover-link-border-bottom--hover, var(--cover-link-border-bottom));color:var(--cover-link-color--hover, var(--cover-link-color));-webkit-text-decoration:var(--cover-link-text-decoration--hover, var(--cover-link-text-decoration));text-decoration:var(--cover-link-text-decoration--hover, var(--cover-link-text-decoration));-webkit-text-decoration-color:var(--cover-link-text-decoration-color--hover, var(--cover-link-text-decoration-color));text-decoration-color:var(--cover-link-text-decoration-color--hover, var(--cover-link-text-decoration-color))}.cover h1{color:var(--cover-heading-color);position:relative;margin:0;font-size:var(--cover-heading-font-size);font-weight:var(--cover-heading-font-weight);line-height:1.2}.cover h1 a,.cover h1 a:hover{display:block;border-bottom:none;color:inherit;text-decoration:none}.cover h1 small{position:absolute;bottom:0;margin-left:.5em}.cover h1 span{font-size:calc(var(--cover-heading-font-size-min)*1px)}@media(min-width: 26em){.cover h1 span{font-size:calc(var(--cover-heading-font-size-min)*1px + (var(--cover-heading-font-size-max) - var(--cover-heading-font-size-min))*(100vw - 420px)/604)}}@media(min-width: 64em){.cover h1 span{font-size:calc(var(--cover-heading-font-size-max)*1px)}}.cover blockquote{margin:0;color:var(--cover-blockquote-color);font-size:var(--cover-blockquote-font-size)}.cover blockquote a{color:inherit}.cover ul{padding:0;list-style-type:none}.cover .cover-main{position:relative;z-index:1;max-width:var(--cover-max-width);margin:var(--cover-margin);padding:0 45px}.cover .cover-main>p:last-child{margin:1.25em -0.25em}.cover .cover-main>p:last-child a{display:block;margin:.375em .25em;padding:var(--cover-button-padding);border:var(--cover-button-border);border-radius:var(--cover-button-border-radius);box-shadow:var(--cover-button-box-shadow);background:var(--cover-button-background);text-align:center;-webkit-text-decoration:var(--cover-button-text-decoration);text-decoration:var(--cover-button-text-decoration);-webkit-text-decoration-color:var(--cover-button-text-decoration-color);text-decoration-color:var(--cover-button-text-decoration-color);color:var(--cover-button-color);white-space:nowrap;transition:var(--cover-button-transition)}.cover .cover-main>p:last-child a:hover{border:var(--cover-button-border--hover, var(--cover-button-border));box-shadow:var(--cover-button-box-shadow--hover, var(--cover-button-box-shadow));background:var(--cover-button-background--hover, var(--cover-button-background));-webkit-text-decoration:var(--cover-button-text-decoration--hover, var(--cover-button-text-decoration));text-decoration:var(--cover-button-text-decoration--hover, var(--cover-button-text-decoration));-webkit-text-decoration-color:var(--cover-button-text-decoration-color--hover, var(--cover-button-text-decoration-color));text-decoration-color:var(--cover-button-text-decoration-color--hover, var(--cover-button-text-decoration-color));color:var(--cover-button-color--hover, var(--cover-button-color))}.cover .cover-main>p:last-child a:first-child{border:var(--cover-button-primary-border, var(--cover-button-border));box-shadow:var(--cover-button-primary-box-shadow, var(--cover-button-box-shadow));background:var(--cover-button-primary-background, var(--cover-button-background));-webkit-text-decoration:var(--cover-button-primary-text-decoration, var(--cover-button-text-decoration));text-decoration:var(--cover-button-primary-text-decoration, var(--cover-button-text-decoration));-webkit-text-decoration-color:var(--cover-button-primary-text-decoration-color, var(--cover-button-text-decoration-color));text-decoration-color:var(--cover-button-primary-text-decoration-color, var(--cover-button-text-decoration-color));color:var(--cover-button-primary-color, var(--cover-button-color))}.cover .cover-main>p:last-child a:first-child:hover{border:var(--cover-button-primary-border--hover, var(--cover-button-border--hover, var(--cover-button-primary-border, var(--cover-button-border))));box-shadow:var(--cover-button-primary-box-shadow--hover, var(--cover-button-box-shadow--hover, var(--cover-button-primary-box-shadow, var(--cover-button-box-shadow))));background:var(--cover-button-primary-background--hover, var(--cover-button-background--hover, var(--cover-button-primary-background, var(--cover-button-background))));-webkit-text-decoration:var(--cover-button-primary-text-decoration--hover, var(--cover-button-text-decoration--hover, var(--cover-button-primary-text-decoration, var(--cover-button-text-decoration))));text-decoration:var(--cover-button-primary-text-decoration--hover, var(--cover-button-text-decoration--hover, var(--cover-button-primary-text-decoration, var(--cover-button-text-decoration))));-webkit-text-decoration-color:var(--cover-button-primary-text-decoration-color--hover, var(--cover-button-text-decoration-color--hover, var(--cover-button-primary-text-decoration-color, var(--cover-button-text-decoration-color))));text-decoration-color:var(--cover-button-primary-text-decoration-color--hover, var(--cover-button-text-decoration-color--hover, var(--cover-button-primary-text-decoration-color, var(--cover-button-text-decoration-color))));color:var(--cover-button-primary-color--hover, var(--cover-button-color--hover, var(--cover-button-primary-color, var(--cover-button-color))))}@media(min-width: 30.01em){.cover .cover-main>p:last-child a{display:inline-block}}.cover .mask{visibility:var(--cover-background-mask-visibility, hidden);position:absolute;top:0;bottom:0;left:0;right:0;background-color:var(--cover-background-mask-color);opacity:var(--cover-background-mask-opacity)}.cover.has-mask .mask{visibility:visible}.cover.show{display:flex}.app-nav{position:absolute;z-index:30;top:calc(35px - .5em*var(--base-line-height));left:45px;right:80px;text-align:right}.app-nav.no-badge{right:45px}.app-nav li>img,.app-nav li>a>img{margin-top:-0.25em;vertical-align:middle}.app-nav li>img:first-child,.app-nav li>a>img:first-child{margin-right:.5em}.app-nav ul,.app-nav li{margin:0;padding:0;list-style:none}.app-nav li{position:relative}.app-nav li a{display:block;line-height:1;transition:var(--navbar-root-transition)}.app-nav>ul>li{display:inline-block;margin:var(--navbar-root-margin)}.app-nav>ul>li:first-child{margin-left:0}.app-nav>ul>li:last-child{margin-right:0}.app-nav>ul>li>a,.app-nav>ul>li>span{padding:var(--navbar-root-padding);border-width:var(--navbar-root-border-width, 0);border-style:var(--navbar-root-border-style);border-color:var(--navbar-root-border-color);border-radius:var(--navbar-root-border-radius);background:var(--navbar-root-background);color:var(--navbar-root-color);-webkit-text-decoration:var(--navbar-root-text-decoration);text-decoration:var(--navbar-root-text-decoration);-webkit-text-decoration-color:var(--navbar-root-text-decoration-color);text-decoration-color:var(--navbar-root-text-decoration-color)}.app-nav>ul>li>a:hover,.app-nav>ul>li>span:hover{background:var(--navbar-root-background--hover, var(--navbar-root-background));border-style:var(--navbar-root-border-style--hover, var(--navbar-root-border-style));border-color:var(--navbar-root-border-color--hover, var(--navbar-root-border-color));color:var(--navbar-root-color--hover, var(--navbar-root-color));-webkit-text-decoration:var(--navbar-root-text-decoration--hover, var(--navbar-root-text-decoration));text-decoration:var(--navbar-root-text-decoration--hover, var(--navbar-root-text-decoration));-webkit-text-decoration-color:var(--navbar-root-text-decoration-color--hover, var(--navbar-root-text-decoration-color));text-decoration-color:var(--navbar-root-text-decoration-color--hover, var(--navbar-root-text-decoration-color))}.app-nav>ul>li>a:not(:last-child),.app-nav>ul>li>span:not(:last-child){padding:var(--navbar-menu-root-padding, var(--navbar-root-padding));background:var(--navbar-menu-root-background, var(--navbar-root-background))}.app-nav>ul>li>a:not(:last-child):hover,.app-nav>ul>li>span:not(:last-child):hover{background:var(--navbar-menu-root-background--hover, var(--navbar-menu-root-background, var(--navbar-root-background--hover, var(--navbar-root-background))))}.app-nav>ul>li>a.active{background:var(--navbar-root-background--active, var(--navbar-root-background));border-style:var(--navbar-root-border-style--active, var(--navbar-root-border-style));border-color:var(--navbar-root-border-color--active, var(--navbar-root-border-color));color:var(--navbar-root-color--active, var(--navbar-root-color));-webkit-text-decoration:var(--navbar-root-text-decoration--active, var(--navbar-root-text-decoration));text-decoration:var(--navbar-root-text-decoration--active, var(--navbar-root-text-decoration));-webkit-text-decoration-color:var(--navbar-root-text-decoration-color--active, var(--navbar-root-text-decoration-color));text-decoration-color:var(--navbar-root-text-decoration-color--active, var(--navbar-root-text-decoration-color))}.app-nav>ul>li>a.active:not(:last-child):hover{background:var(--navbar-menu-root-background--active, var(--navbar-menu-root-background, var(--navbar-root-background--active, var(--navbar-root-background))))}.app-nav>ul>li ul{visibility:hidden;position:absolute;top:100%;right:50%;overflow-y:auto;box-sizing:border-box;max-height:50vh;padding:var(--navbar-menu-padding);border-width:var(--navbar-menu-border-width, 0);border-style:solid;border-color:var(--navbar-menu-border-color);border-radius:var(--navbar-menu-border-radius);background:var(--navbar-menu-background);box-shadow:var(--navbar-menu-box-shadow);text-align:left;white-space:nowrap;opacity:0;transform:translate(50%, -0.35em);transition:var(--navbar-menu-transition)}.app-nav>ul>li ul li{white-space:nowrap}.app-nav>ul>li ul a{margin:var(--navbar-menu-link-margin);padding:var(--navbar-menu-link-padding);border-width:var(--navbar-menu-link-border-width, 0);border-style:var(--navbar-menu-link-border-style);border-color:var(--navbar-menu-link-border-color);border-radius:var(--navbar-menu-link-border-radius);background:var(--navbar-menu-link-background);color:var(--navbar-menu-link-color);-webkit-text-decoration:var(--navbar-menu-link-text-decoration);text-decoration:var(--navbar-menu-link-text-decoration);-webkit-text-decoration-color:var(--navbar-menu-link-text-decoration-color);text-decoration-color:var(--navbar-menu-link-text-decoration-color)}.app-nav>ul>li ul a:hover{background:var(--navbar-menu-link-background--hover, var(--navbar-menu-link-background));border-style:var(--navbar-menu-link-border-style--hover, var(--navbar-menu-link-border-style));border-color:var(--navbar-menu-link-border-color--hover, var(--navbar-menu-link-border-color));color:var(--navbar-menu-link-color--hover, var(--navbar-menu-link-color));-webkit-text-decoration:var(--navbar-menu-link-text-decoration--hover, var(--navbar-menu-link-text-decoration));text-decoration:var(--navbar-menu-link-text-decoration--hover, var(--navbar-menu-link-text-decoration));-webkit-text-decoration-color:var(--navbar-menu-link-text-decoration-color--hover, var(--navbar-menu-link-text-decoration-color));text-decoration-color:var(--navbar-menu-link-text-decoration-color--hover, var(--navbar-menu-link-text-decoration-color))}.app-nav>ul>li ul a.active{background:var(--navbar-menu-link-background--active, var(--navbar-menu-link-background));border-style:var(--navbar-menu-link-border-style--active, var(--navbar-menu-link-border-style));border-color:var(--navbar-menu-link-border-color--active, var(--navbar-menu-link-border-color));color:var(--navbar-menu-link-color--active, var(--navbar-menu-link-color));-webkit-text-decoration:var(--navbar-menu-link-text-decoration--active, var(--navbar-menu-link-text-decoration));text-decoration:var(--navbar-menu-link-text-decoration--active, var(--navbar-menu-link-text-decoration));-webkit-text-decoration-color:var(--navbar-menu-link-text-decoration-color--active, var(--navbar-menu-link-text-decoration-color));text-decoration-color:var(--navbar-menu-link-text-decoration-color--active, var(--navbar-menu-link-text-decoration-color))}.app-nav>ul>li:hover ul,.app-nav>ul>li:focus ul,.app-nav>ul>li.focus-within ul{visibility:visible;opacity:1;transform:translate(50%, 0)}@media(min-width: 48em){nav.app-nav{margin-left:var(--sidebar-width)}}main{position:relative;overflow-x:hidden;min-height:100vh}.sidebar,.sidebar-toggle,.sidebar+.content{transition:all var(--sidebar-transition-duration) ease-out}@media(min-width: 48em){.sidebar+.content{margin-left:var(--sidebar-width)}}.sidebar{display:flex;flex-direction:column;position:fixed;z-index:10;top:0;right:100%;overflow-x:hidden;overflow-y:auto;height:100vh;width:var(--sidebar-width);padding:var(--sidebar-padding);border-width:var(--sidebar-border-width);border-style:solid;border-color:var(--sidebar-border-color);background:var(--sidebar-background)}.sidebar>h1{margin:0;margin:var(--sidebar-name-margin);padding:var(--sidebar-name-padding);background:var(--sidebar-name-background);color:var(--sidebar-name-color);font-family:var(--sidebar-name-font-family);font-size:var(--sidebar-name-font-size);font-weight:var(--sidebar-name-font-weight);text-align:var(--sidebar-name-text-align)}.sidebar>h1 img{max-width:100%}.sidebar>h1 .app-name-link{color:var(--sidebar-name-color)}body:not([data-platform^=Mac]) .sidebar::-webkit-scrollbar{width:5px}body:not([data-platform^=Mac]) .sidebar::-webkit-scrollbar-thumb{border-radius:50vw}@media(min-width: 48em){.sidebar{position:absolute;transform:translateX(var(--sidebar-width))}}@media print{.sidebar{display:none}}.sidebar-nav,.sidebar nav{order:1;margin:var(--sidebar-nav-margin);padding:var(--sidebar-nav-padding);background:var(--sidebar-nav-background)}.sidebar-nav ul,.sidebar nav ul{margin:0;padding:0;list-style:none}.sidebar-nav ul ul,.sidebar nav ul ul{margin-left:var(--sidebar-nav-indent)}.sidebar-nav a,.sidebar nav a{display:block;overflow:hidden;margin:var(--sidebar-nav-link-margin);padding:var(--sidebar-nav-link-padding);border-width:var(--sidebar-nav-link-border-width, 0);border-style:var(--sidebar-nav-link-border-style);border-color:var(--sidebar-nav-link-border-color);border-radius:var(--sidebar-nav-link-border-radius);background:var(--sidebar-nav-link-background);color:var(--sidebar-nav-link-color);font-weight:var(--sidebar-nav-link-font-weight);white-space:nowrap;-webkit-text-decoration:var(--sidebar-nav-link-text-decoration);text-decoration:var(--sidebar-nav-link-text-decoration);-webkit-text-decoration-color:var(--sidebar-nav-link-text-decoration-color);text-decoration-color:var(--sidebar-nav-link-text-decoration-color);text-overflow:ellipsis;transition:var(--sidebar-nav-link-transition)}.sidebar-nav a img,.sidebar nav a img{margin-top:-0.25em;vertical-align:middle}.sidebar-nav a img:first-child,.sidebar nav a img:first-child{margin-right:.5em}.sidebar-nav a:hover,.sidebar nav a:hover{border-width:var(--sidebar-nav-link-border-width--hover, var(--sidebar-nav-link-border-width, 0));border-style:var(--sidebar-nav-link-border-style--hover, var(--sidebar-nav-link-border-style));border-color:var(--sidebar-nav-link-border-color--hover, var(--sidebar-nav-link-border-color));background:var(--sidebar-nav-link-background--hover, var(--sidebar-nav-link-background));color:var(--sidebar-nav-link-color--hover, var(--sidebar-nav-link-color));font-weight:var(--sidebar-nav-link-font-weight--hover, var(--sidebar-nav-link-font-weight));-webkit-text-decoration:var(--sidebar-nav-link-text-decoration--hover, var(--sidebar-nav-link-text-decoration));text-decoration:var(--sidebar-nav-link-text-decoration--hover, var(--sidebar-nav-link-text-decoration));-webkit-text-decoration-color:var(--sidebar-nav-link-text-decoration-color);text-decoration-color:var(--sidebar-nav-link-text-decoration-color)}.sidebar-nav ul>li>span,.sidebar-nav ul>li>strong,.sidebar nav ul>li>span,.sidebar nav ul>li>strong{display:block;margin:var(--sidebar-nav-strong-margin);padding:var(--sidebar-nav-strong-padding);border-width:var(--sidebar-nav-strong-border-width, 0);border-style:solid;border-color:var(--sidebar-nav-strong-border-color);color:var(--sidebar-nav-strong-color);font-size:var(--sidebar-nav-strong-font-size);font-weight:var(--sidebar-nav-strong-font-weight);text-transform:var(--sidebar-nav-strong-text-transform)}.sidebar-nav ul>li>span+ul,.sidebar-nav ul>li>strong+ul,.sidebar nav ul>li>span+ul,.sidebar nav ul>li>strong+ul{margin-left:0}.sidebar-nav ul>li:first-child>span,.sidebar-nav ul>li:first-child>strong,.sidebar nav ul>li:first-child>span,.sidebar nav ul>li:first-child>strong{margin-top:0}.sidebar-nav::-webkit-scrollbar,.sidebar nav::-webkit-scrollbar{width:0}@supports(width: env(safe-area-inset)){@media only screen and (orientation: landscape){.sidebar-nav,.sidebar nav{margin-left:calc(env(safe-area-inset-left)/2)}}}.sidebar-nav li>a:before,.sidebar-nav li>strong:before{display:inline-block}.sidebar-nav li>a{background-repeat:var(--sidebar-nav-pagelink-background-repeat);background-size:var(--sidebar-nav-pagelink-background-size)}.sidebar-nav li>a[href^="/"]:not([href*="?id="]),.sidebar-nav li>a[href^="#/"]:not([href*="?id="]){transition:var(--sidebar-nav-pagelink-transition)}.sidebar-nav li>a[href^="/"]:not([href*="?id="]),.sidebar-nav li>a[href^="/"]:not([href*="?id="])~ul a,.sidebar-nav li>a[href^="#/"]:not([href*="?id="]),.sidebar-nav li>a[href^="#/"]:not([href*="?id="])~ul a{padding:var(--sidebar-nav-pagelink-padding, var(--sidebar-nav-link-padding))}.sidebar-nav li>a[href^="/"]:not([href*="?id="]):only-child,.sidebar-nav li>a[href^="#/"]:not([href*="?id="]):only-child{background:var(--sidebar-nav-pagelink-background)}.sidebar-nav li>a[href^="/"]:not([href*="?id="]):not(:only-child),.sidebar-nav li>a[href^="#/"]:not([href*="?id="]):not(:only-child){background:var(--sidebar-nav-pagelink-background--loaded, var(--sidebar-nav-pagelink-background))}.sidebar-nav li.active>a,.sidebar-nav li.collapse>a{border-width:var(--sidebar-nav-link-border-width--active, var(--sidebar-nav-link-border-width));border-style:var(--sidebar-nav-link-border-style--active, var(--sidebar-nav-link-border-style));border-color:var(--sidebar-nav-link-border-color--active, var(--sidebar-nav-link-border-color));background:var(--sidebar-nav-link-background--active, var(--sidebar-nav-link-background));color:var(--sidebar-nav-link-color--active, var(--sidebar-nav-link-color));font-weight:var(--sidebar-nav-link-font-weight--active, var(--sidebar-nav-link-font-weight));-webkit-text-decoration:var(--sidebar-nav-link-text-decoration--active, var(--sidebar-nav-link-text-decoration));text-decoration:var(--sidebar-nav-link-text-decoration--active, var(--sidebar-nav-link-text-decoration));-webkit-text-decoration-color:var(--sidebar-nav-link-text-decoration-color);text-decoration-color:var(--sidebar-nav-link-text-decoration-color)}.sidebar-nav li.active>a[href^="/"]:not([href*="?id="]):not(:only-child),.sidebar-nav li.active>a[href^="#/"]:not([href*="?id="]):not(:only-child){background:var(--sidebar-nav-pagelink-background--active, var(--sidebar-nav-pagelink-background--loaded, var(--sidebar-nav-pagelink-background)))}.sidebar-nav li.collapse>a[href^="/"]:not([href*="?id="]):not(:only-child),.sidebar-nav li.collapse>a[href^="#/"]:not([href*="?id="]):not(:only-child){background:var(--sidebar-nav-pagelink-background--collapse, var(--sidebar-nav-pagelink-background--loaded, var(--sidebar-nav-pagelink-background)))}.sidebar-nav li.collapse .app-sub-sidebar{display:none}.sidebar-nav>ul>li>a:before{content:var(--sidebar-nav-link-before-content-l1, var(--sidebar-nav-link-before-content));margin:var(--sidebar-nav-link-before-margin-l1, var(--sidebar-nav-link-before-margin));color:var(--sidebar-nav-link-before-color-l1, var(--sidebar-nav-link-before-color))}.sidebar-nav>ul>li.active>a:before{content:var(--sidebar-nav-link-before-content-l1--active, var(--sidebar-nav-link-before-content--active, var(--sidebar-nav-link-before-content-l1, var(--sidebar-nav-link-before-content))));color:var(--sidebar-nav-link-before-color-l1--active, var(--sidebar-nav-link-before-color--active, var(--sidebar-nav-link-before-color-l1, var(--sidebar-nav-link-before-color))))}.sidebar-nav>ul>li>ul>li>a:before{content:var(--sidebar-nav-link-before-content-l2, var(--sidebar-nav-link-before-content));margin:var(--sidebar-nav-link-before-margin-l2, var(--sidebar-nav-link-before-margin));color:var(--sidebar-nav-link-before-color-l2, var(--sidebar-nav-link-before-color))}.sidebar-nav>ul>li>ul>li.active>a:before{content:var(--sidebar-nav-link-before-content-l2--active, var(--sidebar-nav-link-before-content--active, var(--sidebar-nav-link-before-content-l2, var(--sidebar-nav-link-before-content))));color:var(--sidebar-nav-link-before-color-l2--active, var(--sidebar-nav-link-before-color--active, var(--sidebar-nav-link-before-color-l2, var(--sidebar-nav-link-before-color))))}.sidebar-nav>ul>li>ul>li>ul>li>a:before{content:var(--sidebar-nav-link-before-content-l3, var(--sidebar-nav-link-before-content));margin:var(--sidebar-nav-link-before-margin-l3, var(--sidebar-nav-link-before-margin));color:var(--sidebar-nav-link-before-color-l3, var(--sidebar-nav-link-before-color))}.sidebar-nav>ul>li>ul>li>ul>li.active>a:before{content:var(--sidebar-nav-link-before-content-l3--active, var(--sidebar-nav-link-before-content--active, var(--sidebar-nav-link-before-content-l3, var(--sidebar-nav-link-before-content))));color:var(--sidebar-nav-link-before-color-l3--active, var(--sidebar-nav-link-before-color--active, var(--sidebar-nav-link-before-color-l3, var(--sidebar-nav-link-before-color))))}.sidebar-nav>ul>li>ul>li>ul>li>ul>li>a:before{content:var(--sidebar-nav-link-before-content-l4, var(--sidebar-nav-link-before-content));margin:var(--sidebar-nav-link-before-margin-l4, var(--sidebar-nav-link-before-margin));color:var(--sidebar-nav-link-before-color-l4, var(--sidebar-nav-link-before-color))}.sidebar-nav>ul>li>ul>li>ul>li>ul>li.active>a:before{content:var(--sidebar-nav-link-before-content-l4--active, var(--sidebar-nav-link-before-content--active, var(--sidebar-nav-link-before-content-l4, var(--sidebar-nav-link-before-content))));color:var(--sidebar-nav-link-before-color-l4--active, var(--sidebar-nav-link-before-color--active, var(--sidebar-nav-link-before-color-l4, var(--sidebar-nav-link-before-color))))}.sidebar-nav>:last-child{margin-bottom:2rem}.sidebar-toggle,.sidebar-toggle-button{width:var(--sidebar-toggle-width);outline:none}.sidebar-toggle{position:fixed;z-index:11;top:0;bottom:0;left:0;max-width:40px;margin:0;padding:0;border:0;background:rgba(0,0,0,0);-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer}.sidebar-toggle .sidebar-toggle-button{position:absolute;top:var(--sidebar-toggle-offset-top);left:var(--sidebar-toggle-offset-left);height:var(--sidebar-toggle-height);border-radius:var(--sidebar-toggle-border-radius);border-width:var(--sidebar-toggle-border-width);border-style:var(--sidebar-toggle-border-style);border-color:var(--sidebar-toggle-border-color);background:var(--sidebar-toggle-background, transparent);color:var(--sidebar-toggle-icon-color)}.sidebar-toggle span{position:absolute;top:calc(50% - var(--sidebar-toggle-icon-stroke-width)/2);left:calc(50% - var(--sidebar-toggle-icon-width)/2);height:var(--sidebar-toggle-icon-stroke-width);width:var(--sidebar-toggle-icon-width);background-color:currentColor}.sidebar-toggle span:nth-child(1){margin-top:calc(0px - var(--sidebar-toggle-icon-height)/2)}.sidebar-toggle span:nth-child(3){margin-top:calc(var(--sidebar-toggle-icon-height)/2)}@media(min-width: 48em){.sidebar-toggle{position:absolute;overflow:visible;top:var(--sidebar-toggle-offset-top);bottom:auto;left:0;height:var(--sidebar-toggle-height);transform:translateX(var(--sidebar-width))}.sidebar-toggle .sidebar-toggle-button{top:0}}@media print{.sidebar-toggle{display:none}}@media(max-width: 47.99em){body.close .sidebar,body.close .sidebar-toggle,body.close .sidebar+.content{transform:translateX(var(--sidebar-width))}}@media(min-width: 48em){body.close .sidebar+.content{transform:translateX(0)}}@media(max-width: 47.99em){body.close nav.app-nav,body.close .github-corner{display:none}}@media(min-width: 48em){body.close .sidebar,body.close .sidebar-toggle{transform:translateX(0)}}@media(min-width: 48em){body.close nav.app-nav{margin-left:0}}@media(max-width: 47.99em){body.close .sidebar-toggle{width:100%;max-width:none}body.close .sidebar-toggle span{margin-top:0}body.close .sidebar-toggle span:nth-child(1){transform:rotate(45deg)}body.close .sidebar-toggle span:nth-child(2){display:none}body.close .sidebar-toggle span:nth-child(3){transform:rotate(-45deg)}}@media(min-width: 48em){body.close .sidebar+.content{margin-left:0}}@media(min-width: 48em){body.sticky .sidebar,body.sticky .sidebar-toggle{position:fixed}}body .docsify-copy-code-button,body .docsify-copy-code-button:after{border-radius:var(--border-radius-m, 0);border-top-left-radius:0;border-bottom-right-radius:0;background:var(--copycode-background);color:var(--copycode-color)}body .docsify-copy-code-button span{border-radius:var(--border-radius-s, 0)}body .docsify-pagination-container{border-top:var(--pagination-border-top);color:var(--pagination-color)}body .pagination-item-label{font-size:var(--pagination-label-font-size)}body .pagination-item-label svg{color:var(--pagination-label-color);height:var(--pagination-chevron-height);stroke:var(--pagination-chevron-stroke);stroke-linecap:var(--pagination-chevron-stroke-linecap);stroke-linejoin:var(--pagination-chevron-stroke-linecap);stroke-width:var(--pagination-chevron-stroke-width)}body .pagination-item-title{color:var(--pagination-title-color);font-size:var(--pagination-title-font-size)}body .app-name.hide{display:block}body .sidebar{padding:var(--sidebar-padding)}.sidebar .search{margin:0;padding:0;border:0}.sidebar .search input{padding:0;line-height:1;font-size:inherit}.sidebar .search .clear-button{width:auto}.sidebar .search .clear-button svg{transform:scale(1)}.sidebar .search .matching-post{border:none}.sidebar .search p{font-size:inherit}.sidebar .search{order:var(--search-flex-order);margin:var(--search-margin);padding:var(--search-padding);background:var(--search-background)}.sidebar .search a{color:inherit}.sidebar .search h2{margin:var(--search-result-heading-margin);font-size:var(--search-result-heading-font-size);font-weight:var(--search-result-heading-font-weight);color:var(--search-result-heading-color)}.sidebar .search .input-wrap{align-items:stretch;margin:var(--search-input-margin);background-color:var(--search-input-background-color);border-width:var(--search-input-border-width, 0);border-style:solid;border-color:var(--search-input-border-color);border-radius:var(--search-input-border-radius)}.sidebar .search input[type=search]{min-width:0;padding:var(--search-input-padding);border:none;background-color:rgba(0,0,0,0);background-image:var(--search-input-background-image);background-position:var(--search-input-background-position);background-repeat:var(--search-input-background-repeat);background-size:var(--search-input-background-size);font-size:var(--search-input-font-size);color:var(--search-input-color);transition:var(--search-input-transition)}.sidebar .search input[type=search]::-ms-clear{display:none}.sidebar .search input[type=search]::-moz-placeholder{color:var(--search-input-placeholder-color, #808080)}.sidebar .search input[type=search]::placeholder{color:var(--search-input-placeholder-color, #808080)}.sidebar .search input[type=search]::-webkit-input-placeholder{line-height:normal}.sidebar .search input[type=search]:focus{background-color:var(--search-input-background-color--focus, var(--search-input-background-color));background-image:var(--search-input-background-image--focus, var(--search-input-background-image));background-position:var(--search-input-background-position--focus, var(--search-input-background-position));background-size:var(--search-input-background-size--focus, var(--search-input-background-size))}@supports(width: env(safe-area-inset)){@media only screen and (orientation: landscape){.sidebar .search input[type=search]{margin-left:calc(env(safe-area-inset-left)/2)}}}.sidebar .search p{overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:2}.sidebar .search p:empty{text-align:center}.sidebar .search .clear-button{margin:0;padding:0 10px;border:none;line-height:1;background:rgba(0,0,0,0);cursor:pointer}.sidebar .search .clear-button svg circle{fill:var(--search-clear-icon-color1, #808080)}.sidebar .search .clear-button svg path{stroke:var(--search-clear-icon-color2, #fff)}.sidebar .search.show~*:not(h1){display:none}.sidebar .search .results-panel{display:none;color:var(--search-result-item-color);font-size:var(--search-result-item-font-size);font-weight:var(--search-result-item-font-weight)}.sidebar .search .results-panel.show{display:block}.sidebar .search .matching-post{margin:var(--search-result-item-margin);padding:var(--search-result-item-padding)}.sidebar .search .matching-post,.sidebar .search .matching-post:last-child{border-width:var(--search-result-item-border-width, 0) !important;border-style:var(--search-result-item-border-style);border-color:var(--search-result-item-border-color)}.sidebar .search .matching-post p{margin:0}.sidebar .search .search-keyword{margin:var(--search-result-keyword-margin);padding:var(--search-result-keyword-padding);border-radius:var(--search-result-keyword-border-radius);background-color:var(--search-result-keyword-background);color:var(--search-result-keyword-color, currentColor);font-style:normal;font-weight:var(--search-result-keyword-font-weight)}.medium-zoom-overlay,.medium-zoom-image--open,.medium-zoom-image--opened{z-index:2147483646 !important}.medium-zoom-overlay{background:var(--zoomimage-overlay-background) !important}:root{--mono-hue: 113;--mono-saturation: 0%;--mono-shade3: hsl(var(--mono-hue), var(--mono-saturation), 20%);--mono-shade2: hsl(var(--mono-hue), var(--mono-saturation), 30%);--mono-shade1: hsl(var(--mono-hue), var(--mono-saturation), 40%);--mono-base: hsl(var(--mono-hue), var(--mono-saturation), 50%);--mono-tint1: hsl(var(--mono-hue), var(--mono-saturation), 70%);--mono-tint2: hsl(var(--mono-hue), var(--mono-saturation), 89%);--mono-tint3: hsl(var(--mono-hue), var(--mono-saturation), 97%);--theme-hue: 204;--theme-saturation: 90%;--theme-lightness: 45%;--theme-color: hsl(var(--theme-hue), var(--theme-saturation), var(--theme-lightness));--modular-scale: 1.333;--modular-scale--2: calc(var(--modular-scale--1) / var(--modular-scale));--modular-scale--1: calc(var(--modular-scale-1) / var(--modular-scale));--modular-scale-1: 1rem;--modular-scale-2: calc(var(--modular-scale-1) * var(--modular-scale));--modular-scale-3: calc(var(--modular-scale-2) * var(--modular-scale));--modular-scale-4: calc(var(--modular-scale-3) * var(--modular-scale));--modular-scale-5: calc(var(--modular-scale-4) * var(--modular-scale));--font-size-xxxl: var(--modular-scale-5);--font-size-xxl: var(--modular-scale-4);--font-size-xl: var(--modular-scale-3);--font-size-l: var(--modular-scale-2);--font-size-m: var(--modular-scale-1);--font-size-s: var(--modular-scale--1);--font-size-xs: var(--modular-scale--2);--duration-slow: 1s;--duration-medium: 0.5s;--duration-fast: 0.25s;--spinner-size: 60px;--spinner-track-width: 4px;--spinner-track-color: rgba(0, 0, 0, 0.15);--spinner-transition-duration: var(--duration-medium)}:root{--base-background-color: #fff;--base-color: var(--mono-shade2);--base-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--base-font-size: 16px;--base-font-weight: normal;--base-line-height: 1.7;--emoji-size: calc(var(--base-line-height) * 1em);--hr-border: 1px solid var(--mono-tint2);--mark-background: #ffecb3;--pre-font-family: var(--code-font-family);--pre-font-size: var(--code-font-size);--pre-font-weight: normal;--selection-color: #b4d5fe;--small-font-size: var(--font-size-s);--strong-color: var(--heading-color);--strong-font-weight: 600;--subsup-font-size: var(--font-size-s)}:root{--content-max-width: 55em;--blockquote-background: var(--mono-tint3);--blockquote-border-style: solid;--blockquote-border-radius: var(--border-radius-m);--blockquote-em-font-weight: normal;--blockquote-font-weight: normal;--blockquote-padding: 1.5em;--code-font-family: Inconsolata, Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;--code-font-size: calc(var(--font-size-m) * 0.95);--code-font-weight: normal;--code-tab-size: 4;--code-block-border-radius: var(--border-radius-m);--code-block-line-height: var(--base-line-height);--code-block-margin: 1em 0;--code-block-padding: 1.75em 1.5em 1.5em 1.5em;--code-inline-background: var(--code-theme-background);--code-inline-border-radius: var(--border-radius-s);--code-inline-color: var(--code-theme-text);--code-inline-margin: 0 0.15em;--code-inline-padding: 0.125em 0.4em;--code-theme-background: var(--mono-tint3);--heading-color: var(--mono-shade3);--heading-margin: 2.5rem 0 0;--heading-h1-border-style: solid;--heading-h1-font-size: var(--font-size-xxl);--heading-h2-border-style: solid;--heading-h2-font-size: var(--font-size-xl);--heading-h3-border-style: solid;--heading-h3-font-size: var(--font-size-l);--heading-h4-border-style: solid;--heading-h4-font-size: var(--font-size-m);--heading-h5-border-style: solid;--heading-h5-font-size: var(--font-size-s);--heading-h6-border-style: solid;--heading-h6-font-size: var(--font-size-xs);--kbd-background: var(--mono-tint3);--kbd-border-radius: var(--border-radius-m);--kbd-margin: 0 0.3em;--kbd-min-width: 2.5em;--kbd-padding: 0.65em 0.5em;--link-text-decoration: underline;--notice-background: var(--mono-tint3);--notice-border-radius: var(--border-radius-m);--notice-border-style: solid;--notice-font-weight: normal;--notice-padding: 1em 1.5em;--notice-before-font-weight: normal;--table-cell-padding: 0.75em 0.5em;--table-head-border-color: var(--table-cell-border-color);--table-head-font-weight: var(--strong-font-weight);--table-row-odd-background: var(--mono-tint3)}:root{--cover-margin: 0 auto;--cover-max-width: 40em;--cover-text-align: center;--cover-background-color: var(--base-background-color);--cover-background-mask-color: var(--base-background-color);--cover-background-mask-opacity: 0.8;--cover-background-position: center center;--cover-background-repeat: no-repeat;--cover-background-size: cover;--cover-blockquote-font-size: var(--font-size-l);--cover-border-color: var(--theme-color);--cover-button-border: 1px solid var(--theme-color);--cover-button-border-radius: var(--border-radius-m);--cover-button-color: var(--theme-color);--cover-button-padding: 0.5em 2rem;--cover-button-text-decoration: none;--cover-button-transition: all var(--duration-fast) ease-in-out;--cover-button-primary-background: var(--theme-color);--cover-button-primary-border: 1px solid var(--theme-color);--cover-button-primary-color: #fff;--cover-heading-color: var(--theme-color);--cover-heading-font-size: var(--font-size-xxl);--cover-heading-font-weight: normal;--cover-link-text-decoration: underline}:root{--navbar-root-border-style: solid;--navbar-root-margin: 0 0 0 1.5em;--navbar-root-transition: all var(--duration-fast);--navbar-menu-background: var(--base-background-color);--navbar-menu-border-radius: var(--border-radius-m);--navbar-menu-box-shadow: rgba(45,45,45,0.05) 0px 0px 1px, rgba(49,49,49,0.05) 0px 1px 2px, rgba(42,42,42,0.05) 0px 2px 4px, rgba(32,32,32,0.05) 0px 4px 8px, rgba(49,49,49,0.05) 0px 8px 16px, rgba(35,35,35,0.05) 0px 16px 32px;--navbar-menu-padding: 0.5em;--navbar-menu-transition: all var(--duration-fast);--navbar-menu-link-border-style: solid;--navbar-menu-link-margin: 0.75em 0.5em;--navbar-menu-link-padding: 0.2em 0}:root{--copycode-background: #808080;--copycode-color: #fff}:root{--docsifytabs-border-color: var(--mono-tint2);--docsifytabs-border-radius-px: var(--border-radius-s);--docsifytabs-tab-background: var(--mono-tint3);--docsifytabs-tab-color: var(--mono-tint1)}:root{--pagination-border-top: 1px solid var(--mono-tint2);--pagination-chevron-height: 0.8em;--pagination-chevron-stroke: currentColor;--pagination-chevron-stroke-linecap: round;--pagination-chevron-stroke-width: 1px;--pagination-label-font-size: var(--font-size-s);--pagination-title-font-size: var(--font-size-l)}:root{--search-margin: 1.5rem 0 0;--search-input-background-repeat: no-repeat;--search-input-border-color: var(--mono-tint1);--search-input-border-width: 1px;--search-input-padding: 0.5em;--search-flex-order: 1;--search-result-heading-color: var(--heading-color);--search-result-heading-font-size: var(--base-font-size);--search-result-heading-font-weight: normal;--search-result-heading-margin: 0 0 0.25em;--search-result-item-border-color: var(--mono-tint2);--search-result-item-border-style: solid;--search-result-item-border-width: 0 0 1px 0;--search-result-item-font-weight: normal;--search-result-item-padding: 1em 0;--search-result-keyword-background: var(--mark-background);--search-result-keyword-border-radius: var(--border-radius-s);--search-result-keyword-color: var(--mark-color);--search-result-keyword-font-weight: normal;--search-result-keyword-margin: 0 0.1em;--search-result-keyword-padding: 0.2em 0}:root{--zoomimage-overlay-background: rgba(0, 0, 0, 0.875)}:root{--sidebar-background: var(--base-background-color);--sidebar-border-width: 0;--sidebar-padding: 0 25px;--sidebar-transition-duration: var(--duration-fast);--sidebar-width: 17rem;--sidebar-name-font-size: var(--font-size-l);--sidebar-name-font-weight: normal;--sidebar-name-margin: 1.5rem 0 0;--sidebar-name-text-align: center;--sidebar-nav-strong-border-color: var(--sidebar-border-color);--sidebar-nav-strong-color: var(--heading-color);--sidebar-nav-strong-font-weight: var(--strong-font-weight);--sidebar-nav-strong-margin: 1.5em 0 0.5em;--sidebar-nav-strong-padding: 0.25em 0;--sidebar-nav-indent: 1em;--sidebar-nav-margin: 1.5rem 0 0;--sidebar-nav-link-border-style: solid;--sidebar-nav-link-border-width: 0;--sidebar-nav-link-color: var(--base-color);--sidebar-nav-link-font-weight: normal;--sidebar-nav-link-padding: 0.25em 0;--sidebar-nav-link-text-decoration--active: underline;--sidebar-nav-link-text-decoration--hover: underline;--sidebar-nav-link-before-margin: 0 0.35em 0 0;--sidebar-nav-pagelink-transition: var(--sidebar-nav-link-transition);--sidebar-toggle-border-radius: var(--border-radius-s);--sidebar-toggle-border-style: solid;--sidebar-toggle-border-width: 0;--sidebar-toggle-height: 36px;--sidebar-toggle-icon-color: var(--base-color);--sidebar-toggle-icon-height: 10px;--sidebar-toggle-icon-stroke-width: 1px;--sidebar-toggle-icon-width: 16px;--sidebar-toggle-offset-left: 0;--sidebar-toggle-offset-top: calc(35px - (var(--sidebar-toggle-height) / 2));--sidebar-toggle-width: 44px}:root{--code-theme-background: #f3f3f3;--code-theme-comment: #6e8090;--code-theme-function: #dd4a68;--code-theme-keyword: #07a;--code-theme-operator: #a67f59;--code-theme-punctuation: #999;--code-theme-selector: #690;--code-theme-tag: #905;--code-theme-text: #333;--code-theme-variable: #e90}:root{--border-radius-s: 2px;--border-radius-m: 4px;--border-radius-l: 8px;--strong-font-weight: 600;--blockquote-border-color: var(--theme-color);--blockquote-border-radius: 0 var(--border-radius-m) var(--border-radius-m) 0;--blockquote-border-width: 0 0 0 4px;--code-inline-background: var(--mono-tint2);--code-theme-background: var(--mono-tint3);--heading-font-weight: var(--strong-font-weight);--heading-h1-font-weight: 400;--heading-h2-font-weight: 400;--heading-h2-border-color: var(--mono-tint2);--heading-h2-border-width: 0 0 1px 0;--heading-h2-margin: 2.5rem 0 1.5rem;--heading-h2-padding: 0 0 1rem 0;--kbd-border: 1px solid var(--mono-tint2);--notice-border-radius: 0 var(--border-radius-m) var(--border-radius-m) 0;--notice-border-width: 0 0 0 4px;--notice-padding: 1em 1.5em 1em 3em;--notice-before-border-radius: 100%;--notice-before-font-weight: bold;--notice-before-height: 1.5em;--notice-before-left: 0.75em;--notice-before-line-height: 1.5;--notice-before-margin: 0 0.25em 0 0;--notice-before-position: absolute;--notice-before-width: var(--notice-before-height);--notice-important-background: hsl(340, 60%, 96%);--notice-important-border-color: hsl(340, 90%, 45%);--notice-important-before-background: var(--notice-important-border-color) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3E%3Cpath d='M10 14C10 15.1 9.1 16 8 16 6.9 16 6 15.1 6 14 6 12.9 6.9 12 8 12 9.1 12 10 12.9 10 14Z'/%3E%3Cpath d='M10 1.6C10 1.2 9.8 0.9 9.6 0.7 9.2 0.3 8.6 0 8 0 7.4 0 6.8 0.2 6.5 0.6 6.2 0.9 6 1.2 6 1.6 6 1.7 6 1.8 6 1.9L6.8 9.6C6.9 9.9 7 10.1 7.2 10.2 7.4 10.4 7.7 10.5 8 10.5 8.3 10.5 8.6 10.4 8.8 10.3 9 10.1 9.1 9.9 9.2 9.6L10 1.9C10 1.8 10 1.7 10 1.6Z'/%3E%3C/svg%3E") center / 0.875em no-repeat;--notice-important-before-color: #fff;--notice-important-before-content: "";--notice-tip-background: hsl(204, 60%, 96%);--notice-tip-border-color: hsl(204, 90%, 45%);--notice-tip-before-background: var(--notice-tip-border-color) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3E%3Cpath d='M9.1 0C10.2 0 10.7 0.7 10.7 1.6 10.7 2.6 9.8 3.6 8.6 3.6 7.6 3.6 7 3 7 2 7 1.1 7.7 0 9.1 0Z'/%3E%3Cpath d='M5.8 16C5 16 4.4 15.5 5 13.2L5.9 9.1C6.1 8.5 6.1 8.2 5.9 8.2 5.7 8.2 4.6 8.6 3.9 9.1L3.5 8.4C5.6 6.6 7.9 5.6 8.9 5.6 9.8 5.6 9.9 6.6 9.5 8.2L8.4 12.5C8.2 13.2 8.3 13.5 8.5 13.5 8.7 13.5 9.6 13.2 10.4 12.5L10.9 13.2C8.9 15.2 6.7 16 5.8 16Z'/%3E%3C/svg%3E") center / 0.875em no-repeat;--notice-tip-before-color: #fff;--notice-tip-before-content: "";--table-cell-border-color: var(--mono-tint2);--table-cell-border-width: 1px 0;--cover-background-color: hsl(var(--theme-hue), 25%, 60%);--cover-background-image: radial-gradient(ellipse at center 115%, rgba(255, 255, 255, 0.9), transparent);--cover-blockquote-color: var(--strong-color);--cover-heading-color: #fff;--cover-heading-font-size-max: 56;--cover-heading-font-size-min: 34;--cover-heading-font-weight: 200;--navbar-root-color--active: var(--theme-color);--navbar-menu-border-radius: var(--border-radius-m);--navbar-menu-root-background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9.6' height='6' viewBox='0 0 9.6 6'%3E%3Cpath d='M1.5 1.5l3.3 3 3.3-3' stroke-width='1.5' stroke='rgb%28179, 179, 179%29' fill='none' stroke-linecap='square' stroke-linejoin='miter' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E") right no-repeat;--navbar-menu-root-padding: 0 18px 0 0;--search-input-background-color: #fff;--search-input-background-image: url("data:image/svg+xml,%3Csvg height='20px' width='20px' viewBox='0 0 24 24' fill='none' stroke='rgba(0, 0, 0, 0.3)' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' preserveAspectRatio='xMidYMid meet' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='10.5' cy='10.5' r='7.5' vector-effect='non-scaling-stroke'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='15.8' y2='15.8' vector-effect='non-scaling-stroke'%3E%3C/line%3E%3C/svg%3E");--search-input-background-position: 21px center;--search-input-border-color: var(--sidebar-border-color);--search-input-border-width: 1px 0;--search-input-margin: 0 -25px;--search-input-padding: 0.65em 1em 0.65em 50px;--search-input-placeholder-color: rgba(0, 0, 0, 0.4);--search-clear-icon-color1: rgba(0, 0, 0, 0.3);--search-result-heading-font-weight: var(--strong-font-weight);--search-result-item-border-color: var(--sidebar-border-color);--search-result-keyword-border-radius: var(--border-radius-s);--sidebar-background: var(--mono-tint3);--sidebar-border-color: var(--mono-tint2);--sidebar-border-width: 0 1px 0 0;--sidebar-name-color: var(--theme-color);--sidebar-name-font-weight: 300;--sidebar-nav-strong-border-width: 0 0 1px 0;--sidebar-nav-strong-font-size: smaller;--sidebar-nav-strong-margin: 2em -25px 0.75em 0;--sidebar-nav-strong-padding: 0.25em 0 0.75em 0;--sidebar-nav-strong-text-transform: uppercase;--sidebar-nav-link-border-color: transparent;--sidebar-nav-link-border-color--active: var(--theme-color);--sidebar-nav-link-border-width: 0 4px 0 0;--sidebar-nav-link-color--active: var(--theme-color);--sidebar-nav-link-margin: 0 -25px 0 0;--sidebar-nav-link-text-decoration: none;--sidebar-nav-link-text-decoration--active: none;--sidebar-nav-link-text-decoration--hover: underline;--sidebar-nav-pagelink-background: no-repeat 2px calc(50% - 2.5px) / 6px 5px linear-gradient(45deg, transparent 2.75px, var(--mono-tint1) 2.75px 4.25px, transparent 4px), no-repeat 2px calc(50% + 2.5px) / 6px 5px linear-gradient(135deg, transparent 2.75px, var(--mono-tint1) 2.75px 4.25px, transparent 4px);--sidebar-nav-pagelink-background--active: no-repeat 0px center / 5px 6px linear-gradient(225deg, transparent 2.75px, var(--theme-color) 2.75px 4.25px, transparent 4.25px), no-repeat 5px center / 5px 6px linear-gradient(135deg, transparent 2.75px, var(--theme-color) 2.75px 4.25px, transparent 4.25px);--sidebar-nav-pagelink-background--collapse: no-repeat 2px calc(50% - 2.5px) / 6px 5px linear-gradient(45deg, transparent 2.75px, var(--theme-color) 2.75px 4.25px, transparent 4px), no-repeat 2px calc(50% + 2.5px) / 6px 5px linear-gradient(135deg, transparent 2.75px, var(--theme-color) 2.75px 4.25px, transparent 4px);--sidebar-nav-pagelink-background--loaded: no-repeat 0px center / 5px 6px linear-gradient(225deg, transparent 2.75px, var(--mono-tint1) 2.75px 4.25px, transparent 4.25px), no-repeat 5px center / 5px 6px linear-gradient(135deg, transparent 2.75px, var(--mono-tint1) 2.75px 4.25px, transparent 4.25px);--sidebar-nav-pagelink-padding: 0.25em 0 0.25em 20px;--sidebar-nav-pagelink-transition: none;--sidebar-toggle-background: var(--sidebar-border-color);--sidebar-toggle-border-radius: 0 var(--border-radius-s) var(--border-radius-s) 0;--sidebar-toggle-width: 32px}:root{--code-theme-background: #222;--code-theme-comment: #516e7a;--code-theme-function: #f07178;--code-theme-keyword: #c2e78c;--code-theme-operator: #ffcb6b;--code-theme-punctuation: #89ddff;--code-theme-selector: #ffcb6b;--code-theme-tag: #f07178;--code-theme-text: #f3f3f3;--code-theme-variable: #ffcb6b}:root{--mono-hue: 201;--mono-saturation: 18%;--mono-shade3: hsl(var(--mono-hue), var(--mono-saturation), 13%);--mono-shade2: hsl(var(--mono-hue), var(--mono-saturation), 15%);--mono-shade1: hsl(var(--mono-hue), var(--mono-saturation), 17%);--mono-base: hsl(var(--mono-hue), var(--mono-saturation), 19%);--mono-tint1: hsl(var(--mono-hue), var(--mono-saturation), 25%);--mono-tint2: hsl(var(--mono-hue), var(--mono-saturation), 35%);--mono-tint3: hsl(var(--mono-hue), var(--mono-saturation), 43%);--spinner-track-color: rgba(255, 255, 255, 0.15);--base-background-color: var(--mono-base);--base-color: #d3d3d3;--hr-border: 1px solid var(--mono-tint2);--mark-background: #ffcb6b;--mark-color: var(--base-background-color);--selection-color: rgba(94, 131, 175, 0.75);--blockquote-background: var(--mono-shade2);--code-inline-background: var(--mono-tint1);--code-theme-background: var(--mono-shade2);--heading-color: #fff;--heading-h2-border-color: var(--mono-tint2);--kbd-background: var(--mono-shade2);--kbd-border: none;--kbd-color: var(--strong-color);--notice-important-background: var(--mono-shade2);--notice-tip-background: var(--mono-shade2);--table-cell-border-color: var(--mono-tint1);--table-row-odd-background: var(--mono-shade2);--cover-background-color: var(--base-background-color);--cover-background-image: radial-gradient(ellipse at center bottom, var(--mono-tint3), transparent);--cover-blockquote-color: var(--mark-background);--cover-button-border: 1px solid var(--mono-tint3);--cover-button-color: #fff;--navbar-menu-background: var(--mono-tint1);--navbar-menu-box-shadow: rgba(0,0,0,0.05) 0px 0px 1px, rgba(0,0,0,0.05) 0px 1px 2px, rgba(0,0,0,0.05) 0px 2px 4px, rgba(0,0,0,0.05) 0px 4px 8px, rgba(0,0,0,0.05) 0px 8px 16px, rgba(0,0,0,0.05) 0px 16px 32px;--copycode-background: var(--mono-tint1);--copycode-color: #fff;--docsifytabs-border-color: var(--mono-tint2);--docsifytabs-tab-background: var(--mono-shade1);--docsifytabs-tab-color: var(--mono-tint2);--pagination-border-top: 1px solid var(--mono-tint2);--pagination-title-color: #fff;--search-input-background-color: var(--mono-shade2);--search-input-background-image: url("data:image/svg+xml,%3Csvg height='20px' width='20px' viewBox='0 0 24 24' fill='none' stroke='rgba(255, 255, 255, 0.3)' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' preserveAspectRatio='xMidYMid meet' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='10.5' cy='10.5' r='7.5' vector-effect='non-scaling-stroke'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='15.8' y2='15.8' vector-effect='non-scaling-stroke'%3E%3C/line%3E%3C/svg%3E");--search-input-border-color: var(--mono-tint1);--search-input-placeholder-color: rgba(255, 255, 255, 0.4);--search-clear-icon-color1: rgba(255, 255, 255, 0.3);--sidebar-background: var(--mono-shade1);--sidebar-border-color: var(--mono-tint1);--sidebar-nav-pagelink-background: no-repeat 2px calc(50% - 2.5px) / 6px 5px linear-gradient(45deg, transparent 2.75px, var(--mono-tint2) 2.75px 4.25px, transparent 4px), no-repeat 2px calc(50% + 2.5px) / 6px 5px linear-gradient(135deg, transparent 2.75px, var(--mono-tint2) 2.75px 4.25px, transparent 4px);--sidebar-nav-pagelink-background--loaded: no-repeat 0px center / 5px 6px linear-gradient(225deg, transparent 2.75px, var(--mono-tint2) 2.75px 4.25px, transparent 4.25px), no-repeat 5px center / 5px 6px linear-gradient(135deg, transparent 2.75px, var(--mono-tint2) 2.75px 4.25px, transparent 4.25px)} 2 | 3 | /*# sourceMappingURL=theme-simple-dark.css.map */ -------------------------------------------------------------------------------- /docs/vendor/docsify-themeable/theme-simple-dark.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../../build/css/theme-simple-dark.css","../../src/scss/app/_app.scss","../../src/scss/app/_base.scss","../../src/scss/app/__variables.scss","../../src/scss/app/_code.scss","../../src/scss/app/_content.scss","../../node_modules/include-media/dist/_include-media.scss","../../src/scss/app/_cover.scss","../../src/scss/app/_navbar.scss","../../src/scss/app/_sidebar.scss","../../src/scss/app/_plugin-copy-code.scss","../../src/scss/app/_plugin-pagination.scss","../../src/scss/app/_plugin-search.scss","../../src/scss/app/_plugin-zoom-image.scss","../../src/scss/themes/defaults/_app.css","../../src/scss/themes/defaults/_base.css","../../src/scss/themes/defaults/_content.css","../../src/scss/themes/defaults/_cover.css","../../src/scss/themes/defaults/_navbar.css","../../src/scss/themes/defaults/_plugin-copy-code.css","../../src/scss/themes/defaults/_plugin-docsify-tabs.css","../../src/scss/themes/defaults/_plugin-pagination.css","../../src/scss/themes/defaults/_plugin-search.css","../../src/scss/themes/defaults/_plugin-zoom-image.css","../../src/scss/themes/defaults/_sidebar.css","../../src/scss/themes/shared/_code-light.scss","../../src/scss/themes/theme-simple.scss","../../src/scss/themes/shared/_code-dark.scss","../../src/scss/themes/theme-simple-dark.scss"],"names":[],"mappings":"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","file":"theme-simple-dark.css"} -------------------------------------------------------------------------------- /docs/vendor/prismjs/prism-bash.min.js: -------------------------------------------------------------------------------- 1 | !function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",a={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},n={bash:a,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:a}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:n},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:n.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},a.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=n.variable[1].inside,i=0;i|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var n={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var t="(?:"+["([^a-zA-Z0-9\\s{(\\[<=])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^]|\\((?:[^()\\\\]|\\\\[^])*\\))*\\)","\\{(?:[^{}\\\\]|\\\\[^]|\\{(?:[^{}\\\\]|\\\\[^])*\\})*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^]|\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\])*\\]","<(?:[^<>\\\\]|\\\\[^]|<(?:[^<>\\\\]|\\\\[^])*>)*>"].join("|")+")",i='(?:"(?:\\\\.|[^"\\\\\r\n])*"|(?:\\b[a-zA-Z_]\\w*|[^\\s\0-\\x7F]+)[?!]?|\\$.)';e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp("%r"+t+"[egimnosux]{0,6}"),greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp("(^|[^:]):"+i),lookbehind:!0,greedy:!0},{pattern:RegExp("([\r\n{(,][ \t]*)"+i+"(?=:(?!:))"),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp("%[qQiIwWs]?"+t),greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp("%x"+t),greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism); -------------------------------------------------------------------------------- /docs/vendor/prismjs/prism-tomorrow.min.css: -------------------------------------------------------------------------------- 1 | code[class*=language-],pre[class*=language-]{color:#ccc;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green} -------------------------------------------------------------------------------- /docs/vendor/prismjs/prism-yaml.min.js: -------------------------------------------------------------------------------- 1 | Prism.languages.yaml={scalar:{pattern:/([\-:]\s*(![^\s]+)?[ \t]*[|>])[ \t]*(?:(\n[ \t]+)[^\r\n]+(?:\3[^\r\n]+)*)/,lookbehind:!0,alias:"string"},comment:/#[^\n]+/,key:{pattern:/(\s*[:\-,[{\n?][ \t]*(![^\s]+)?[ \t]*)[^\n{[\]},#]+?(?=\s*:\s)/,lookbehind:!0,alias:"atrule"},directive:{pattern:/((^|\n)[ \t]*)%[^\n]+/,lookbehind:!0,alias:"important"},datetime:{pattern:/([:\-,[{]\s*(![^\s]+)?[ \t]*)(\d{4}-\d\d?-\d\d?([tT]|[ \t]+)\d\d?:\d{2}:\d{2}(\.\d*)?[ \t]*(Z|[-+]\d\d?(:\d{2})?)?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(:\d{2}(\.\d*)?)?)(?=[ \t]*(\n|$|,|]|}))/,lookbehind:!0,alias:"number"},"boolean":{pattern:/([:\-,[{]\s*(![^\s]+)?[ \t]*)(true|false)[ \t]*(?=\n|$|,|]|})/i,lookbehind:!0,alias:"important"},"null":{pattern:/([:\-,[{]\s*(![^\s]+)?[ \t]*)(null|~)[ \t]*(?=\n|$|,|]|})/i,lookbehind:!0,alias:"important"},string:{pattern:/([:\-,[{]\s*(![^\s]+)?[ \t]*)("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')(?=[ \t]*(\n|$|,|]|}))/,lookbehind:!0},number:{pattern:/([:\-,[{]\s*(![^\s]+)?[ \t]*)[+\-]?(0x[\dA-Fa-f]+|0o[0-7]+|(\d+\.?\d*|\.?\d+)(e[\+\-]?\d+)?|\.inf|\.nan)[ \t]*(?=\n|$|,|]|})/i,lookbehind:!0},tag:/![^\s]+/,important:/[&*][\w]+/,punctuation:/([:[\]{}\-,|>?]|---|\.\.\.)/}; --------------------------------------------------------------------------------