diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 3ce7003..0903603 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,38 +1,38 @@ -# Update the NODE_VERSION arg in docker-compose.yml to pick a Node version: 18, 16, 14 -ARG NODE_VERSION=16 -FROM mcr.microsoft.com/devcontainers/javascript-node:${NODE_VERSION} - -# VARIANT can be either 'hugo' for the standard version or 'hugo_extended' for the extended version. -ARG VARIANT=hugo -# VERSION can be either 'latest' or a specific version number -ARG VERSION=latest - -# Download Hugo -RUN apt-get update && apt-get install -y ca-certificates openssl git curl && \ - rm -rf /var/lib/apt/lists/* && \ - case ${VERSION} in \ - latest) \ - export VERSION=$(curl -s https://api.github.com/repos/gohugoio/hugo/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}') ;;\ - esac && \ - echo ${VERSION} && \ - case $(uname -m) in \ - aarch64) \ - export ARCH=ARM64 ;; \ - *) \ - export ARCH=64bit ;; \ - esac && \ - echo ${ARCH} && \ - wget -O ${VERSION}.tar.gz https://github.com/gohugoio/hugo/releases/download/v${VERSION}/${VARIANT}_${VERSION}_Linux-${ARCH}.tar.gz && \ - tar xf ${VERSION}.tar.gz && \ - mv hugo /usr/bin/hugo - -# Hugo dev server port -EXPOSE 1313 - -# [Optional] Uncomment this section to install additional OS packages you may want. -# -# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ -# && apt-get -y install --no-install-recommends - -# [Optional] Uncomment if you want to install more global node packages -# RUN sudo -u node npm install -g +# Update the NODE_VERSION arg in docker-compose.yml to pick a Node version: 18, 16, 14 +ARG NODE_VERSION=16 +FROM mcr.microsoft.com/devcontainers/javascript-node:${NODE_VERSION} + +# VARIANT can be either 'hugo' for the standard version or 'hugo_extended' for the extended version. +ARG VARIANT=hugo +# VERSION can be either 'latest' or a specific version number +ARG VERSION=latest + +# Download Hugo +RUN apt-get update && apt-get install -y ca-certificates openssl git curl && \ + rm -rf /var/lib/apt/lists/* && \ + case ${VERSION} in \ + latest) \ + export VERSION=$(curl -s https://api.github.com/repos/gohugoio/hugo/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}') ;;\ + esac && \ + echo ${VERSION} && \ + case $(uname -m) in \ + aarch64) \ + export ARCH=ARM64 ;; \ + *) \ + export ARCH=64bit ;; \ + esac && \ + echo ${ARCH} && \ + wget -O ${VERSION}.tar.gz https://github.com/gohugoio/hugo/releases/download/v${VERSION}/${VARIANT}_${VERSION}_Linux-${ARCH}.tar.gz && \ + tar xf ${VERSION}.tar.gz && \ + mv hugo /usr/bin/hugo + +# Hugo dev server port +EXPOSE 1313 + +# [Optional] Uncomment this section to install additional OS packages you may want. +# +# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ +# && apt-get -y install --no-install-recommends + +# [Optional] Uncomment if you want to install more global node packages +# RUN sudo -u node npm install -g diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index d35215b..9f2e2ca 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,57 +1,57 @@ -{ - "name": "Hugo (Community)", - "build": { - "dockerfile": "Dockerfile", - "args": { - // Update VARIANT to pick hugo variant. - // Example variants: hugo, hugo_extended - // Rebuild the container if it already exists to update. - "VARIANT": "hugo_extended", - // Update VERSION to pick a specific hugo version. - // Example versions: latest, 0.73.0, 0,71.1, 0.109.0 - // Rebuild the container if it already exists to update. - "VERSION": "0.109.0", - // Update NODE_VERSION to pick the Node.js version: 12, 14 - "NODE_VERSION": "14" - } - }, - - // Configure tool-specific properties. - "customizations": { - // Configure properties specific to VS Code. - "vscode": { - // Set *default* container specific settings.json values on container create. - "settings": { - "html.format.templating": true - }, - - // Add the IDs of extensions you want installed when the container is created. - "extensions": [ - "bungcip.better-toml", - "davidanson.vscode-markdownlint" - ] - } - }, - - // Use 'forwardPorts' to make a list of ports inside the container available locally. - "forwardPorts": [ - 1313 - ], - - "updateContentCommand": "git config --global --add safe.directory /workspaces/my-useful-commands && rm -rf public", - - // Use 'postCreateCommand' to run commands after the container is created. - "postCreateCommand": "git submodule init && git submodule update --remote && hugo", - - // Set `remoteUser` to `root` to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. - "remoteUser": "node", - "mounts": [ - // V: i.e /v/ - - { - "source": "c:\\common-files", - "target": "/v/", - "type": "bind" - } - ] -} +{ + "name": "Hugo (Community)", + "build": { + "dockerfile": "Dockerfile", + "args": { + // Update VARIANT to pick hugo variant. + // Example variants: hugo, hugo_extended + // Rebuild the container if it already exists to update. + "VARIANT": "hugo_extended", + // Update VERSION to pick a specific hugo version. + // Example versions: latest, 0.148.2, 0.109.0 + // Rebuild the container if it already exists to update. + "VERSION": "0.148.2", + // Update NODE_VERSION to pick the Node.js version: 18, 20, 22 + "NODE_VERSION": "20" + } + }, + + // Configure tool-specific properties. + "customizations": { + // Configure properties specific to VS Code. + "vscode": { + // Set *default* container specific settings.json values on container create. + "settings": { + "html.format.templating": true + }, + + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "bungcip.better-toml", + "davidanson.vscode-markdownlint" + ] + } + }, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + "forwardPorts": [ + 1313 + ], + + "updateContentCommand": "git config --global --add safe.directory /workspaces/my-useful-commands && rm -rf public", + + // Use 'postCreateCommand' to run commands after the container is created. + "postCreateCommand": "git submodule init && git submodule update --remote && hugo", + + // Set `remoteUser` to `root` to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. + "remoteUser": "node", + "mounts": [ + // V: i.e /v/ + + { + "source": "c:\\common-files", + "target": "/v/", + "type": "bind" + } + ] +} diff --git a/.npmignore b/.npmignore index ecb7192..b6c8083 100644 --- a/.npmignore +++ b/.npmignore @@ -1,6 +1,6 @@ -README.md -test-project -definition-manifest.json -.vscode -.npmignore -WORKSPACE +README.md +test-project +definition-manifest.json +.vscode +.npmignore +WORKSPACE diff --git a/.vscode/launch.json b/.vscode/launch.json index 80ea7eb..35f8652 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,54 +1,54 @@ -{ - "configurations": [ - { - "type": "pwa-msedge", - "name": "Launch Microsoft Edge", - "request": "launch", - "runtimeArgs": [ - "--remote-debugging-port=9222" - ], - "url": "http://localhost:1313/", // Provide your project's url to finish configuring - "presentation": { - "hidden": true - } - }, - { - "type": "pwa-msedge", - "name": "Launch Microsoft Edge in headless mode", - "request": "launch", - "runtimeArgs": [ - "--headless", - "--remote-debugging-port=9222" - ], - "url": "http://localhost:1313/", // Provide your project's url to finish configuring - "presentation": { - "hidden": true - } - }, - { - "type": "vscode-edge-devtools.debug", - "name": "Open Edge DevTools", - "request": "attach", - "url": "http://localhost:1313/", // Provide your project's url to finish configuring - "presentation": { - "hidden": true - } - } - ], - "compounds": [ - { - "name": "Launch Edge Headless and attach DevTools", - "configurations": [ - "Launch Microsoft Edge in headless mode", - "Open Edge DevTools" - ] - }, - { - "name": "Launch Edge and attach DevTools", - "configurations": [ - "Launch Microsoft Edge", - "Open Edge DevTools" - ] - } - ] +{ + "configurations": [ + { + "type": "pwa-msedge", + "name": "Launch Microsoft Edge", + "request": "launch", + "runtimeArgs": [ + "--remote-debugging-port=9222" + ], + "url": "http://localhost:1313/", // Provide your project's url to finish configuring + "presentation": { + "hidden": true + } + }, + { + "type": "pwa-msedge", + "name": "Launch Microsoft Edge in headless mode", + "request": "launch", + "runtimeArgs": [ + "--headless", + "--remote-debugging-port=9222" + ], + "url": "http://localhost:1313/", // Provide your project's url to finish configuring + "presentation": { + "hidden": true + } + }, + { + "type": "vscode-edge-devtools.debug", + "name": "Open Edge DevTools", + "request": "attach", + "url": "http://localhost:1313/", // Provide your project's url to finish configuring + "presentation": { + "hidden": true + } + } + ], + "compounds": [ + { + "name": "Launch Edge Headless and attach DevTools", + "configurations": [ + "Launch Microsoft Edge in headless mode", + "Open Edge DevTools" + ] + }, + { + "name": "Launch Edge and attach DevTools", + "configurations": [ + "Launch Microsoft Edge", + "Open Edge DevTools" + ] + } + ] } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 5f702e8..009aac8 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,28 +1,28 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=733558 - // for the documentation about the tasks.json format - "version": "2.0.0", - "tasks": [ - { - "label": "Serve Drafts", - "type": "shell", - "command": "hugo server -D", - "group": { - "kind": "test", - "isDefault": true - }, - "isBackground": true, - "problemMatcher": [] - }, - { - "label": "Build", - "type": "shell", - "command": "hugo", - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [] - } - ] +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Serve Drafts", + "type": "shell", + "command": "hugo server -D", + "group": { + "kind": "test", + "isDefault": true + }, + "isBackground": true, + "problemMatcher": [] + }, + { + "label": "Build", + "type": "shell", + "command": "hugo", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [] + } + ] } \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md index a8c68a1..240676c 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,21 +1,21 @@ -MIT License - -Copyright (c) 2023 Vidhyadharan Deivamani - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2023 Vidhyadharan Deivamani + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/config.toml b/config.toml index c157228..8b46fcb 100644 --- a/config.toml +++ b/config.toml @@ -10,6 +10,10 @@ homepage = "https://vidhya03.labkit.in" # Change the default theme to be use when building the site with Hugo theme = "LoveIt" +# Pagination configuration +[pagination] +pagerSize = 12 + # whether to use robots.txt enableRobotsTXT = true # whether to use git commit log @@ -126,7 +130,8 @@ enableEmoji = true # whether to include Chinese/Japanese/Korean hasCJKLanguage = false # default amount of posts in each pages - paginate = 12 + [languages.en.pagination] + pagerSize = 12 # [UA-XXXXXXXX-X] google analytics code googleAnalytics = "" # copyright description used only for seo schema @@ -241,7 +246,8 @@ enableEmoji = true [languages.en.params.home.posts] enable = true # special amount of posts in each home posts page - paginate = 6 + [languages.en.params.home.posts.pagination] + pagerSize = 6 # Social config in home page [languages.en.params.social] GitHub = "vidhya03" @@ -352,7 +358,6 @@ enableEmoji = true page = ["HTML"] section = ["HTML", "RSS"] taxonomy = ["HTML", "RSS"] - taxonomyTerm = ["HTML"] [outputFormats.Algolia] baseName = "algolia" isPlainText = true diff --git a/content/posts/automating-efficiency-and-saving-time/index.en.md b/content/posts/automating-efficiency-and-saving-time/index.en.md index 51b5646..b6a7766 100644 --- a/content/posts/automating-efficiency-and-saving-time/index.en.md +++ b/content/posts/automating-efficiency-and-saving-time/index.en.md @@ -1,102 +1,102 @@ ---- -title: "Eliminating Repetitive Version Changes in Multiple Repositories: -Automating Efficiency and Saving Time" -date: 2023-06-26T01:11:15+05:30 -lastmod: 2023-06-26T01:11:15+05:30 -draft: false -author: "Vidhya" -description: "Eliminating Repetitive Version Changes in Multiple Repositories: -Automating Efficiency and Saving Time" - -tags: ["tools", "automation"] -categories: ["bash","git","github"] - -resources: -- name: "featured-image" - src: "feature-automation.jpg" - -toc: - auto: true ---- - -## Introduction: -In the fast-paced world of software development, staying up-to-date with version changes is crucial. However, repetitive tasks like manually updating version properties across multiple repositories can be time-consuming and prone to errors. In this blog post, we'll explore a real-life example inspired by **James Surowiecki's** concept of `"addition by subtraction"` and discuss how automating version changes not only solves a common problem but also saves valuable time. - -# The Challenge of Manual Version Changes - The Friction Point: - -Imagine a scenario where a software development team is responsible for maintaining different repositories for their projects. With each release, the team must manually update the version property in each repository, commit the changes, and raise a pull request. This laborious process not only consumes a significant amount of time but also introduces the risk of inconsistencies and human errors in versioning. - -## Drawing Inspiration from Lean Production: -**James Surowiecki's** observations about lean production in Japanese factories provide valuable insights into streamlining processes and eliminating waste. The Japanese companies identified points of friction in their manufacturing process and eliminated them, resulting in improved efficiency and product reliability. We can apply a similar approach to our version change problem by seeking to automate the process and eliminate repetitive effort. - -## Automating Version Changes: -Recognizing the need for a more efficient solution, our development team decided to automate the version change process. They leveraged their knowledge of scripting and version control systems to create a custom solution that would save time and reduce the risk of errors. - -## Implementation and Benefits: -we could use the below script that could automatically update the version property in all repositories simultaneously. With the new automated workflow, the process became as simple as executing a single command. The script would make the necessary changes, commit them, and even raise the pull request if desired. - -### The script: - -{{< gist vidhya03 1111d883b31cc7dfb7821b10ca8a58ae version-change.sh >}} -The script performs the following steps: - -1. Set the `dir_root_path` variable to the root directory path where the code will be cloned. - -2. Create an array named `files` that contains a list of microservices along with their corresponding GitHub clone URLs. Each element in the array consists of two parts separated by a semicolon (;): the microservice directory name and the clone URL. - -3. Set various variables such as `itrac_codeline`, `old_version`, `new_version`, `label`, and `newbranch` to specific values. - -4. Enter a loop to iterate over each element in the `files` array. - -5. For each iteration, split the current element into two parts (directory name and clone URL) using the semicolon as the delimiter. Store these parts in the `Array` variable. - -6. Extract the directory name and clone URL from the `Array` variable and store them in `dir_name` and `clone_url` respectively. - -7. Print the full path of the microservice directory using the `dir_root_path` and `dir_name` variables. - -8. Clone the microservice repository from the provided `clone_url` using the `git clone` command. The `core.sshCommand` option is set to specify the SSH key to use for authentication(here i used sshkey without password - this file can be passed securely). - -9. Change the current working directory to the cloned repository. - -10. Checkout the `develop` branch. - -11. Perform a hard reset to the `origin/develop` branch to discard any local changes. - -12. Pull the latest changes from the remote `develop` branch. - -13. Configure the git user name and email. - -14. Create and checkout a new branch named `$newbranch` based on the provided `itrac_codeline`. - -15. Use the `sed` command to replace the occurrence of the `old_version` with the `new_version` in the `gradle.properties` file within the microservice directory. - -16. Stage the modified `gradle.properties` file using `git add`. - -17. Commit the changes with a commit message indicating the updated version. - -18. Push the changes to the remote repository with the specified upstream branch. - -19. Use the GitHub CLI (`gh`) to create a pull request (`pr`) with the provided title, body, base branch (`develop`), head branch (`newbranch`), reviewer, and label. - -20. Finally, print a message indicating that the new branch and pull request have been created for the current microservice. - - - -## The Impact of Automation: -By implementing this automation, the development team experienced a significant reduction in the time and effort required for version changes. Previously, manually updating the version in each repository could take up to an hour per release. With the automated solution, the entire process was streamlined, saving them valuable time that could be better utilized for more critical tasks. Furthermore, the script served as a `scalable solution`, capable of accommodating additional repositories or adapting to changing project requirements. - - -## Embracing the Philosophy of "Addition by Subtraction": -The successful automation of version changes aligns with James Surowiecki's concept of "addition by subtraction." By eliminating the friction points and wasteful effort associated with manual version updates, the team achieved greater efficiency and productivity. Furthermore, the reduced cognitive load resulting from a more streamlined process contributed to a more positive work environment. - -## Conclusion: - -Automating version changes in multiple repositories is a game-changer for software development teams. By embracing the principles of lean production and leveraging automation, teams can eliminate repetitive and time-consuming tasks, significantly improving efficiency and productivity. The custom automation script showcased how version updates can be streamlined, saving valuable time and mitigating the risk of errors. As development teams continue to adopt automation, they empower themselves to focus on high-value activities, fostering innovation and driving their projects forward. - -Automate your version changes and witness the transformation in your development process. Say goodbye to the tedious and error-prone manual updates, and embrace the power of automation for efficiency and time savings in your software development journey. - -{{< admonition type=tip open=true >}} - Personally I use various codeline automation scripts. For label creation, branch out to release branch, auto labeling. These are inspired from microsoft vscode PR bot. -{{< /admonition >}} - - +--- +title: "Eliminating Repetitive Version Changes in Multiple Repositories: +Automating Efficiency and Saving Time" +date: 2023-06-26T01:11:15+05:30 +lastmod: 2023-06-26T01:11:15+05:30 +draft: false +author: "Vidhya" +description: "Eliminating Repetitive Version Changes in Multiple Repositories: +Automating Efficiency and Saving Time" + +tags: ["tools", "automation"] +categories: ["bash","git","github"] + +resources: +- name: "featured-image" + src: "feature-automation.jpg" + +toc: + auto: true +--- + +## Introduction: +In the fast-paced world of software development, staying up-to-date with version changes is crucial. However, repetitive tasks like manually updating version properties across multiple repositories can be time-consuming and prone to errors. In this blog post, we'll explore a real-life example inspired by **James Surowiecki's** concept of `"addition by subtraction"` and discuss how automating version changes not only solves a common problem but also saves valuable time. + +# The Challenge of Manual Version Changes - The Friction Point: + +Imagine a scenario where a software development team is responsible for maintaining different repositories for their projects. With each release, the team must manually update the version property in each repository, commit the changes, and raise a pull request. This laborious process not only consumes a significant amount of time but also introduces the risk of inconsistencies and human errors in versioning. + +## Drawing Inspiration from Lean Production: +**James Surowiecki's** observations about lean production in Japanese factories provide valuable insights into streamlining processes and eliminating waste. The Japanese companies identified points of friction in their manufacturing process and eliminated them, resulting in improved efficiency and product reliability. We can apply a similar approach to our version change problem by seeking to automate the process and eliminate repetitive effort. + +## Automating Version Changes: +Recognizing the need for a more efficient solution, our development team decided to automate the version change process. They leveraged their knowledge of scripting and version control systems to create a custom solution that would save time and reduce the risk of errors. + +## Implementation and Benefits: +we could use the below script that could automatically update the version property in all repositories simultaneously. With the new automated workflow, the process became as simple as executing a single command. The script would make the necessary changes, commit them, and even raise the pull request if desired. + +### The script: + +{{< gist vidhya03 1111d883b31cc7dfb7821b10ca8a58ae version-change.sh >}} +The script performs the following steps: + +1. Set the `dir_root_path` variable to the root directory path where the code will be cloned. + +2. Create an array named `files` that contains a list of microservices along with their corresponding GitHub clone URLs. Each element in the array consists of two parts separated by a semicolon (;): the microservice directory name and the clone URL. + +3. Set various variables such as `itrac_codeline`, `old_version`, `new_version`, `label`, and `newbranch` to specific values. + +4. Enter a loop to iterate over each element in the `files` array. + +5. For each iteration, split the current element into two parts (directory name and clone URL) using the semicolon as the delimiter. Store these parts in the `Array` variable. + +6. Extract the directory name and clone URL from the `Array` variable and store them in `dir_name` and `clone_url` respectively. + +7. Print the full path of the microservice directory using the `dir_root_path` and `dir_name` variables. + +8. Clone the microservice repository from the provided `clone_url` using the `git clone` command. The `core.sshCommand` option is set to specify the SSH key to use for authentication(here i used sshkey without password - this file can be passed securely). + +9. Change the current working directory to the cloned repository. + +10. Checkout the `develop` branch. + +11. Perform a hard reset to the `origin/develop` branch to discard any local changes. + +12. Pull the latest changes from the remote `develop` branch. + +13. Configure the git user name and email. + +14. Create and checkout a new branch named `$newbranch` based on the provided `itrac_codeline`. + +15. Use the `sed` command to replace the occurrence of the `old_version` with the `new_version` in the `gradle.properties` file within the microservice directory. + +16. Stage the modified `gradle.properties` file using `git add`. + +17. Commit the changes with a commit message indicating the updated version. + +18. Push the changes to the remote repository with the specified upstream branch. + +19. Use the GitHub CLI (`gh`) to create a pull request (`pr`) with the provided title, body, base branch (`develop`), head branch (`newbranch`), reviewer, and label. + +20. Finally, print a message indicating that the new branch and pull request have been created for the current microservice. + + + +## The Impact of Automation: +By implementing this automation, the development team experienced a significant reduction in the time and effort required for version changes. Previously, manually updating the version in each repository could take up to an hour per release. With the automated solution, the entire process was streamlined, saving them valuable time that could be better utilized for more critical tasks. Furthermore, the script served as a `scalable solution`, capable of accommodating additional repositories or adapting to changing project requirements. + + +## Embracing the Philosophy of "Addition by Subtraction": +The successful automation of version changes aligns with James Surowiecki's concept of "addition by subtraction." By eliminating the friction points and wasteful effort associated with manual version updates, the team achieved greater efficiency and productivity. Furthermore, the reduced cognitive load resulting from a more streamlined process contributed to a more positive work environment. + +## Conclusion: + +Automating version changes in multiple repositories is a game-changer for software development teams. By embracing the principles of lean production and leveraging automation, teams can eliminate repetitive and time-consuming tasks, significantly improving efficiency and productivity. The custom automation script showcased how version updates can be streamlined, saving valuable time and mitigating the risk of errors. As development teams continue to adopt automation, they empower themselves to focus on high-value activities, fostering innovation and driving their projects forward. + +Automate your version changes and witness the transformation in your development process. Say goodbye to the tedious and error-prone manual updates, and embrace the power of automation for efficiency and time savings in your software development journey. + +{{< admonition type=tip open=true >}} + Personally I use various codeline automation scripts. For label creation, branch out to release branch, auto labeling. These are inspired from microsoft vscode PR bot. +{{< /admonition >}} + + diff --git a/content/posts/compile-jhipster-from-main-branch/index.en.md b/content/posts/compile-jhipster-from-main-branch/index.en.md index edaed79..9bd100c 100644 --- a/content/posts/compile-jhipster-from-main-branch/index.en.md +++ b/content/posts/compile-jhipster-from-main-branch/index.en.md @@ -1,59 +1,59 @@ ---- -title: "JHipster from main branch" -date: 2023-03-26T01:11:15+05:30 -lastmod: 2023-03-26T21:29:01+08:00 -draft: false -author: "Vidhya" -description: "JHipster from main branch" - -tags: ["java", "jhipster"] -categories: ["java"] - -resources: -- name: "featured-image" - src: "jhipster-2.jpg" - -toc: - auto: true ---- - -πŸ’‘ JHipster from main branch πŸ‘¨β€πŸ’» :two_hearts: - -## Introduction - - - {{< admonition type=quote title="What is JHipster" open=false >}} -JHipster is a development platform for building modern web applications, mobile apps, and microservices in Java and JavaScript. It provides a set of tools and workflows that make it easy to create applications using popular frameworks such as Spring Boot, Angular, React, and Vue.js. With JHipster, developers can quickly generate a full-stack application with a modern front-end, back-end, and database layer, along with user authentication, authorization, and security features. JHipster also includes built-in support for continuous integration and deployment, making it easy to deploy applications to the cloud. Overall, JHipster aims to simplify the process of building high-quality, scalable, and maintainable applications, while leveraging the best practices and technologies in the industry. -{{< /admonition >}} - - -Sometime upgrading the [Jhipster](https://www.jhipster.tech/) modules takes time after the Jhipster officially released. - -However in this post, I'd like to show you how to clone Jhipster's GitHub repo. So you can use the latest code and try out the latest features, maybe try out a bug fix, maybe try out springboot (latest) and basically use the latest stuff. - -## Steps - -### Checkout - -```sh - -git clone https://github.com/jhipster/generator-jhipster.git --depth=1 -cd generator-jhipster -npm i -npm link - -``` -### Running - -Once the ```npm link``` command success, we can execute the jhipster command to verfiy - -```sh -$ jhipster --version -``` -However in recent the above command not working in widows. Hence running with npx excecute successfully. - -```sh -$ npx jhipster -``` - -Happy coding... +--- +title: "JHipster from main branch" +date: 2023-03-26T01:11:15+05:30 +lastmod: 2023-03-26T21:29:01+08:00 +draft: false +author: "Vidhya" +description: "JHipster from main branch" + +tags: ["java", "jhipster"] +categories: ["java"] + +resources: +- name: "featured-image" + src: "jhipster-2.jpg" + +toc: + auto: true +--- + +πŸ’‘ JHipster from main branch πŸ‘¨β€πŸ’» :two_hearts: + +## Introduction + + + {{< admonition type=quote title="What is JHipster" open=false >}} +JHipster is a development platform for building modern web applications, mobile apps, and microservices in Java and JavaScript. It provides a set of tools and workflows that make it easy to create applications using popular frameworks such as Spring Boot, Angular, React, and Vue.js. With JHipster, developers can quickly generate a full-stack application with a modern front-end, back-end, and database layer, along with user authentication, authorization, and security features. JHipster also includes built-in support for continuous integration and deployment, making it easy to deploy applications to the cloud. Overall, JHipster aims to simplify the process of building high-quality, scalable, and maintainable applications, while leveraging the best practices and technologies in the industry. +{{< /admonition >}} + + +Sometime upgrading the [Jhipster](https://www.jhipster.tech/) modules takes time after the Jhipster officially released. + +However in this post, I'd like to show you how to clone Jhipster's GitHub repo. So you can use the latest code and try out the latest features, maybe try out a bug fix, maybe try out springboot (latest) and basically use the latest stuff. + +## Steps + +### Checkout + +```sh + +git clone https://github.com/jhipster/generator-jhipster.git --depth=1 +cd generator-jhipster +npm i +npm link + +``` +### Running + +Once the ```npm link``` command success, we can execute the jhipster command to verfiy + +```sh +$ jhipster --version +``` +However in recent the above command not working in widows. Hence running with npx excecute successfully. + +```sh +$ npx jhipster +``` + +Happy coding... diff --git a/content/posts/har-create-export-import/index.en.md b/content/posts/har-create-export-import/index.en.md index 25af6e5..59edc8b 100644 --- a/content/posts/har-create-export-import/index.en.md +++ b/content/posts/har-create-export-import/index.en.md @@ -1,99 +1,99 @@ ---- -title: "Using HAR Files to Improve Webapps Performance" -date: 2023-04-01T10:55:00+05:30 -lastmod: 2023-04-01T10:55:00+05:30 -draft: false -author: "Vidhya" -description: "How to create HAR file - Performance / debug webpapps" - -tags: ["webapps", "tools"] -categories: ["web","tools"] - -resources: -- name: "featured-image" - src: "har-feature.jpg" - -toc: - auto: true ---- - - -## Introduction: - -As a 🌐 website owner, ensuring a seamless user experience is vital for the success of your business. - -However, despite your best efforts, you may receive feedback from users about slow πŸ“ˆ page load times or other performance issues. - -This is where ```HAR (HTTP Archive)``` πŸ’Ž files can be a valuable tool for developers. - -In simple terms, a HAR file is a log πŸ“„ of all the network βœ… requests and responses made by a web page . - -It provides detailed information such as βŒ› timings, HTTP headers, and content, which can help you 🧬 diagnose and optimize website performance issues . - -HAR files can help you diagnose 🧬 and fix website β›” performance issues , thereby improving the user experience πŸ”— . - -In this post, we'll explore how to generate and analyze HAR files. - -{{< admonition type=quote title="What is a HAR file?" open=false >}} - -A HAR (HTTP Archive) file is a log of all the network requests and responses made by a web page. It's essentially a record of everything that happens when a user visits a particular page, including all the assets that are loaded, such as images, stylesheets, scripts, and more. - -Each HAR file consists of a JSON (JavaScript Object Notation) structure that contains information such as request and response headers, timings, and content. This makes it a valuable tool for developers who need to analyze website performance issues and optimize page load times. - -{{< /admonition >}} - -## Generating HAR Files: - -To generate a HAR file, you need to use your browser's developer tools. Here are the steps to do this in popular browsers like Chrome, Firefox, and Safari: - -### Generating a HAR file using Firefox: - - 1. Open Firefox and navigate to the web page you want to capture. (for example: https://vidhya03.labkit.in ) - 2. `Press F12` to open the developer tools window. - 3. Click on the `Network` tab. - 4. Ensure that the `Enable persistent logs` option is enabled. - 5. `Reload` the page. - 6. Once the page has finished loading, right-click anywhere in the network log and select `Save All As HAR`. - - ![Export & import HAR](blog-personal-har-03.gif) - -### Tips for generating high-quality HAR files: - - 1. Clear your browser cache before capturing the HAR file. - 2. Disable browser extensions that may interfere with network requests. - 3. Capture the HAR file for the entire user session, including any interactions on the page. - -### Tips for analyzing HAR Files: - - * **`Filter requests by domain or resource type`** : Use filters to narrow down the requests to a specific domain or resource type. This can help you focus on specific issues and identify potential bottlenecks. - - -* **`Check request timings`**: Look at the timing information for each request, including the time it took to connect to the server, the time it took to receive the first byte of data, and the time it took to download the entire response. This can help you identify slow-performing requests. - - -* **`Analyze the waterfall chart`**: The waterfall chart shows the timing of each request, including the time it took to connect, the time it took to receive the first byte, and the time it took to download the entire response. The chart can help you identify issues such as long connection times, slow DNS lookups, or slow download times. - -* **`Check response codes`**: Look for requests with HTTP response codes of 4xx or 5xx, as these indicate errors on the server-side. Identify the specific requests that are returning errors and take steps to fix them. - -* **`Analyze headers`**: Analyze the headers for each request to ensure that appropriate caching headers are set. Caching can significantly improve website performance by reducing the number of HTTP requests and the time required to download assets. - -{{< admonition type=quote title="πŸ•΅οΈ Security tips" open=false >}} - - 1. ```πŸ›‘οΈ Remove sensitive information:``` Always remove passwords, API keys, and other sensitive information from the HAR file before sharing it. Edit the file in a JSON editor or a text editor like Notepad++. - - - 2. ```πŸ” Encrypt the file:``` If you need to share the HAR file over an unsecured network or through email, consider encrypting it with a password to prevent unauthorized access. - - 3. ```πŸ‘¨β€πŸ’» Limit access:``` Share the HAR file only with individuals who have a legitimate need to access it. This will help prevent accidental or intentional disclosure of sensitive information. - - 4. ```πŸ”› Use secure transfer methods:``` When sharing the HAR file, use secure transfer methods such as SFTP or HTTPS. Avoid using unencrypted transfer methods such as FTP or HTTP. - - 5. ```πŸ—‘οΈ Delete the file:``` Once the HAR file has served its purpose, delete it to prevent unauthorized access or accidental disclosure of sensitive information. - -{{< /admonition >}} - -## Conclusion: - -In summary, HAR files are a powerful tool for optimizing website performance. -By generating and analyzing them, developers can identify and fix issues, resulting in faster page load times and improved user experience. +--- +title: "Using HAR Files to Improve Webapps Performance" +date: 2023-04-01T10:55:00+05:30 +lastmod: 2023-04-01T10:55:00+05:30 +draft: false +author: "Vidhya" +description: "How to create HAR file - Performance / debug webpapps" + +tags: ["webapps", "tools"] +categories: ["web","tools"] + +resources: +- name: "featured-image" + src: "har-feature.jpg" + +toc: + auto: true +--- + + +## Introduction: + +As a 🌐 website owner, ensuring a seamless user experience is vital for the success of your business. + +However, despite your best efforts, you may receive feedback from users about slow πŸ“ˆ page load times or other performance issues. + +This is where ```HAR (HTTP Archive)``` πŸ’Ž files can be a valuable tool for developers. + +In simple terms, a HAR file is a log πŸ“„ of all the network βœ… requests and responses made by a web page . + +It provides detailed information such as βŒ› timings, HTTP headers, and content, which can help you 🧬 diagnose and optimize website performance issues . + +HAR files can help you diagnose 🧬 and fix website β›” performance issues , thereby improving the user experience πŸ”— . + +In this post, we'll explore how to generate and analyze HAR files. + +{{< admonition type=quote title="What is a HAR file?" open=false >}} + +A HAR (HTTP Archive) file is a log of all the network requests and responses made by a web page. It's essentially a record of everything that happens when a user visits a particular page, including all the assets that are loaded, such as images, stylesheets, scripts, and more. + +Each HAR file consists of a JSON (JavaScript Object Notation) structure that contains information such as request and response headers, timings, and content. This makes it a valuable tool for developers who need to analyze website performance issues and optimize page load times. + +{{< /admonition >}} + +## Generating HAR Files: + +To generate a HAR file, you need to use your browser's developer tools. Here are the steps to do this in popular browsers like Chrome, Firefox, and Safari: + +### Generating a HAR file using Firefox: + + 1. Open Firefox and navigate to the web page you want to capture. (for example: https://vidhya03.labkit.in ) + 2. `Press F12` to open the developer tools window. + 3. Click on the `Network` tab. + 4. Ensure that the `Enable persistent logs` option is enabled. + 5. `Reload` the page. + 6. Once the page has finished loading, right-click anywhere in the network log and select `Save All As HAR`. + + ![Export & import HAR](blog-personal-har-03.gif) + +### Tips for generating high-quality HAR files: + + 1. Clear your browser cache before capturing the HAR file. + 2. Disable browser extensions that may interfere with network requests. + 3. Capture the HAR file for the entire user session, including any interactions on the page. + +### Tips for analyzing HAR Files: + + * **`Filter requests by domain or resource type`** : Use filters to narrow down the requests to a specific domain or resource type. This can help you focus on specific issues and identify potential bottlenecks. + + +* **`Check request timings`**: Look at the timing information for each request, including the time it took to connect to the server, the time it took to receive the first byte of data, and the time it took to download the entire response. This can help you identify slow-performing requests. + + +* **`Analyze the waterfall chart`**: The waterfall chart shows the timing of each request, including the time it took to connect, the time it took to receive the first byte, and the time it took to download the entire response. The chart can help you identify issues such as long connection times, slow DNS lookups, or slow download times. + +* **`Check response codes`**: Look for requests with HTTP response codes of 4xx or 5xx, as these indicate errors on the server-side. Identify the specific requests that are returning errors and take steps to fix them. + +* **`Analyze headers`**: Analyze the headers for each request to ensure that appropriate caching headers are set. Caching can significantly improve website performance by reducing the number of HTTP requests and the time required to download assets. + +{{< admonition type=quote title="πŸ•΅οΈ Security tips" open=false >}} + + 1. ```πŸ›‘οΈ Remove sensitive information:``` Always remove passwords, API keys, and other sensitive information from the HAR file before sharing it. Edit the file in a JSON editor or a text editor like Notepad++. + + + 2. ```πŸ” Encrypt the file:``` If you need to share the HAR file over an unsecured network or through email, consider encrypting it with a password to prevent unauthorized access. + + 3. ```πŸ‘¨β€πŸ’» Limit access:``` Share the HAR file only with individuals who have a legitimate need to access it. This will help prevent accidental or intentional disclosure of sensitive information. + + 4. ```πŸ”› Use secure transfer methods:``` When sharing the HAR file, use secure transfer methods such as SFTP or HTTPS. Avoid using unencrypted transfer methods such as FTP or HTTP. + + 5. ```πŸ—‘οΈ Delete the file:``` Once the HAR file has served its purpose, delete it to prevent unauthorized access or accidental disclosure of sensitive information. + +{{< /admonition >}} + +## Conclusion: + +In summary, HAR files are a powerful tool for optimizing website performance. +By generating and analyzing them, developers can identify and fix issues, resulting in faster page load times and improved user experience. Use HAR files to ensure your website performs at its best. \ No newline at end of file diff --git a/content/posts/java17-migration/index.en.md b/content/posts/java17-migration/index.en.md index 65528e7..7409cdc 100644 --- a/content/posts/java17-migration/index.en.md +++ b/content/posts/java17-migration/index.en.md @@ -1,275 +1,275 @@ ---- -title: "Java 17 migration tips/checklist " -date: 2024-04-14T01:11:15+05:30 -lastmod: 2024-04-14T21:29:01+08:00 -draft: false -author: "Vidhya" -description: "Devcontainer" - -tags: ["development","java","spring-boot"] -categories: ["tools"] - -resources: -- name: "featured-image" - src: "java-head.png" - -toc: - auto: true ---- - -## Introduction -Navigating the Java 17, Spring 6, and Spring Boot 3 Upgrade Journey can be a challenging yet rewarding endeavor. As you embark on this journey, it's crucial to understand the scope of the upgrade and the key considerations involved in each component's migration. In this article, we'll delve into essential aspects of upgrading, including migrating from Java EE to Jakarta EE in Spring 6, updating Hibernate configurations for Java 17 and Spring 6, upgrading API documentation from Swagger to OpenAPI, transitioning to Apache HttpClient 5, and migrating to Java 17 with Spring Boot 3 using OpenRewrite. - -## Migrating from Java EE to Jakarta EE in Spring 6 - -When upgrading to Spring 6 and Spring Boot 3, compatibility with Java EE or Jakarta EE APIs is paramount. This entails updating imports and configurations to align with namespace changes. For instance, understanding the mapping between Java EE and Jakarta EE namespaces is crucial for a seamless migration: - -| Java EE Namespace | Jakarta EE Namespace | -|----------------------------|----------------------------| -| javax.servlet | jakarta.servlet | -| javax.servlet.http | jakarta.servlet.http | -| javax.servlet.annotation | jakarta.servlet.annotation | -| javax.servlet.descriptor | jakarta.servlet.descriptor | -| javax.servlet.jsp | jakarta.servlet.jsp | -| javax.servlet.jsp.el | jakarta.servlet.jsp.el | -| javax.servlet.jsp.tagext | jakarta.servlet.jsp.tagext | -| javax.websocket | jakarta.websocket | -| javax.websocket.server | jakarta.websocket.server | -| javax.xml.* | jakarta.xml.* | -| javax.activation | jakarta.activation | -| javax.annotation | jakarta.annotation | -| javax.enterprise | jakarta.enterprise | -| javax.jms | jakarta.jms | -| javax.jws | jakarta.jws | -| javax.mail | jakarta.mail | -| javax.management | jakarta.management | -| javax.persistence | jakarta.persistence | -| javax.security.* | jakarta.security.* | -| javax.transaction | jakarta.transaction | -| javax.validation | jakarta.validation | -| javax.websocket | jakarta.websocket | -| javax.xml.* | jakarta.xml.* | - -## Hibernate Update in Java 17 and Spring 6 - -Upgrading to Java 17 and Spring 6 necessitates considerations for updating Hibernate configurations. Key points to note include updating the Hibernate dialect and annotations for defining custom types. Ensuring compatibility with the latest Hibernate versions and adhering to evolving best practices is essential. - - 1. Hibernate Dialect Update: -The `org.hibernate.dialect.MySQLDialect` is supported from Hibernate 5.3 onwards. Prior to Hibernate 5.3, it was recommended to use `org.hibernate.dialect.MySQL57Dialect` for MySQL 5.x and 8.x. However, with the release of Hibernate 5.3, a `org.hibernate.dialect.MySQL8Dialect` was introduced, and it is recommended to use `org.hibernate.dialect.MySQLDialect` since `Hibernate 6`, as `org.hibernate.dialect.MySQL8Dialect` is deprecated. - - 2. Type and TypeDef Annotations Update: -In Hibernate 6, there are changes in the annotations used for defining custom types. For example, the usage of `@TypeDef` and `@Type` annotations has been updated. -```xml - - com.vladmihalcea - hibernate-types-60 - - - -``` -Instead of: - -```java -import org.hibernate.annotations.Type; -import org.hibernate.annotations.TypeDef; - -@TypeDef(name = "json", typeClass = StringJsonUserType.class) -public class EntityName { - - @Type(type = "json") - private propertyName -} -``` - -You should now use: - -```java -import jakarta.persistence.Convert; -import org.hibernate.annotations.JdbcTypeCode; - -@Convert(attributeName = "entityAttrName", converter = StringJsonUserType.class) -public class EntityName { - - @JdbcTypeCode(SqlTypes.JSON) - private propertyName -} - -``` -## API documentation upgrade swagger to OpenAPI - -Migrating from Swagger annotations to OpenAPI annotations involves updating your codebase to use the newer annotations provided by the `springdoc-openapi` library, as well as adjusting any configuration or usage accordingly. Here's a list of some common changes you may need to make: - - -| Swagger Annotation | OpenAPI (springdoc-openapi) Annotation | -|--------------------------------------------|--------------------------------------------------------------------------| -| `io.swagger.annotations.ApiIgnore` | `org.springdoc.core.annotations.Hidden` | -| `io.swagger.annotations.ApiModelProperty` | `io.swagger.v3.oas.annotations.media.Schema` | -| `io.swagger.annotations.ApiParam` | `io.swagger.v3.oas.annotations.Parameter` | -| `io.swagger.annotations.ApiOperation` | `io.swagger.v3.oas.annotations.Operation` | -| `io.swagger.annotations.ApiResponse` | `io.swagger.v3.oas.annotations.responses.ApiResponse` | -| `io.swagger.annotations.ApiModel` | `io.swagger.v3.oas.annotations.media.Schema` | -| `io.swagger.annotations.ApiImplicitParams` | `io.swagger.v3.oas.annotations.parameters.Parameters` | -| `io.swagger.annotations.ApiResponses` | `io.swagger.v3.oas.annotations.responses.ApiResponse` | - -Swagger Annotation: @ApiIgnore -```java -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiIgnore; - -@Api(tags = "Sample Controller") -public class SampleController { - - @ApiIgnore - public void ignoredMethod() { - // This method will be ignored in Swagger documentation - } -} -``` - -OpenAPI (springdoc-openapi) Annotation: @Hidden -```java -import org.springdoc.core.annotations.Hidden; -import io.swagger.v3.oas.annotations.tags.Tag; - -@Tag(name = "Sample Controller") -public class SampleController { - - @Hidden - public void ignoredMethod() { - // This method will be hidden in OpenAPI documentation - } -} -``` -Swagger Annotation: @ApiModelProperty -```java - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -public class SampleModel { - - @ApiModelProperty(value = "The ID of the entity", example = "1") - private Long id; - - @ApiModelProperty(value = "The name of the entity") - private String name; -} -``` -OpenAPI (springdoc-openapi) Annotation: @Schema -```java - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -public class SampleModel { - - @Schema(description = "The ID of the entity", example = "1") - private Long id; - - @Schema(description = "The name of the entity") - private String name; -} -``` -## Upgrading to Apache HttpClient 5 - -#### Key Differences: -- `Package Names`: HttpClient 5 uses `org.apache.hc.client5.http` and related packages, whereas HttpClient 4 uses `org.apache.http.` -- `Class Structure`: HttpClient 5 introduces new classes and restructures existing ones for configuration and connection management. -- `SSL Context Handling`: HttpClient 5 provides a different approach for SSL context handling using `SSLConnectionSocketFactoryBuilder`. -- `Connection Pooling Configuration`: Configuration related to connection pooling is done differently in `HttpClient 5` with `PoolingHttpClientConnectionManagerBuilder`. -- `Proxy Configuration`: HttpClient 5 proxy configuration involves changes in how `HttpHost` is used. - -{{< gist vidhya03 a41a85bc38e3f295321bde42bb57146b RestTemplateLegacy.java >}} - -New updated migrated code -{{< gist vidhya03 a41a85bc38e3f295321bde42bb57146b RestTemplateHttp5Upgrade.java >}} - -#### Additional Notes: -- WebClient: Remember that WebClient is the recommended alternative to RestTemplate for new applications, as it provides both synchronous and asynchronous capabilities. -- RestTemplate: However, if you’re working with existing code, RestTemplate remains a viable choice. - -The new webclient will be - -{{< gist vidhya03 5d21de835b5fc3a11d4df9bc2b6f6fcf WebFluxConfig.java >}} - - -## Migrating to Java 17 with Spring Boot 3 using OpenRewrite -#### Introduction to OpenRewrite - -OpenRewrite is a powerful tool for automating code refactoring and transformation tasks in Java projects. It provides a flexible framework for writing custom rules to analyze and modify Java code programmatically. In this section, we'll explore how to integrate OpenRewrite into both Maven and Gradle projects to facilitate the migration from Java 11 to Java 17, along with Spring Boot 3. -```java -// Before OpenRewrite -import javax.servlet.http.HttpServletRequest; -... - -``` - -```java -// After OpenRewrite -import jakarta.servlet.http.HttpServletRequest; -... - -``` - - -#### Integrating OpenRewrite into Maven Projects - -#### Step 1: Add OpenRewrite Plugin to `pom.xml` - -To use OpenRewrite in a Maven project, first, add the OpenRewrite Maven plugin to your project's `pom.xml`: - -```xml - - - - - org.openrewrite.maven - rewrite-maven-plugin - 5.27.0 - - - org.openrewrite.java.migrate.UpgradeToJava17 - - - - - org.openrewrite.recipe - rewrite-migrate-java - 2.11.0 - - - - - - -``` -Run `mvn rewrite:run` to run the recipe. -alternatively -```sh -mvn -U org.openrewrite.maven:rewrite-maven-plugin:run -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-migrate-java:RELEASE -Drewrite.activeRecipes=org.openrewrite.java.migrate.UpgradeToJava17 -``` -#### Integrating OpenRewrite into Gradle Projects - -#### Step 1: Add OpenRewrite Plugin to gradle -- Add the following to your `build.gradle` file: -```build.gradle -plugins { - id("org.openrewrite.rewrite") version("6.11.2") -} - -rewrite { - activeRecipe("org.openrewrite.java.migrate.UpgradeToJava17") -} - -repositories { - mavenCentral() -} - -dependencies { - rewrite("org.openrewrite.recipe:rewrite-migrate-java:2.11.0") -} -``` -- Run `gradle rewriteRun` to run the recipe. - +--- +title: "Java 17 migration tips/checklist " +date: 2024-04-14T01:11:15+05:30 +lastmod: 2024-04-14T21:29:01+08:00 +draft: false +author: "Vidhya" +description: "Devcontainer" + +tags: ["development","java","spring-boot"] +categories: ["tools"] + +resources: +- name: "featured-image" + src: "java-head.png" + +toc: + auto: true +--- + +## Introduction +Navigating the Java 17, Spring 6, and Spring Boot 3 Upgrade Journey can be a challenging yet rewarding endeavor. As you embark on this journey, it's crucial to understand the scope of the upgrade and the key considerations involved in each component's migration. In this article, we'll delve into essential aspects of upgrading, including migrating from Java EE to Jakarta EE in Spring 6, updating Hibernate configurations for Java 17 and Spring 6, upgrading API documentation from Swagger to OpenAPI, transitioning to Apache HttpClient 5, and migrating to Java 17 with Spring Boot 3 using OpenRewrite. + +## Migrating from Java EE to Jakarta EE in Spring 6 + +When upgrading to Spring 6 and Spring Boot 3, compatibility with Java EE or Jakarta EE APIs is paramount. This entails updating imports and configurations to align with namespace changes. For instance, understanding the mapping between Java EE and Jakarta EE namespaces is crucial for a seamless migration: + +| Java EE Namespace | Jakarta EE Namespace | +|----------------------------|----------------------------| +| javax.servlet | jakarta.servlet | +| javax.servlet.http | jakarta.servlet.http | +| javax.servlet.annotation | jakarta.servlet.annotation | +| javax.servlet.descriptor | jakarta.servlet.descriptor | +| javax.servlet.jsp | jakarta.servlet.jsp | +| javax.servlet.jsp.el | jakarta.servlet.jsp.el | +| javax.servlet.jsp.tagext | jakarta.servlet.jsp.tagext | +| javax.websocket | jakarta.websocket | +| javax.websocket.server | jakarta.websocket.server | +| javax.xml.* | jakarta.xml.* | +| javax.activation | jakarta.activation | +| javax.annotation | jakarta.annotation | +| javax.enterprise | jakarta.enterprise | +| javax.jms | jakarta.jms | +| javax.jws | jakarta.jws | +| javax.mail | jakarta.mail | +| javax.management | jakarta.management | +| javax.persistence | jakarta.persistence | +| javax.security.* | jakarta.security.* | +| javax.transaction | jakarta.transaction | +| javax.validation | jakarta.validation | +| javax.websocket | jakarta.websocket | +| javax.xml.* | jakarta.xml.* | + +## Hibernate Update in Java 17 and Spring 6 + +Upgrading to Java 17 and Spring 6 necessitates considerations for updating Hibernate configurations. Key points to note include updating the Hibernate dialect and annotations for defining custom types. Ensuring compatibility with the latest Hibernate versions and adhering to evolving best practices is essential. + + 1. Hibernate Dialect Update: +The `org.hibernate.dialect.MySQLDialect` is supported from Hibernate 5.3 onwards. Prior to Hibernate 5.3, it was recommended to use `org.hibernate.dialect.MySQL57Dialect` for MySQL 5.x and 8.x. However, with the release of Hibernate 5.3, a `org.hibernate.dialect.MySQL8Dialect` was introduced, and it is recommended to use `org.hibernate.dialect.MySQLDialect` since `Hibernate 6`, as `org.hibernate.dialect.MySQL8Dialect` is deprecated. + + 2. Type and TypeDef Annotations Update: +In Hibernate 6, there are changes in the annotations used for defining custom types. For example, the usage of `@TypeDef` and `@Type` annotations has been updated. +```xml + + com.vladmihalcea + hibernate-types-60 + + + +``` +Instead of: + +```java +import org.hibernate.annotations.Type; +import org.hibernate.annotations.TypeDef; + +@TypeDef(name = "json", typeClass = StringJsonUserType.class) +public class EntityName { + + @Type(type = "json") + private propertyName +} +``` + +You should now use: + +```java +import jakarta.persistence.Convert; +import org.hibernate.annotations.JdbcTypeCode; + +@Convert(attributeName = "entityAttrName", converter = StringJsonUserType.class) +public class EntityName { + + @JdbcTypeCode(SqlTypes.JSON) + private propertyName +} + +``` +## API documentation upgrade swagger to OpenAPI + +Migrating from Swagger annotations to OpenAPI annotations involves updating your codebase to use the newer annotations provided by the `springdoc-openapi` library, as well as adjusting any configuration or usage accordingly. Here's a list of some common changes you may need to make: + + +| Swagger Annotation | OpenAPI (springdoc-openapi) Annotation | +|--------------------------------------------|--------------------------------------------------------------------------| +| `io.swagger.annotations.ApiIgnore` | `org.springdoc.core.annotations.Hidden` | +| `io.swagger.annotations.ApiModelProperty` | `io.swagger.v3.oas.annotations.media.Schema` | +| `io.swagger.annotations.ApiParam` | `io.swagger.v3.oas.annotations.Parameter` | +| `io.swagger.annotations.ApiOperation` | `io.swagger.v3.oas.annotations.Operation` | +| `io.swagger.annotations.ApiResponse` | `io.swagger.v3.oas.annotations.responses.ApiResponse` | +| `io.swagger.annotations.ApiModel` | `io.swagger.v3.oas.annotations.media.Schema` | +| `io.swagger.annotations.ApiImplicitParams` | `io.swagger.v3.oas.annotations.parameters.Parameters` | +| `io.swagger.annotations.ApiResponses` | `io.swagger.v3.oas.annotations.responses.ApiResponse` | + +Swagger Annotation: @ApiIgnore +```java +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiIgnore; + +@Api(tags = "Sample Controller") +public class SampleController { + + @ApiIgnore + public void ignoredMethod() { + // This method will be ignored in Swagger documentation + } +} +``` + +OpenAPI (springdoc-openapi) Annotation: @Hidden +```java +import org.springdoc.core.annotations.Hidden; +import io.swagger.v3.oas.annotations.tags.Tag; + +@Tag(name = "Sample Controller") +public class SampleController { + + @Hidden + public void ignoredMethod() { + // This method will be hidden in OpenAPI documentation + } +} +``` +Swagger Annotation: @ApiModelProperty +```java + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class SampleModel { + + @ApiModelProperty(value = "The ID of the entity", example = "1") + private Long id; + + @ApiModelProperty(value = "The name of the entity") + private String name; +} +``` +OpenAPI (springdoc-openapi) Annotation: @Schema +```java + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class SampleModel { + + @Schema(description = "The ID of the entity", example = "1") + private Long id; + + @Schema(description = "The name of the entity") + private String name; +} +``` +## Upgrading to Apache HttpClient 5 + +#### Key Differences: +- `Package Names`: HttpClient 5 uses `org.apache.hc.client5.http` and related packages, whereas HttpClient 4 uses `org.apache.http.` +- `Class Structure`: HttpClient 5 introduces new classes and restructures existing ones for configuration and connection management. +- `SSL Context Handling`: HttpClient 5 provides a different approach for SSL context handling using `SSLConnectionSocketFactoryBuilder`. +- `Connection Pooling Configuration`: Configuration related to connection pooling is done differently in `HttpClient 5` with `PoolingHttpClientConnectionManagerBuilder`. +- `Proxy Configuration`: HttpClient 5 proxy configuration involves changes in how `HttpHost` is used. + +{{< gist vidhya03 a41a85bc38e3f295321bde42bb57146b RestTemplateLegacy.java >}} + +New updated migrated code +{{< gist vidhya03 a41a85bc38e3f295321bde42bb57146b RestTemplateHttp5Upgrade.java >}} + +#### Additional Notes: +- WebClient: Remember that WebClient is the recommended alternative to RestTemplate for new applications, as it provides both synchronous and asynchronous capabilities. +- RestTemplate: However, if you’re working with existing code, RestTemplate remains a viable choice. + +The new webclient will be + +{{< gist vidhya03 5d21de835b5fc3a11d4df9bc2b6f6fcf WebFluxConfig.java >}} + + +## Migrating to Java 17 with Spring Boot 3 using OpenRewrite +#### Introduction to OpenRewrite + +OpenRewrite is a powerful tool for automating code refactoring and transformation tasks in Java projects. It provides a flexible framework for writing custom rules to analyze and modify Java code programmatically. In this section, we'll explore how to integrate OpenRewrite into both Maven and Gradle projects to facilitate the migration from Java 11 to Java 17, along with Spring Boot 3. +```java +// Before OpenRewrite +import javax.servlet.http.HttpServletRequest; +... + +``` + +```java +// After OpenRewrite +import jakarta.servlet.http.HttpServletRequest; +... + +``` + + +#### Integrating OpenRewrite into Maven Projects + +#### Step 1: Add OpenRewrite Plugin to `pom.xml` + +To use OpenRewrite in a Maven project, first, add the OpenRewrite Maven plugin to your project's `pom.xml`: + +```xml + + + + + org.openrewrite.maven + rewrite-maven-plugin + 5.27.0 + + + org.openrewrite.java.migrate.UpgradeToJava17 + + + + + org.openrewrite.recipe + rewrite-migrate-java + 2.11.0 + + + + + + +``` +Run `mvn rewrite:run` to run the recipe. +alternatively +```sh +mvn -U org.openrewrite.maven:rewrite-maven-plugin:run -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-migrate-java:RELEASE -Drewrite.activeRecipes=org.openrewrite.java.migrate.UpgradeToJava17 +``` +#### Integrating OpenRewrite into Gradle Projects + +#### Step 1: Add OpenRewrite Plugin to gradle +- Add the following to your `build.gradle` file: +```build.gradle +plugins { + id("org.openrewrite.rewrite") version("6.11.2") +} + +rewrite { + activeRecipe("org.openrewrite.java.migrate.UpgradeToJava17") +} + +repositories { + mavenCentral() +} + +dependencies { + rewrite("org.openrewrite.recipe:rewrite-migrate-java:2.11.0") +} +``` +- Run `gradle rewriteRun` to run the recipe. + diff --git a/content/posts/my-git-useful-commands/index.en.md b/content/posts/my-git-useful-commands/index.en.md index 69d0d5f..ac9c0d7 100644 --- a/content/posts/my-git-useful-commands/index.en.md +++ b/content/posts/my-git-useful-commands/index.en.md @@ -40,6 +40,7 @@ Useful git commands :two_hearts: - [How to revert merge commit](#how-to-revert-merge-commit) - [How to pick a commit from one branch to another using cherry-pick](#how-to-pick-a-commit-from-one-branch-to-another-using-cherry-pick) - [How to fix or solve No url found for submodule path in .gitmodules](#how-to-fix-or-solve-no-url-found-for-submodule-path-in-gitmodules) +- [How to fix the submodule for branch change](#how-to-fix-the-submodule-for-branch-change) - [How to pass custom ssh private key filename](#how-to-pass-custom-ssh-private-key-filename) - [How to add new line in shell - git commit message](#how-to-add-new-line-in-shell---git-commit-message) @@ -355,6 +356,24 @@ git rm --cached gradle git push ``` +## How to fix the submodule for branch change + +If you need to update a submodule to track a different branch (for example, switching to a release branch), follow these steps. Here, `common/hybrid-ipaas-mcsp-spring-boot-starter` is the path where the submodule is placed: + +```sh +git submodule set-branch --branch release/11.2.3.0 common/hybrid-ipaas-mcsp-spring-boot-starter +git submodule update --remote +git add .gitmodules common/hybrid-ipaas-mcsp-spring-boot-starter +git commit -m "Update submodule to release/11.2.3.0" +``` + +- The first command sets the submodule to track the specified branch. +- The second command updates the submodule to the latest commit on that branch. +- The third command stages the changes to the submodule and `.gitmodules` file. +- The last command commits the update. + + + ## How to pass custom ssh private key filename When cloning and working on multiple repository from different accounts, maintaing the separate ssh file is apt way. The below will show you how to pass private key while cloning and override the default file id_rsa diff --git a/content/posts/sdkman-saves-life/index.en.md b/content/posts/sdkman-saves-life/index.en.md index 5a5c1ec..b76bc42 100644 --- a/content/posts/sdkman-saves-life/index.en.md +++ b/content/posts/sdkman-saves-life/index.en.md @@ -1,136 +1,136 @@ ---- -title: "The Secret to Developer Productivity: Discover SDKMAN" -date: 2023-05-15T01:11:15+05:30 -lastmod: 2023-05-15T01:11:15+05:30 -draft: false -author: "Vidhya" -description: "The Secret to Developer Productivity: Discover SDKMAN" - -tags: ["tools", "java","maven"] -categories: ["java"] - -resources: -- name: "featured-image" - src: "fatured-sdkman.jpg" - -toc: - auto: true ---- - - -## Introduction - - SDKMAN is a command-line tool for managing software development kits (SDKs). - - It simplifies the process of installing, managing, and switching between different SDK versions. - - It supports popular SDKs like Java, Maven, Gradle, Groovy, Scala, Kotlin, and more. - {{< admonition type=tip open=true >}} - Personally I use for maven gradle and Java (JDK) - {{< /admonition >}} - - SDKMAN provides a centralized repository of SDKs with various versions. - - It automates the installation and configuration of SDKs, saving developers time and effort. - - Developers can easily list available SDKs, install specific versions, and switch between them seamlessly. -## Getting Started with SDKMAN - - ### Installing SDKMAN on your system: - - Open your terminal or command prompt. for windows run from `gitbash` - - Run the following command to download and install SDKMAN: - ```sh - curl -s "https://get.sdkman.io" | bash - ``` - ### Setting up SDKMAN environment variables: - - After the installation completes, run the following command to initialize SDKMAN: - ```sh - source "$HOME/.sdkman/bin/sdkman-init.sh" - ``` - ### Verifying the installation: - - To verify that SDKMAN is installed correctly, run the following command: - ```sh - sdk version - ``` - - It should display the version of SDKMAN installed. - -## Managing SDKs with SDKMAN - -To effectively manage SDKs with SDKMAN, follow these steps: - -### Listing available SDKs and versions: - - To view the available SDKs and their versions, use the following command: - ```sh - sdk list - ``` - - Example for Java JDK: - ```sh - sdk list java - ``` - This command will display a list of available Java JDK versions. - -### Installing SDKs using SDKMAN: - - To install a specific SDK version, use the following command: - ```sh - sdk install - ``` - - Example for Java JDK: - ```sh - sdk install java 17.0.5-zulu - ``` - This command will install Java JDK version **17.0.5-zulu**. - -### Switching between different SDK versions: - - To switch between different SDK versions, use the following command: - ```sh - sdk use - ``` - - Example for Java JDK: suppose if you installed already `sdk install java 11.0.17-zulu` - ```sh - sdk use java 11.0.17-zulu - ``` - This command will switch Java JDK version to **11.0.17-zulu**. - - ### Setting a default SDK version: - -SDKMAN simplifies setting a default SDK version for each candidate, applying it automatically when you start a new session or open a terminal. Use the "default" command to set it effortlessly. - - - Setting a default SDK version: - ```sh - sdk default - ``` - - Example for setting the default Java JDK version: - ```sh - sdk default java 17.0.5-zulu - ``` - This command will set java jdk version **17.0.5-zulu** as default. -### Checking the current default SDK version: - - To check the current default version for an SDK candidate, use the following command: - ```sh - sdk default - ``` - - Example for checking the default Java JDK version: - ```sh - sdk default java - ``` - This command will display the currently set default version of Java JDK. - -### Removing SDKs with ease: - - To remove an installed SDK, use the following command: - ```sh - sdk uninstall - ``` - - Example for Java JDK : - ```sh - sdk uninstall java 11.0.17-zulu - - ``` - This command will uninstall Java JDK version **11.0.17-zulu**. - - - -## Conclusion - - - **SDKMAN** is the secret to boosting developer productivity by simplifying SDK management. - - It provides a centralized repository of SDKs and automates installation, configuration, and version switching. - - **SDKMAN** eliminates the time-consuming and error-prone aspects of SDK management, allowing developers to focus on coding. - - Setting default SDK versions in **SDKMAN** further enhances productivity by reducing manual version switching. - - Additionally, removing SDKs is a breeze, ensuring a clean and efficient SDK management process. - - Embracing **SDKMAN** unlocks convenience, automation, and customization in SDK management. - - With streamlined installation, effortless version switching, and the power to set default SDK versions, **SDKMAN** empowers developers to write high-quality code. - - Discover **SDKMAN** and embark on a journey of increased productivity, seamless SDK management, and accelerated development outcomes. - +--- +title: "The Secret to Developer Productivity: Discover SDKMAN" +date: 2023-05-15T01:11:15+05:30 +lastmod: 2023-05-15T01:11:15+05:30 +draft: false +author: "Vidhya" +description: "The Secret to Developer Productivity: Discover SDKMAN" + +tags: ["tools", "java","maven"] +categories: ["java"] + +resources: +- name: "featured-image" + src: "fatured-sdkman.jpg" + +toc: + auto: true +--- + + +## Introduction + - SDKMAN is a command-line tool for managing software development kits (SDKs). + - It simplifies the process of installing, managing, and switching between different SDK versions. + - It supports popular SDKs like Java, Maven, Gradle, Groovy, Scala, Kotlin, and more. + {{< admonition type=tip open=true >}} + Personally I use for maven gradle and Java (JDK) + {{< /admonition >}} + - SDKMAN provides a centralized repository of SDKs with various versions. + - It automates the installation and configuration of SDKs, saving developers time and effort. + - Developers can easily list available SDKs, install specific versions, and switch between them seamlessly. +## Getting Started with SDKMAN + + ### Installing SDKMAN on your system: + - Open your terminal or command prompt. for windows run from `gitbash` + - Run the following command to download and install SDKMAN: + ```sh + curl -s "https://get.sdkman.io" | bash + ``` + ### Setting up SDKMAN environment variables: + - After the installation completes, run the following command to initialize SDKMAN: + ```sh + source "$HOME/.sdkman/bin/sdkman-init.sh" + ``` + ### Verifying the installation: + - To verify that SDKMAN is installed correctly, run the following command: + ```sh + sdk version + ``` + - It should display the version of SDKMAN installed. + +## Managing SDKs with SDKMAN + +To effectively manage SDKs with SDKMAN, follow these steps: + +### Listing available SDKs and versions: + - To view the available SDKs and their versions, use the following command: + ```sh + sdk list + ``` + - Example for Java JDK: + ```sh + sdk list java + ``` + This command will display a list of available Java JDK versions. + +### Installing SDKs using SDKMAN: + - To install a specific SDK version, use the following command: + ```sh + sdk install + ``` + - Example for Java JDK: + ```sh + sdk install java 17.0.5-zulu + ``` + This command will install Java JDK version **17.0.5-zulu**. + +### Switching between different SDK versions: + - To switch between different SDK versions, use the following command: + ```sh + sdk use + ``` + - Example for Java JDK: suppose if you installed already `sdk install java 11.0.17-zulu` + ```sh + sdk use java 11.0.17-zulu + ``` + This command will switch Java JDK version to **11.0.17-zulu**. + + ### Setting a default SDK version: + +SDKMAN simplifies setting a default SDK version for each candidate, applying it automatically when you start a new session or open a terminal. Use the "default" command to set it effortlessly. + + - Setting a default SDK version: + ```sh + sdk default + ``` + - Example for setting the default Java JDK version: + ```sh + sdk default java 17.0.5-zulu + ``` + This command will set java jdk version **17.0.5-zulu** as default. +### Checking the current default SDK version: + - To check the current default version for an SDK candidate, use the following command: + ```sh + sdk default + ``` + - Example for checking the default Java JDK version: + ```sh + sdk default java + ``` + This command will display the currently set default version of Java JDK. + +### Removing SDKs with ease: + - To remove an installed SDK, use the following command: + ```sh + sdk uninstall + ``` + - Example for Java JDK : + ```sh + sdk uninstall java 11.0.17-zulu + + ``` + This command will uninstall Java JDK version **11.0.17-zulu**. + + + +## Conclusion + + - **SDKMAN** is the secret to boosting developer productivity by simplifying SDK management. + - It provides a centralized repository of SDKs and automates installation, configuration, and version switching. + - **SDKMAN** eliminates the time-consuming and error-prone aspects of SDK management, allowing developers to focus on coding. + - Setting default SDK versions in **SDKMAN** further enhances productivity by reducing manual version switching. + - Additionally, removing SDKs is a breeze, ensuring a clean and efficient SDK management process. + - Embracing **SDKMAN** unlocks convenience, automation, and customization in SDK management. + - With streamlined installation, effortless version switching, and the power to set default SDK versions, **SDKMAN** empowers developers to write high-quality code. + - Discover **SDKMAN** and embark on a journey of increased productivity, seamless SDK management, and accelerated development outcomes. + diff --git a/content/posts/subresource-integrity/index.en.md b/content/posts/subresource-integrity/index.en.md index c321354..6d595b9 100644 --- a/content/posts/subresource-integrity/index.en.md +++ b/content/posts/subresource-integrity/index.en.md @@ -1,98 +1,98 @@ ---- -title: "Building Trust | Preventing Content Spoofing | Defending Against Attacks: How Subresource Integrity Can Safeguard Your web apps " -date: 2023-05-29T01:11:15+05:30 -lastmod: 2023-05-29T01:11:15+05:30 -draft: false -author: "Vidhya" -description: "Building Trust | Preventing Content Spoofing | Defending Against Attacks: How Subresource Integrity Can Safeguard Your web apps " - -tags: ["web", "security", "tools"] -categories: ["security"] - -resources: -- name: "featured-image" - src: "feature-sri02.jpg" - -toc: - auto: true ---- - - -## Introduction - - Ensuring the security and integrity of web resources is crucial in today's interconnected digital landscape. - - Subresource integrity (SRI) is [W3C specification](https://www.w3.org/TR/SRI/) - a powerful web security concept designed to protect against risks associated with external resource loading. - - SRI verifies the integrity of external resources, preventing tampering and ensuring their trustworthiness. - - By incorporating SRI into web development practices, you can enhance the security and trustworthiness of your applications. - - This blog will explore SRI, covering its concepts, benefits, implementation guidelines, and real-world use cases. - - It aims to equip web developers, security enthusiasts, and curious individuals with the knowledge needed to effectively utilize SRI. - - Understanding subresource integrity will provide insights into its inner workings and seamless integration into projects. - - Let's embark on a journey into the fascinating realm of subresource integrity, where trust, security, and the integrity of web resources converge. - -## Concept and Benefits of Subresource Integrity (SRI) - -Subresource Integrity (SRI) is a powerful security feature in web development that ensures the integrity and authenticity of external resources loaded by web pages. It revolves around verifying that these resources, such as scripts, stylesheets, or fonts, have not been modified or tampered with since their original publication. - - - πŸ›‘οΈ **Protection against Unauthorized Modifications**: SRI ensures that external resources remain unmodified, mitigating security risks. - - 🀝 **Maintaining a Trusted User Experience**: SRI instills confidence by verifying the integrity of resources, assuring users they haven't been tampered with. - - 🌟 **Enhanced Security for Third-Party Resources**: SRI secures external resources like CDNs, analytics scripts, or social media widgets. - - πŸ›‘οΈ **Protection from Supply Chain Attacks**: SRI defends against attacks injecting malicious code into trusted resources. - - πŸ’ͺ **Fortify Security Posture**: SRI strengthens web application security and protects against potential threats. - -## Implementing Subresource Integritys -Implementing SRI involves a straightforward process. When referencing an external resource in your HTML document, include the integrity attribute within the corresponding ` - -``` -### Generating Integrity Hashes: - -The first step is to generate the integrity hashes for the resources you want to protect. This can be done using various tools and libraries available online. - - - - Using openssl command we can generate hash, download the file and execute the below command - ```sh - $ cat launch-29da95ff591c.min.js | openssl dgst -sha384 -binary | openssl base64 -A - ``` - here is how you can generate hash with the help of gitbash tool on windows - ![generating hash for a file](gitbash-sri-hash.jpg) - Example: - In your HTML code, when referencing the JavaScript file, add the `integrity` attribute with the calculated hash: - ```html - - ``` - the prefix sha384 indicates that it's a `sha384` hash. - - - We can also generate hash from online tool https://www.srihash.org/ - -## Blocking / Defending - -When subresource integrity (SRI) is implemented and the integrity of a script file doesn't match the expected hash, the browser will take a specific action to maintain the security and integrity of the web page. The exact behavior or error message may vary slightly depending on the browser, but typically it results in the following: - - - **Script Blocked**: The browser prevents the execution of the script file if the integrity check fails. The script is not loaded or executed on the web page. - - **Console Warning/Error**: The browser's developer console may display a warning or error message indicating that the script failed the integrity check. This helps developers identify the issue and take appropriate actions. - - **Network Error**: In some cases, the browser's network tab in the developer console may show an error message indicating that the script file failed to load due to a failed integrity check. This can be helpful for debugging and identifying the cause of the issue. - -## Conclusion - -- 🧱 **Subresource Integrity (SRI)**: A powerful security measure that protects web applications from content spoofing and attacks by verifying the integrity of external resources. -- πŸ’» **Implementation**: Include the `integrity` attribute in HTML tags, specifying the hashing algorithm and base64-encoded hash value of the resource. -- πŸ›‘οΈ **Benefits**: Protects against unauthorized modifications and maintains a trusted user experience. -- 🌐 **Enhanced Security**: Secures third-party resources like CDNs and analytics scripts, defending against supply chain attacks. -- πŸ’ͺ **Fortify Applications**: Strengthens the security posture of web applications and mitigates potential threats. -- πŸ”’ **Generating Integrity Hashes**: Use tools like OpenSSL or online hash generation services to generate integrity hashes for resources. -- ⚠️ **Failed Integrity Check**: Browsers take actions such as blocking script execution, displaying console warnings or errors, and showing network errors in the developer console. -- πŸ§‘β€πŸ’» **Web Developer's Role**: Understanding and implementing subresource integrity enhances trustworthiness and security. -- 🌐 **Building a Resilient Web**: SRI prevents content spoofing, defends against attacks, and ensures resource integrity. -- πŸš€ **Incorporation into Practices**: Including SRI in web development practices ensures protection and trustworthiness in today's digital landscape. - -{{< admonition type=tip open=true >}} - Personally I generate `hash` with the help of `gitbash` tool and `openssh`. -{{< /admonition >}} - - +--- +title: "Building Trust | Preventing Content Spoofing | Defending Against Attacks: How Subresource Integrity Can Safeguard Your web apps " +date: 2023-05-29T01:11:15+05:30 +lastmod: 2023-05-29T01:11:15+05:30 +draft: false +author: "Vidhya" +description: "Building Trust | Preventing Content Spoofing | Defending Against Attacks: How Subresource Integrity Can Safeguard Your web apps " + +tags: ["web", "security", "tools"] +categories: ["security"] + +resources: +- name: "featured-image" + src: "feature-sri02.jpg" + +toc: + auto: true +--- + + +## Introduction + - Ensuring the security and integrity of web resources is crucial in today's interconnected digital landscape. + - Subresource integrity (SRI) is [W3C specification](https://www.w3.org/TR/SRI/) + a powerful web security concept designed to protect against risks associated with external resource loading. + - SRI verifies the integrity of external resources, preventing tampering and ensuring their trustworthiness. + - By incorporating SRI into web development practices, you can enhance the security and trustworthiness of your applications. + - This blog will explore SRI, covering its concepts, benefits, implementation guidelines, and real-world use cases. + - It aims to equip web developers, security enthusiasts, and curious individuals with the knowledge needed to effectively utilize SRI. + - Understanding subresource integrity will provide insights into its inner workings and seamless integration into projects. + - Let's embark on a journey into the fascinating realm of subresource integrity, where trust, security, and the integrity of web resources converge. + +## Concept and Benefits of Subresource Integrity (SRI) + +Subresource Integrity (SRI) is a powerful security feature in web development that ensures the integrity and authenticity of external resources loaded by web pages. It revolves around verifying that these resources, such as scripts, stylesheets, or fonts, have not been modified or tampered with since their original publication. + + - πŸ›‘οΈ **Protection against Unauthorized Modifications**: SRI ensures that external resources remain unmodified, mitigating security risks. + - 🀝 **Maintaining a Trusted User Experience**: SRI instills confidence by verifying the integrity of resources, assuring users they haven't been tampered with. + - 🌟 **Enhanced Security for Third-Party Resources**: SRI secures external resources like CDNs, analytics scripts, or social media widgets. + - πŸ›‘οΈ **Protection from Supply Chain Attacks**: SRI defends against attacks injecting malicious code into trusted resources. + - πŸ’ͺ **Fortify Security Posture**: SRI strengthens web application security and protects against potential threats. + +## Implementing Subresource Integritys +Implementing SRI involves a straightforward process. When referencing an external resource in your HTML document, include the integrity attribute within the corresponding ` + +``` +### Generating Integrity Hashes: + +The first step is to generate the integrity hashes for the resources you want to protect. This can be done using various tools and libraries available online. + + + - Using openssl command we can generate hash, download the file and execute the below command + ```sh + $ cat launch-29da95ff591c.min.js | openssl dgst -sha384 -binary | openssl base64 -A + ``` + here is how you can generate hash with the help of gitbash tool on windows + ![generating hash for a file](gitbash-sri-hash.jpg) + Example: + In your HTML code, when referencing the JavaScript file, add the `integrity` attribute with the calculated hash: + ```html + + ``` + the prefix sha384 indicates that it's a `sha384` hash. + + - We can also generate hash from online tool https://www.srihash.org/ + +## Blocking / Defending + +When subresource integrity (SRI) is implemented and the integrity of a script file doesn't match the expected hash, the browser will take a specific action to maintain the security and integrity of the web page. The exact behavior or error message may vary slightly depending on the browser, but typically it results in the following: + + - **Script Blocked**: The browser prevents the execution of the script file if the integrity check fails. The script is not loaded or executed on the web page. + - **Console Warning/Error**: The browser's developer console may display a warning or error message indicating that the script failed the integrity check. This helps developers identify the issue and take appropriate actions. + - **Network Error**: In some cases, the browser's network tab in the developer console may show an error message indicating that the script file failed to load due to a failed integrity check. This can be helpful for debugging and identifying the cause of the issue. + +## Conclusion + +- 🧱 **Subresource Integrity (SRI)**: A powerful security measure that protects web applications from content spoofing and attacks by verifying the integrity of external resources. +- πŸ’» **Implementation**: Include the `integrity` attribute in HTML tags, specifying the hashing algorithm and base64-encoded hash value of the resource. +- πŸ›‘οΈ **Benefits**: Protects against unauthorized modifications and maintains a trusted user experience. +- 🌐 **Enhanced Security**: Secures third-party resources like CDNs and analytics scripts, defending against supply chain attacks. +- πŸ’ͺ **Fortify Applications**: Strengthens the security posture of web applications and mitigates potential threats. +- πŸ”’ **Generating Integrity Hashes**: Use tools like OpenSSL or online hash generation services to generate integrity hashes for resources. +- ⚠️ **Failed Integrity Check**: Browsers take actions such as blocking script execution, displaying console warnings or errors, and showing network errors in the developer console. +- πŸ§‘β€πŸ’» **Web Developer's Role**: Understanding and implementing subresource integrity enhances trustworthiness and security. +- 🌐 **Building a Resilient Web**: SRI prevents content spoofing, defends against attacks, and ensures resource integrity. +- πŸš€ **Incorporation into Practices**: Including SRI in web development practices ensures protection and trustworthiness in today's digital landscape. + +{{< admonition type=tip open=true >}} + Personally I generate `hash` with the help of `gitbash` tool and `openssh`. +{{< /admonition >}} + + diff --git a/devcontainer-template.json b/devcontainer-template.json index 1f14235..623d036 100644 --- a/devcontainer-template.json +++ b/devcontainer-template.json @@ -1,12 +1,12 @@ -{ - "id": "hugo", - "version": "1.0.0", - "name": "Hugo", - "description": "Develop static sites with Hugo, includes everything you need to get up and running.", - "documentationURL": "https://github.com/microsoft/vscode-dev-containers/tree/main/containers/hugo", - "publisher": "Community", - "licenseURL": "https://github.com/microsoft/vscode-dev-containers/blob/main/LICENSE", - "platforms": [ - "Hugo" - ] -} +{ + "id": "hugo", + "version": "1.0.0", + "name": "Hugo", + "description": "Develop static sites with Hugo, includes everything you need to get up and running.", + "documentationURL": "https://github.com/microsoft/vscode-dev-containers/tree/main/containers/hugo", + "publisher": "Community", + "licenseURL": "https://github.com/microsoft/vscode-dev-containers/blob/main/LICENSE", + "platforms": [ + "Hugo" + ] +} diff --git a/layouts/_default/_markup/render-codeblock-goat.html b/layouts/_default/_markup/render-codeblock-goat.html new file mode 100644 index 0000000..c2d0a28 --- /dev/null +++ b/layouts/_default/_markup/render-codeblock-goat.html @@ -0,0 +1,7 @@ +{{- $params := .Page.Scratch.Get "params" -}} +{{- $render := $params.code.render | default dict -}} +{{- if $render.goat | default true -}} + {{- partial "plugin/goat.html" . -}} +{{- else -}} + {{- dict "Content" .Inner "Lang" .Type "Options" .Options "Page" .Page | partial "plugin/code-block.html" -}} +{{- end -}} diff --git a/layouts/_default/_markup/render-codeblock-mermaid.html b/layouts/_default/_markup/render-codeblock-mermaid.html new file mode 100644 index 0000000..626592a --- /dev/null +++ b/layouts/_default/_markup/render-codeblock-mermaid.html @@ -0,0 +1,7 @@ +{{- $params := .Page.Scratch.Get "params" -}} +{{- $render := $params.code.render | default dict -}} +{{- if $render.mermaid | default true -}} + {{- dict "Content" .Inner "Page" .Page | partial "plugin/mermaid.html" -}} +{{- else -}} + {{- dict "Content" .Inner "Lang" .Type "Options" .Options "Page" .Page | partial "plugin/code-block.html" -}} +{{- end -}} diff --git a/layouts/_default/_markup/render-codeblock.html b/layouts/_default/_markup/render-codeblock.html new file mode 100644 index 0000000..de4cab8 --- /dev/null +++ b/layouts/_default/_markup/render-codeblock.html @@ -0,0 +1 @@ +{{- dict "Content" .Inner "Lang" .Type "Options" .Options "Page" .Page | partial "plugin/code-block.html" -}} diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 0000000..cec33f6 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,11 @@ +[build.environment] +GO_VERSION = "1.24.5" +HUGO_VERSION = "0.148.2" +NODE_VERSION = "22.18.0" +TZ = "Asia/Kolkata" + +[build] +publish = "public" +command = """ + hugo --gc --minify --baseURL "${URL}" + """ \ No newline at end of file diff --git a/resources/_gen/assets/css/style.scss_1a67ae4ed98f18e3ea7da02d2ccd80c9.content b/resources/_gen/assets/css/style.scss_1a67ae4ed98f18e3ea7da02d2ccd80c9.content new file mode 100644 index 0000000..e2144a4 --- /dev/null +++ b/resources/_gen/assets/css/style.scss_1a67ae4ed98f18e3ea7da02d2ccd80c9.content @@ -0,0 +1,3 @@ +*,::before,::after{box-sizing:border-box}html{font-family:system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';line-height:1.15;-webkit-text-size-adjust:100%;tab-size:4}body{margin:0}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace, SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}table{border-color:currentcolor}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,[type='button'],[type='reset'],[type='submit']{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type='search']{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}@font-face{font-family:Emoji;src:local("Apple Color Emoji"),local("Segoe UI Emoji"),local("Segoe UI Symbol"),local("Noto Color Emoji");unicode-range:U+1F000-1F644, U+203C-3299}:root{--global-font-family: system-ui, -apple-system, Segoe UI, Roboto, Emoji, Helvetica, Arial, sans-serif;--global-font-size: 16px;--global-font-weight: 400;--global-line-height: 1.5rem;--header-height: 3.5rem;--header-title-font-family: system-ui, -apple-system, Segoe UI, Roboto, Emoji, Helvetica, Arial, sans-serif;--header-title-font-size: 1.5rem;--toc-title-font-size: 1.2rem;--toc-content-font-size: .875rem;--code-font-family: "Source Code Pro", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--code-font-size: .875rem}html{font-family:var(--global-font-family);font-weight:var(--global-font-weight);font-display:swap;font-size:var(--global-font-size);line-height:var(--global-line-height);width:100%;scroll-behavior:smooth}html main [id]{scroll-margin-top:calc(var(--header-height) + .5rem)}html h1{line-height:125%}::-webkit-scrollbar{width:.5rem;height:.5rem}::-webkit-scrollbar-thumb{background-color:#87878d}::-webkit-scrollbar-thumb:hover{background-color:#a9a9b3}::selection{background-color:rgba(53,166,247,0.25)}[theme=dark] ::selection{background-color:rgba(50,112,194,0.4)}body{background-color:#fff;color:#161209;word-wrap:break-word;overflow-wrap:break-word;scrollbar-color:auto}body[theme=dark]{color:#a9a9b3;background-color:#292a2d}a,a::before,a::after{text-decoration:none;color:#161209}[theme=dark] a,[theme=dark] a::before,[theme=dark] a::after{color:#a9a9b3}a:active,a:hover{color:#2d96bd}[theme=dark] a:active,[theme=dark] a:hover{color:#fff}#mask{background-repeat:no-repeat;background-position:center;position:fixed;top:0;left:0;width:100%;height:100%;z-index:-1;background-color:rgba(0,0,0,0)}.blur #mask{z-index:100;background-color:rgba(0,0,0,0.25)}img.lazyload,img.lazyloading{-o-object-fit:scale-down;object-fit:scale-down;font-family:"object-fit: scale-down;"}img.lazyloaded{-o-object-fit:contain;object-fit:contain;font-family:"object-fit: contain;"}svg.icon{display:inline-block;width:1.25em;height:1em;text-align:center}svg.icon path{fill:currentColor}img.emoji{height:1em;width:1em;margin:0 .05em 0 .1em;vertical-align:-.1em}.details .details-summary:hover{cursor:pointer}.details i.details-icon{color:#a9a9b3;-webkit-transition:transform 0.2s ease;-moz-transition:transform 0.2s ease;-o-transition:transform 0.2s ease;transition:transform 0.2s ease}[theme=dark] .details i.details-icon{color:#5d5d5f}.details .details-content{max-height:0;overflow-y:hidden;-webkit-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;-moz-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;-o-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s}.details.open i.details-icon{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.details.open .details-content{max-height:10000px;-webkit-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;-moz-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;-o-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s}#fixed-buttons{display:none}#fixed-buttons-hidden{display:none}.fixed-button{display:block;z-index:100;position:fixed;right:1.5rem;bottom:1.5rem;font-size:1rem;line-height:1.3rem;padding:.6rem .6rem;color:#a9a9b3;background:#f8f8f8;-webkit-border-radius:2rem;-moz-border-radius:2rem;border-radius:2rem;-webkit-transition:color 0.4s ease;-moz-transition:color 0.4s ease;-o-transition:color 0.4s ease;transition:color 0.4s ease}.blur .fixed-button{-webkit-filter:blur(1.5px);filter:blur(1.5px)}.fixed-button:hover,.fixed-button:active{color:#161209;cursor:pointer}.fixed-button:active,.fixed-button:focus,.fixed-button:hover{outline:none}[theme=dark] .fixed-button{color:#5d5d5f;background:#252627}[theme=dark] .fixed-button:hover,[theme=dark] .fixed-button:active{color:#a9a9b3}.fixed-button:nth-last-of-type(1){bottom:1.5rem}.fixed-button:nth-last-of-type(2){bottom:4.5rem}.fixed-button:nth-last-of-type(3){bottom:7.5rem}.cc-window.cc-banner .cc-btn{color:#161209}.cc-window.cc-banner .cc-btn:hover,.cc-window.cc-banner .cc-btn:focus{background-color:#ccc}[theme=dark] .cc-window.cc-banner .cc-btn{color:#161209}[theme=dark] .cc-window.cc-banner .cc-btn:hover,[theme=dark] .cc-window.cc-banner .cc-btn:focus{background-color:#fff}.wrapper{display:flex;flex-direction:column;min-height:100vh;width:100%}.wrapper main{flex:1 0 auto}.wrapper main .container{padding:0 1rem}.page{position:relative;max-width:1080px;width:64%;margin:0 auto}[data-header-desktop] .page{padding-top:var(--header-height)}[data-header-desktop=normal] .page{padding-top:0}.blur .page{-webkit-filter:blur(1.5px);filter:blur(1.5px)}.toc .toc-title{font-size:var(--toc-title-font-size);font-weight:bold;text-transform:uppercase}.toc .toc-content{font-size:var(--toc-content-font-size)}.toc .toc-content ul{text-indent:-0.85rem;padding-left:.8rem;list-style:none}.toc .toc-content ul a:first-child::before{content:"|";font-weight:bolder;margin-right:.5rem;color:#2d96bd}[theme=dark] .toc .toc-content ul a:first-child::before{color:#55bde2}.toc .toc-content ul ul{padding-left:1.5rem}.toc ruby{background:#f5f5f5}.toc ruby rt{color:#a9a9b3}[theme=dark] .toc ruby{background:#272C34}[theme=dark] .toc ruby rt{color:#5d5d5f}#toc-auto{display:block;position:absolute;width:10000px;max-width:0;padding:0 .8rem;border-left:4px solid #f0f0f0;word-wrap:break-word;overflow-wrap:break-word;box-sizing:border-box;top:10rem;left:0;visibility:hidden}[data-header-desktop=normal] #toc-auto{top:5rem}.blur #toc-auto{-webkit-filter:blur(1.5px);filter:blur(1.5px)}[theme=dark] #toc-auto{border-left-color:#363636}#toc-auto .toc-title{margin:.8rem 0}#toc-auto .toc-content.always-active ul{display:block}#toc-auto .toc-content>nav>ul{margin:.625rem 0}#toc-auto .toc-content ul ul{display:none}#toc-auto .toc-content ul .has-active>ul{display:block}#toc-auto .toc-content a.active{font-weight:bold;color:#2d96bd}[theme=dark] #toc-auto .toc-content a.active{color:#55bde2}#toc-auto .toc-content a.active::before{color:#ef3982}[theme=dark] #toc-auto .toc-content a.active::before{color:#bdebfc}#toc-static{display:none;margin:.8rem 0}#toc-static[data-kept=true]{display:block}#toc-static .toc-title{display:flex;justify-content:space-between;line-height:2em;padding:0 .75rem;background:#e6e6e6}[theme=dark] #toc-static .toc-title{background:#1a1d23}#toc-static .toc-content{background-color:#f5f5f5}#toc-static .toc-content>nav>ul{margin:0;padding:.4rem 1rem .4rem 1.8rem}[theme=dark] #toc-static .toc-content{background-color:#272C34}#toc-static.open .toc-title{background:#ededed}[theme=dark] #toc-static.open .toc-title{background:#20252b}.single .single-title{margin:2rem 0 .5rem;font-size:1.6rem;font-weight:bold;line-height:140%}.single .single-subtitle{margin:.5rem 0;font-size:1.2rem;font-weight:normal;line-height:100%}.single .post-meta{font-size:.875rem;color:#a9a9b3}.single .post-meta span{display:inline-block}[theme=dark] .single .post-meta{color:#5d5d5f}.single .post-meta a,.single .post-meta a::before,.single .post-meta a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .post-meta a,[theme=dark] .single .post-meta a::before,[theme=dark] .single .post-meta a::after{color:#a9a9b3}.single .post-meta a:active,.single .post-meta a:hover{color:#ef3982}[theme=dark] .single .post-meta a:active,[theme=dark] .single .post-meta a:hover{color:#fff}.single .post-meta .author{font-size:1.05rem}.single .featured-image{margin:.5rem 0 1rem 0}.single .featured-image img{display:block;max-width:100%;height:auto;margin:0 auto;overflow:hidden}.single .featured-image img.lazyloaded{width:100%}.single .content>h2{font-size:1.5rem}.single .content>h2 code{font-size:1.25rem}.single .content>h3{font-size:1.375rem}.single .content>h3 code{font-size:1.125rem}.single .content>h4{font-size:1.25rem}.single .content>h4 code{font-size:1rem}.single .content>h5{font-size:1.125rem}.single .content>h6{font-size:1rem}.single .content h2,.single .content h3,.single .content h4,.single .content h5,.single .content h6{font-weight:bold;margin:1.2rem 0}[theme=dark] .single .content h2,[theme=dark] .single .content h3,[theme=dark] .single .content h4,[theme=dark] .single .content h5,[theme=dark] .single .content h6{font-weight:bolder}.single .content>h2>.header-mark::before,.single .content>h3>.header-mark::before,.single .content>h4>.header-mark::before,.single .content>h5>.header-mark::before,.single .content>h6>.header-mark::before{content:"|";margin-right:.3125rem;color:#2d96bd}[theme=dark] .single .content>h2>.header-mark::before,[theme=dark] .single .content>h3>.header-mark::before,[theme=dark] .single .content>h4>.header-mark::before,[theme=dark] .single .content>h5>.header-mark::before,[theme=dark] .single .content>h6>.header-mark::before{color:#55bde2}.single .content>h2>.header-mark::before{content:"#"}.single .content p{margin:.5rem 0}.single .content b,.single .content strong{font-weight:bold}[theme=dark] .single .content b,[theme=dark] .single .content strong{color:#ddd}.single .content a,.single .content a::before,.single .content a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .content a,[theme=dark] .single .content a::before,[theme=dark] .single .content a::after{color:#55bde2}.single .content a:active,.single .content a:hover{color:#ef3982}[theme=dark] .single .content a:active,[theme=dark] .single .content a:hover{color:#bdebfc}.single .content a{word-wrap:break-word;overflow-wrap:break-word}[theme=dark] .single .content a b,[theme=dark] .single .content a strong{color:#55bde2}.single .content [theme=dark] a:hover b,.single .content [theme=dark] a:hover strong{color:#bdebfc}.single .content ul,.single .content ol{margin:.5rem 0;padding-left:2.5rem}.single .content ul{list-style-type:disc}.single .content ruby{background:#f5f5f5}.single .content ruby rt{color:#a9a9b3}[theme=dark] .single .content ruby{background:#272C34}[theme=dark] .single .content ruby rt{color:#5d5d5f}.single .content table{width:100%;max-width:100%;margin:.625rem 0;border-spacing:0;background:#fff;border-collapse:collapse;overflow-x:auto}.single .content table::-webkit-scrollbar{background-color:#fff}[theme=dark] .single .content table::-webkit-scrollbar{background-color:#272c34}[theme=dark] .single .content table{background:#272c34}.single .content table thead{background:#ededed}[theme=dark] .single .content table thead{background-color:#20252b}.single .content table th,.single .content table td{padding:.3rem 1rem;border:1px solid #e8e8e8}[theme=dark] .single .content table th,[theme=dark] .single .content table td{border-color:#1c2025}.single .content img{max-width:100%;min-height:1em;height:auto}.single .content figure{margin:.5rem;text-align:center}.single .content figure .image-caption:not(:empty){min-width:20%;max-width:80%;display:inline-block;padding:.5rem;margin:0 auto;font-size:.875rem;color:#969696}.single .content figure img{display:block;height:auto;margin:0 auto;overflow:hidden}.single .content blockquote{display:block;border-left:0.5rem solid #6bd6fd;background-color:rgba(107,214,253,0.2);padding:.25rem .75rem;margin:1rem 0}[theme=dark] .single .content blockquote{border-left-color:#59c5ec;background-color:rgba(89,197,236,0.2)}.single .content .footnotes{color:#a9a9b3}[theme=dark] .single .content .footnotes{color:#5d5d5f}.single .content .footnotes p{margin:.25rem 0}.single .content code{display:inline-block;max-width:100%;padding:0 .4rem;word-wrap:break-word;overflow-wrap:break-word;-webkit-line-break:anywhere;-ms-line-break:anywhere;line-break:anywhere;font-size:var(--code-font-size);font-family:var(--code-font-family);color:#E74C3C}[theme=dark] .single .content code{color:#E5BF78}.single .content pre{margin:0;padding:8px;-moz-tab-size:4;-o-tab-size:4;tab-size:4}.single .content pre code{padding:0}.single .content pre img{min-height:1em;max-height:1.2em;vertical-align:text-bottom}.single .content code,.single .content pre{background:#f5f5f5}[theme=dark] .single .content code,[theme=dark] .single .content pre{background:#272C34}.single .content .code-block{line-height:1.25rem;margin:.5rem 0}.single .content .code-block .code-header{display:flex;justify-content:space-between;align-items:center;box-sizing:border-box;width:100%;font-family:var(--global-font-family);font-weight:bold;color:#9c9c9c;background:#e1e1e1}[theme=dark] .single .content .code-block .code-header{color:#b1b0b0;background:#1a1d23}.single .content .code-block .code-header:hover{cursor:pointer}.single .content .code-block .code-header .code-title{width:100%;padding:.4rem}.single .content .code-block .code-header .code-title::after{padding-left:.2rem;content:"Code"}.single .content .code-block .code-header.language-bash .code-title::after{content:"Bash"}.single .content .code-block .code-header.language-c .code-title::after{content:"C"}.single .content .code-block .code-header.language-cs .code-title::after{content:"C#"}.single .content .code-block .code-header.language-cpp .code-title::after{content:"C++"}.single .content .code-block .code-header.language-clojure .code-title::after{content:"Clojure"}.single .content .code-block .code-header.language-coffeescript .code-title::after{content:"CoffeeScript"}.single .content .code-block .code-header.language-css .code-title::after{content:"CSS"}.single .content .code-block .code-header.language-dart .code-title::after{content:"Dart"}.single .content .code-block .code-header.language-diff .code-title::after{content:"Diff"}.single .content .code-block .code-header.language-erlang .code-title::after{content:"Erlang"}.single .content .code-block .code-header.language-go .code-title::after{content:"Go"}.single .content .code-block .code-header.language-go-html-template .code-title::after{content:"Go HTML Template"}.single .content .code-block .code-header.language-groovy .code-title::after{content:"Groovy"}.single .content .code-block .code-header.language-haskell .code-title::after{content:"Haskell"}.single .content .code-block .code-header.language-html .code-title::after{content:"HTML"}.single .content .code-block .code-header.language-http .code-title::after{content:"HTTP"}.single .content .code-block .code-header.language-xml .code-title::after{content:"XML"}.single .content .code-block .code-header.language-java .code-title::after{content:"Java"}.single .content .code-block .code-header.language-js .code-title::after{content:"JavaScript"}.single .content .code-block .code-header.language-javascript .code-title::after{content:"JavaScript"}.single .content .code-block .code-header.language-json .code-title::after{content:"JSON"}.single .content .code-block .code-header.language-kotlin .code-title::after{content:"Kotlin"}.single .content .code-block .code-header.language-latex .code-title::after{content:"LaTeX"}.single .content .code-block .code-header.language-less .code-title::after{content:"Less"}.single .content .code-block .code-header.language-lisp .code-title::after{content:"Lisp"}.single .content .code-block .code-header.language-lua .code-title::after{content:"Lua"}.single .content .code-block .code-header.language-makefile .code-title::after{content:"Makefile"}.single .content .code-block .code-header.language-markdown .code-title::after{content:"Markdown"}.single .content .code-block .code-header.language-matlab .code-title::after{content:"Matlab"}.single .content .code-block .code-header.language-objectivec .code-title::after{content:"Objective-C"}.single .content .code-block .code-header.language-php .code-title::after{content:"PHP"}.single .content .code-block .code-header.language-perl .code-title::after{content:"Perl"}.single .content .code-block .code-header.language-powershell .code-title::after{content:"PowerShell"}.single .content .code-block .code-header.language-posh .code-title::after{content:"PowerShell"}.single .content .code-block .code-header.language-puppet .code-title::after{content:"Puppet"}.single .content .code-block .code-header.language-pwsh .code-title::after{content:"PowerShell"}.single .content .code-block .code-header.language-python .code-title::after{content:"Python"}.single .content .code-block .code-header.language-r .code-title::after{content:"R"}.single .content .code-block .code-header.language-ruby .code-title::after{content:"Ruby"}.single .content .code-block .code-header.language-rust .code-title::after{content:"Rust"}.single .content .code-block .code-header.language-scala .code-title::after{content:"Scala"}.single .content .code-block .code-header.language-scss .code-title::after{content:"Scss"}.single .content .code-block .code-header.language-shell .code-title::after{content:"Shell"}.single .content .code-block .code-header.language-sql .code-title::after{content:"SQL"}.single .content .code-block .code-header.language-swift .code-title::after{content:"Swift"}.single .content .code-block .code-header.language-tex .code-title::after{content:"TeX"}.single .content .code-block .code-header.language-toml .code-title::after{content:"TOML"}.single .content .code-block .code-header.language-ts .code-title::after{content:"TypeScript"}.single .content .code-block .code-header.language-typescript .code-title::after{content:"TypeScript"}.single .content .code-block .code-header.language-vue .code-title::after{content:"Vue"}.single .content .code-block .code-header.language-yml .code-title::after{content:"YAML"}.single .content .code-block .code-header.language-yaml .code-title::after{content:"YAML"}.single .content .code-block .code-header .arrow{padding:0 .2rem;-webkit-transition:transform 0.2s ease;-moz-transition:transform 0.2s ease;-o-transition:transform 0.2s ease;transition:transform 0.2s ease}.single .content .code-block .code-header .ellipses{padding:.4rem}.single .content .code-block .code-header .copy{display:none;padding:.4rem}.single .content .code-block .code-header .copy:hover{cursor:pointer;color:#2d96bd}[theme=dark] .single .content .code-block .code-header .copy:hover{color:#fff}.single .content .code-block .highlight{position:relative;max-height:0;overflow-y:hidden;-webkit-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;-moz-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;-o-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;background:#f5f5f5}[theme=dark] .single .content .code-block .highlight{background:#272C34}.single .content .code-block .highlight .hl{background-color:#dcdcdc}[theme=dark] .single .content .code-block .highlight .hl{background-color:#1c2025}.single .content .code-block .highlight code{min-width:100%}.single .content .code-block .highlight code span.line{display:block;min-width:100%}.single .content .code-block .highlight .c,.single .content .code-block .highlight .ch,.single .content .code-block .highlight .cm,.single .content .code-block .highlight .c1,.single .content .code-block .highlight .cs,.single .content .code-block .highlight .cp,.single .content .code-block .highlight .cpf{font-style:italic}.single .content .code-block .highlight .gl{text-decoration:underline}.single .content .code-block .highlight .p{color:#a9a9b3}.single .content .code-block .highlight .k{color:#b501a9}.single .content .code-block .highlight .kc{color:#b501a9}.single .content .code-block .highlight .kd{color:#b501a9}.single .content .code-block .highlight .kn{color:#b501a9}.single .content .code-block .highlight .kp{color:#b501a9}.single .content .code-block .highlight .kr{color:#b501a9}.single .content .code-block .highlight .kt{color:#b501a9}.single .content .code-block .highlight .n{color:#333}.single .content .code-block .highlight .na{color:#2b77fa}.single .content .code-block .highlight .nb{color:#f74840}.single .content .code-block .highlight .bp{color:#f74840}.single .content .code-block .highlight .nc{color:#cb8100}.single .content .code-block .highlight .no{color:#2b77fa}.single .content .code-block .highlight .nd{color:#0086c1}.single .content .code-block .highlight .ni{color:#2b77fa}.single .content .code-block .highlight .ne{color:#2b77fa}.single .content .code-block .highlight .nf{color:#2b77fa}.single .content .code-block .highlight .fm{color:#1ccad6}.single .content .code-block .highlight .nl{color:#2b77fa}.single .content .code-block .highlight .nn{color:#2b77fa}.single .content .code-block .highlight .nx{color:#333}.single .content .code-block .highlight .py{color:#2b77fa}.single .content .code-block .highlight .nt{color:#2b77fa}.single .content .code-block .highlight .nv{color:#2b77fa}.single .content .code-block .highlight .vc{color:#2b77fa}.single .content .code-block .highlight .vg{color:#2b77fa}.single .content .code-block .highlight .vi{color:#2b77fa}.single .content .code-block .highlight .vm{color:#2b77fa}.single .content .code-block .highlight .l{color:#2aa198}.single .content .code-block .highlight .ld{color:#2aa198}.single .content .code-block .highlight .s{color:#24a443}.single .content .code-block .highlight .sa{color:#24a443}.single .content .code-block .highlight .sb{color:#24a443}.single .content .code-block .highlight .sc{color:#24a443}.single .content .code-block .highlight .dl{color:#24a443}.single .content .code-block .highlight .sd{color:#24a443}.single .content .code-block .highlight .s2{color:#24a443}.single .content .code-block .highlight .se{color:#24a443}.single .content .code-block .highlight .sh{color:#24a443}.single .content .code-block .highlight .si{color:#24a443}.single .content .code-block .highlight .sx{color:#24a443}.single .content .code-block .highlight .sr{color:#24a443}.single .content .code-block .highlight .s1{color:#24a443}.single .content .code-block .highlight .ss{color:#24a443}.single .content .code-block .highlight .m{color:#e2893c}.single .content .code-block .highlight .mb{color:#e2893c}.single .content .code-block .highlight .mf{color:#e2893c}.single .content .code-block .highlight .mh{color:#e2893c}.single .content .code-block .highlight .mi{color:#e2893c}.single .content .code-block .highlight .il{color:#e2893c}.single .content .code-block .highlight .mo{color:#e2893c}.single .content .code-block .highlight .o{color:#f19b04}.single .content .code-block .highlight .ow{color:#b501a9}.single .content .code-block .highlight .c{color:#a0a1a8}.single .content .code-block .highlight .ch{color:#a0a1a8}.single .content .code-block .highlight .cm{color:#a0a1a8}.single .content .code-block .highlight .c1{color:#a0a1a8}.single .content .code-block .highlight .cs{color:#a0a1a8}.single .content .code-block .highlight .cp{color:#a0a1a8}.single .content .code-block .highlight .cpf{color:#a0a1a8}.single .content .code-block .highlight .g{color:#e72d40}.single .content .code-block .highlight .gd{color:#e72d40}.single .content .code-block .highlight .ge{color:#e72d40}.single .content .code-block .highlight .gr{color:#e72d40}.single .content .code-block .highlight .gh{color:#e72d40}.single .content .code-block .highlight .gi{color:#e72d40}.single .content .code-block .highlight .go{color:#e72d40}.single .content .code-block .highlight .gp{color:#e72d40}.single .content .code-block .highlight .gs{color:#e72d40}.single .content .code-block .highlight .gu{color:#e72d40}.single .content .code-block .highlight .gt{color:#e72d40}.single .content .code-block .highlight .w{color:#bbb}[theme=dark] .single .content .code-block .highlight .p{color:#a9a9b3}[theme=dark] .single .content .code-block .highlight .k{color:#d371e3}[theme=dark] .single .content .code-block .highlight .kc{color:#d371e3}[theme=dark] .single .content .code-block .highlight .kd{color:#d371e3}[theme=dark] .single .content .code-block .highlight .kn{color:#d371e3}[theme=dark] .single .content .code-block .highlight .kp{color:#d371e3}[theme=dark] .single .content .code-block .highlight .kr{color:#d371e3}[theme=dark] .single .content .code-block .highlight .kt{color:#d371e3}[theme=dark] .single .content .code-block .highlight .n{color:#a9b2c0}[theme=dark] .single .content .code-block .highlight .na{color:#41b0f5}[theme=dark] .single .content .code-block .highlight .nb{color:#19b9c4}[theme=dark] .single .content .code-block .highlight .bp{color:#ecbf6f}[theme=dark] .single .content .code-block .highlight .nc{color:#ecbf6f}[theme=dark] .single .content .code-block .highlight .no{color:#41b0f5}[theme=dark] .single .content .code-block .highlight .nd{color:#ecbf6f}[theme=dark] .single .content .code-block .highlight .ni{color:#41b0f5}[theme=dark] .single .content .code-block .highlight .ne{color:#41b0f5}[theme=dark] .single .content .code-block .highlight .nf{color:#41b0f5}[theme=dark] .single .content .code-block .highlight .fm{color:#19b9c4}[theme=dark] .single .content .code-block .highlight .nl{color:#41b0f5}[theme=dark] .single .content .code-block .highlight .nn{color:#41b0f5}[theme=dark] .single .content .code-block .highlight .nx{color:#a9a9b3}[theme=dark] .single .content .code-block .highlight .py{color:#41b0f5}[theme=dark] .single .content .code-block .highlight .nt{color:#41b0f5}[theme=dark] .single .content .code-block .highlight .nv{color:#41b0f5}[theme=dark] .single .content .code-block .highlight .vc{color:#41b0f5}[theme=dark] .single .content .code-block .highlight .vg{color:#41b0f5}[theme=dark] .single .content .code-block .highlight .vi{color:#41b0f5}[theme=dark] .single .content .code-block .highlight .vm{color:#41b0f5}[theme=dark] .single .content .code-block .highlight .l{color:#2aa198}[theme=dark] .single .content .code-block .highlight .ld{color:#2aa198}[theme=dark] .single .content .code-block .highlight .s{color:#8cc570}[theme=dark] .single .content .code-block .highlight .sa{color:#8cc570}[theme=dark] .single .content .code-block .highlight .sb{color:#8cc570}[theme=dark] .single .content .code-block .highlight .sc{color:#8cc570}[theme=dark] .single .content .code-block .highlight .dl{color:#8cc570}[theme=dark] .single .content .code-block .highlight .sd{color:#8cc570}[theme=dark] .single .content .code-block .highlight .s2{color:#8cc570}[theme=dark] .single .content .code-block .highlight .se{color:#8cc570}[theme=dark] .single .content .code-block .highlight .sh{color:#8cc570}[theme=dark] .single .content .code-block .highlight .si{color:#8cc570}[theme=dark] .single .content .code-block .highlight .sx{color:#8cc570}[theme=dark] .single .content .code-block .highlight .sr{color:#8cc570}[theme=dark] .single .content .code-block .highlight .s1{color:#8cc570}[theme=dark] .single .content .code-block .highlight .ss{color:#8cc570}[theme=dark] .single .content .code-block .highlight .m{color:#db985c}[theme=dark] .single .content .code-block .highlight .mb{color:#db985c}[theme=dark] .single .content .code-block .highlight .mf{color:#db985c}[theme=dark] .single .content .code-block .highlight .mh{color:#db985c}[theme=dark] .single .content .code-block .highlight .mi{color:#db985c}[theme=dark] .single .content .code-block .highlight .il{color:#db985c}[theme=dark] .single .content .code-block .highlight .mo{color:#db985c}[theme=dark] .single .content .code-block .highlight .o{color:#ecbf6f}[theme=dark] .single .content .code-block .highlight .ow{color:#d371e3}[theme=dark] .single .content .code-block .highlight .c{color:#7e848f}[theme=dark] .single .content .code-block .highlight .ch{color:#7e848f}[theme=dark] .single .content .code-block .highlight .cm{color:#7e848f}[theme=dark] .single .content .code-block .highlight .c1{color:#7e848f}[theme=dark] .single .content .code-block .highlight .cs{color:#7e848f}[theme=dark] .single .content .code-block .highlight .cp{color:#7e848f}[theme=dark] .single .content .code-block .highlight .cpf{color:#7e848f}[theme=dark] .single .content .code-block .highlight .g{color:#f16372}[theme=dark] .single .content .code-block .highlight .gd{color:#f16372}[theme=dark] .single .content .code-block .highlight .ge{color:#f16372}[theme=dark] .single .content .code-block .highlight .gr{color:#f16372}[theme=dark] .single .content .code-block .highlight .gh{color:#f16372}[theme=dark] .single .content .code-block .highlight .gi{color:#f16372}[theme=dark] .single .content .code-block .highlight .go{color:#f16372}[theme=dark] .single .content .code-block .highlight .gp{color:#f16372}[theme=dark] .single .content .code-block .highlight .gs{color:#f16372}[theme=dark] .single .content .code-block .highlight .gu{color:#f16372}[theme=dark] .single .content .code-block .highlight .gt{color:#f16372}[theme=dark] .single .content .code-block .highlight .w{color:#bbb}.single .content .code-block.open .code-header{background:#ededed}[theme=dark] .single .content .code-block.open .code-header{background:#20252b}.single .content .code-block.open .code-header .arrow{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.single .content .code-block.open .code-header .ellipses{display:none}.single .content .code-block.open .code-header .copy{display:inline}.single .content .code-block.open .highlight{max-height:20000px;-webkit-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;-moz-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;-o-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s}.single .content .code-block:not(.open) ::-webkit-scrollbar{height:0}.single .content .code-block.code-line-numbers span.line::before{display:inline-block;counter-increment:code-block;content:counter(code-block);min-width:4ch;text-align:right;text-wrap:nowrap;box-sizing:border-box;border-width:0;margin-right:1rem;color:#9c9c9c}[theme=dark] .single .content .code-block.code-line-numbers span.line::before{color:#b1b0b0}.single .content .gist{font-family:var(--code-font-family);font-size:var(--code-font-size)}.single .content .gist table,.single .content .gist table thead,.single .content .gist table tr,.single .content .gist table td{margin:0;padding:0;border:none}.single .content .gist .gist-file,.single .content .gist .gist-data,.single .content .gist .gist-meta{border:none}.single .content .gist .gist-meta{padding:.4rem .8rem;background-color:#e8e8e8}.single .content .gist .gist-meta a,.single .content .gist .gist-meta a::before,.single .content .gist .gist-meta a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .content .gist .gist-meta a,[theme=dark] .single .content .gist .gist-meta a::before,[theme=dark] .single .content .gist .gist-meta a::after{color:#55bde2}.single .content .gist .gist-meta a:active,.single .content .gist .gist-meta a:hover{color:#ef3982}[theme=dark] .single .content .gist .gist-meta a:active,[theme=dark] .single .content .gist .gist-meta a:hover{color:#bdebfc}[theme=dark] .single .content .gist .gist-meta{background-color:#1c2025}[theme=dark] .single .content .gist .highlight{background:#141414}[theme=dark] .single .content .gist .blob-num,[theme=dark] .single .content .gist .blob-code-inner,[theme=dark] .single .content .gist .highlight,[theme=dark] .single .content .gist .pl-enm,[theme=dark] .single .content .gist .pl-ko,[theme=dark] .single .content .gist .pl-mo,[theme=dark] .single .content .gist .pl-mp1 .pl-sf,[theme=dark] .single .content .gist .pl-ms,[theme=dark] .single .content .gist .pl-pdc1,[theme=dark] .single .content .gist .pl-scp,[theme=dark] .single .content .gist .pl-smc,[theme=dark] .single .content .gist .pl-som,[theme=dark] .single .content .gist .pl-va,[theme=dark] .single .content .gist .pl-vpf,[theme=dark] .single .content .gist .pl-vpu,[theme=dark] .single .content .gist .pl-mdr{color:#aab1bf}[theme=dark] .single .content .gist .pl-mb,[theme=dark] .single .content .gist .pl-pdb{font-weight:700}[theme=dark] .single .content .gist .pl-c,[theme=dark] .single .content .gist .pl-c span,[theme=dark] .single .content .gist .pl-pdc{color:#5b6270;font-style:italic}[theme=dark] .single .content .gist .pl-sr .pl-cce{color:#56b5c2;font-weight:400}[theme=dark] .single .content .gist .pl-ef,[theme=dark] .single .content .gist .pl-en,[theme=dark] .single .content .gist .pl-enf,[theme=dark] .single .content .gist .pl-eoai,[theme=dark] .single .content .gist .pl-kos,[theme=dark] .single .content .gist .pl-mh .pl-pdh,[theme=dark] .single .content .gist .pl-mr{color:#61afef}[theme=dark] .single .content .gist .pl-ens,[theme=dark] .single .content .gist .pl-vi{color:#be5046}[theme=dark] .single .content .gist .pl-enti,[theme=dark] .single .content .gist .pl-mai .pl-sf,[theme=dark] .single .content .gist .pl-ml,[theme=dark] .single .content .gist .pl-sf,[theme=dark] .single .content .gist .pl-sr,[theme=dark] .single .content .gist .pl-sr .pl-sra,[theme=dark] .single .content .gist .pl-src,[theme=dark] .single .content .gist .pl-st,[theme=dark] .single .content .gist .pl-vo{color:#56b5c2}[theme=dark] .single .content .gist .pl-eoi,[theme=dark] .single .content .gist .pl-mri,[theme=dark] .single .content .gist .pl-pds,[theme=dark] .single .content .gist .pl-pse .pl-s1,[theme=dark] .single .content .gist .pl-s,[theme=dark] .single .content .gist .pl-s1{color:#97c279}[theme=dark] .single .content .gist .pl-k,[theme=dark] .single .content .gist .pl-kolp,[theme=dark] .single .content .gist .pl-mc,[theme=dark] .single .content .gist .pl-pde{color:#c578dd}[theme=dark] .single .content .gist .pl-mi,[theme=dark] .single .content .gist .pl-pdi{color:#c578dd;font-style:italic}[theme=dark] .single .content .gist .pl-mp,[theme=dark] .single .content .gist .pl-stp{color:#818896}[theme=dark] .single .content .gist .pl-mdh,[theme=dark] .single .content .gist .pl-mdi,[theme=dark] .single .content .gist .pl-mdr{font-weight:400}[theme=dark] .single .content .gist .pl-mdht,[theme=dark] .single .content .gist .pl-mi1{color:#97c279;background:#020}[theme=dark] .single .content .gist .pl-md,[theme=dark] .single .content .gist .pl-mdhf{color:#df6b75;background:#200}[theme=dark] .single .content .gist .pl-corl{color:#df6b75;text-decoration:underline}[theme=dark] .single .content .gist .pl-ib{background:#df6b75}[theme=dark] .single .content .gist .pl-ii{background:#e0c184;color:#fff}[theme=dark] .single .content .gist .pl-iu{background:#e05151}[theme=dark] .single .content .gist .pl-ms1{color:#aab1bf;background:#373b41}[theme=dark] .single .content .gist .pl-c1,[theme=dark] .single .content .gist .pl-cn,[theme=dark] .single .content .gist .pl-e,[theme=dark] .single .content .gist .pl-eoa,[theme=dark] .single .content .gist .pl-eoac,[theme=dark] .single .content .gist .pl-eoac .pl-pde,[theme=dark] .single .content .gist .pl-kou,[theme=dark] .single .content .gist .pl-mm,[theme=dark] .single .content .gist .pl-mp .pl-s3,[theme=dark] .single .content .gist .pl-mq,[theme=dark] .single .content .gist .pl-s3,[theme=dark] .single .content .gist .pl-sok,[theme=dark] .single .content .gist .pl-sv,[theme=dark] .single .content .gist .pl-mb{color:#d19965}[theme=dark] .single .content .gist .pl-enc,[theme=dark] .single .content .gist .pl-entc,[theme=dark] .single .content .gist .pl-pse .pl-s2,[theme=dark] .single .content .gist .pl-s2,[theme=dark] .single .content .gist .pl-sc,[theme=dark] .single .content .gist .pl-smp,[theme=dark] .single .content .gist .pl-sr .pl-sre,[theme=dark] .single .content .gist .pl-stj,[theme=dark] .single .content .gist .pl-v,[theme=dark] .single .content .gist .pl-pdb{color:#e4bf7a}[theme=dark] .single .content .gist .pl-ent,[theme=dark] .single .content .gist .pl-entl,[theme=dark] .single .content .gist .pl-entm,[theme=dark] .single .content .gist .pl-mh,[theme=dark] .single .content .gist .pl-pdv,[theme=dark] .single .content .gist .pl-smi,[theme=dark] .single .content .gist .pl-sol,[theme=dark] .single .content .gist .pl-mdh,[theme=dark] .single .content .gist .pl-mdi{color:#df6b75}[theme=dark] .single .content iframe.instagram-media{border:none !important}.single .content .admonition{position:relative;margin:1rem 0;padding:0 .75rem;border-left:.25rem solid;overflow:auto;background-color:rgba(68,138,255,0.1);border-left-color:#448aff}.single .content .admonition .admonition-title{font-weight:bold;margin:0 -0.75rem;padding:.25rem 1.8rem}.single .content .admonition .admonition-content{padding:.5rem 0}.single .content .admonition i.icon{font-size:0.85rem;position:absolute;top:.6rem;left:.4rem}.single .content .admonition i.details-icon{position:absolute;top:.6rem;right:.3rem}.single .content .admonition .admonition-title{border-bottom-color:rgba(68,138,255,0.1);background-color:rgba(68,138,255,0.25)}.single .content .admonition.open .admonition-title{background-color:rgba(68,138,255,0.1)}.single .content .admonition i.icon{color:#448aff}.single .content .admonition.abstract{background-color:rgba(0,176,255,0.1);border-left-color:#00b0ff}.single .content .admonition.abstract .admonition-title{border-bottom-color:rgba(0,176,255,0.1);background-color:rgba(0,176,255,0.25)}.single .content .admonition.abstract.open .admonition-title{background-color:rgba(0,176,255,0.1)}.single .content .admonition.abstract i.icon{color:#00b0ff}.single .content .admonition.info{background-color:rgba(83,211,230,0.1);border-left-color:#00b8d4}.single .content .admonition.info .admonition-title{border-bottom-color:rgba(83,211,230,0.1);background-color:rgba(83,211,230,0.25)}.single .content .admonition.info.open .admonition-title{background-color:rgba(83,211,230,0.1)}.single .content .admonition.info i.icon{color:#00b8d4}.single .content .admonition.tip{background-color:rgba(0,191,165,0.1);border-left-color:#00bfa5}.single .content .admonition.tip .admonition-title{border-bottom-color:rgba(0,191,165,0.1);background-color:rgba(0,191,165,0.25)}.single .content .admonition.tip.open .admonition-title{background-color:rgba(0,191,165,0.1)}.single .content .admonition.tip i.icon{color:#00bfa5}.single .content .admonition.success{background-color:rgba(0,200,83,0.1);border-left-color:#00c853}.single .content .admonition.success .admonition-title{border-bottom-color:rgba(0,200,83,0.1);background-color:rgba(0,200,83,0.25)}.single .content .admonition.success.open .admonition-title{background-color:rgba(0,200,83,0.1)}.single .content .admonition.success i.icon{color:#00c853}.single .content .admonition.question{background-color:rgba(100,221,23,0.1);border-left-color:#64dd17}.single .content .admonition.question .admonition-title{border-bottom-color:rgba(100,221,23,0.1);background-color:rgba(100,221,23,0.25)}.single .content .admonition.question.open .admonition-title{background-color:rgba(100,221,23,0.1)}.single .content .admonition.question i.icon{color:#64dd17}.single .content .admonition.warning{background-color:rgba(255,145,0,0.1);border-left-color:#ff9100}.single .content .admonition.warning .admonition-title{border-bottom-color:rgba(255,145,0,0.1);background-color:rgba(255,145,0,0.25)}.single .content .admonition.warning.open .admonition-title{background-color:rgba(255,145,0,0.1)}.single .content .admonition.warning i.icon{color:#ff9100}.single .content .admonition.failure{background-color:rgba(255,82,82,0.1);border-left-color:#ff5252}.single .content .admonition.failure .admonition-title{border-bottom-color:rgba(255,82,82,0.1);background-color:rgba(255,82,82,0.25)}.single .content .admonition.failure.open .admonition-title{background-color:rgba(255,82,82,0.1)}.single .content .admonition.failure i.icon{color:#ff5252}.single .content .admonition.danger{background-color:rgba(68,138,255,0.1);border-left-color:#ff1744}.single .content .admonition.danger .admonition-title{border-bottom-color:rgba(68,138,255,0.1);background-color:rgba(68,138,255,0.25)}.single .content .admonition.danger.open .admonition-title{background-color:rgba(68,138,255,0.1)}.single .content .admonition.danger i.icon{color:#ff1744}.single .content .admonition.bug{background-color:rgba(255,23,68,0.1);border-left-color:#f50057}.single .content .admonition.bug .admonition-title{border-bottom-color:rgba(255,23,68,0.1);background-color:rgba(255,23,68,0.25)}.single .content .admonition.bug.open .admonition-title{background-color:rgba(255,23,68,0.1)}.single .content .admonition.bug i.icon{color:#f50057}.single .content .admonition.example{background-color:rgba(101,31,255,0.1);border-left-color:#651fff}.single .content .admonition.example .admonition-title{border-bottom-color:rgba(101,31,255,0.1);background-color:rgba(101,31,255,0.25)}.single .content .admonition.example.open .admonition-title{background-color:rgba(101,31,255,0.1)}.single .content .admonition.example i.icon{color:#651fff}.single .content .admonition.quote{background-color:rgba(159,159,159,0.1);border-left-color:#9e9e9e}.single .content .admonition.quote .admonition-title{border-bottom-color:rgba(159,159,159,0.1);background-color:rgba(159,159,159,0.25)}.single .content .admonition.quote.open .admonition-title{background-color:rgba(159,159,159,0.1)}.single .content .admonition.quote i.icon{color:#9e9e9e}.single .content .admonition:last-child{margin-bottom:.75rem}.single .content .echarts{margin:.5rem 0;text-align:center}.single .content .mapbox{margin:.5rem 0;padding:.5rem 0}.single .content meting-js{margin:.5rem 0}.single .content .bilibili{position:relative;width:100%;height:0;padding-bottom:75%;margin:3% auto;text-align:center}.single .content .bilibili iframe{position:absolute;width:100%;height:100%;left:0;top:0}.single .content hr{margin:1rem 0;position:relative;border-top:1px dashed #f0f0f0;border-bottom:none}[theme=dark] .single .content hr{border-top:1px dashed #363636}.single .content kbd{display:inline-block;padding:.25rem;background-color:#fff;border:1px solid #f0f0f0;border-bottom-color:#f0f0f0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 #f0f0f0;box-shadow:inset 0 -1px 0 #f0f0f0;font-size:.8rem;font-family:var(--code-font-family);color:#E74C3C}[theme=dark] .single .content kbd{background-color:#292a2d;border:1px solid #363636;border-bottom-color:#363636;-webkit-box-shadow:inset 0 -1px 0 #363636;box-shadow:inset 0 -1px 0 #363636;color:#E5BF78}.single .content .version{height:1.25em;vertical-align:text-bottom}.single .content .person-mention.h-card{display:inline-block}.single .content .person-mention.h-card img{vertical-align:-12%;max-height:1.1em;margin-right:0;border-radius:50%}.single .post-footer{margin-top:3rem}.single .post-footer .post-info{border-bottom:1px solid #f0f0f0;padding:1rem 0 0.3rem}[theme=dark] .single .post-footer .post-info{border-bottom:1px solid #363636}.single .post-footer .post-info .post-info-line{display:flex;justify-content:space-between}.single .post-footer .post-info .post-info-line .post-info-mod{font-size:0.8em;color:#a9a9b3}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod{color:#5d5d5f}.single .post-footer .post-info .post-info-line .post-info-mod a,.single .post-footer .post-info .post-info-line .post-info-mod a::before,.single .post-footer .post-info .post-info-line .post-info-mod a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod a,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod a::before,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod a::after{color:#55bde2}.single .post-footer .post-info .post-info-line .post-info-mod a:active,.single .post-footer .post-info .post-info-line .post-info-mod a:hover{color:#ef3982}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod a:active,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod a:hover{color:#bdebfc}.single .post-footer .post-info .post-info-line .post-info-license{font-size:0.8em;color:#a9a9b3}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license{color:#5d5d5f}.single .post-footer .post-info .post-info-line .post-info-license a,.single .post-footer .post-info .post-info-line .post-info-license a::before,.single .post-footer .post-info .post-info-line .post-info-license a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license a,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license a::before,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license a::after{color:#55bde2}.single .post-footer .post-info .post-info-line .post-info-license a:active,.single .post-footer .post-info .post-info-line .post-info-license a:hover{color:#ef3982}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license a:active,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license a:hover{color:#bdebfc}.single .post-footer .post-info .post-info-line .post-info-md{font-size:0.8rem;width:8rem}.single .post-footer .post-info .post-info-line .post-info-md a,.single .post-footer .post-info .post-info-line .post-info-md a::before,.single .post-footer .post-info .post-info-line .post-info-md a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-md a,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-md a::before,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-md a::after{color:#55bde2}.single .post-footer .post-info .post-info-line .post-info-md a:active,.single .post-footer .post-info .post-info-line .post-info-md a:hover{color:#ef3982}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-md a:active,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-md a:hover{color:#bdebfc}.single .post-footer .post-info .post-info-line .post-info-share a *{vertical-align:text-bottom}.single .post-footer .post-info-more{padding:0.3rem 0 1rem;display:flex;justify-content:space-between;font-size:0.9rem}.single .post-footer .post-tags{max-width:65%}.single .post-footer .post-tags *{display:inline}.single .post-footer .post-nav::before,.single .post-footer .post-nav::after{content:" ";display:table}.single .post-footer .post-nav a.prev,.single .post-footer .post-nav a.next{font-size:1rem;font-weight:600;-webkit-transition:all 0.3s ease-out;-moz-transition:all 0.3s ease-out;-o-transition:all 0.3s ease-out;transition:all 0.3s ease-out}.single .post-footer .post-nav a.prev{float:left}.single .post-footer .post-nav a.prev:hover{-webkit-transform:translateX(-4px);-ms-transform:translateX(-4px);-o-transform:translateX(-4px);transform:translateX(-4px)}.single .post-footer .post-nav a.next{float:right}.single .post-footer .post-nav a.next:hover{-webkit-transform:translateX(4px);-ms-transform:translateX(4px);-o-transform:translateX(4px);transform:translateX(4px)}.single #comments{padding:8rem 0 2rem}.single #comments .vemoji{max-width:1.5em;max-height:1.5em}.typeit{--ti-cursor-font-family: var(--global-font-family);--ti-cursor-font-size: var(--global-font-size);--ti-cursor-font-weight: var(--global-font-weight);--ti-cursor-line-height: var(--global-line-height);--ti-cursor-color: $global-font-secondary-color;--ti-cursor-margin-left: 0}.typeit .highlight{padding:.375rem;font-size:.875rem;font-family:var(--code-font-family);font-weight:bold;word-break:break-all;white-space:pre-wrap}[theme=dark] .typeit{--ti-cursor-color: $global-font-secondary-color-dark}.lg-toolbar .lg-icon::after{color:#999}.special .single-title,.special .single-subtitle{text-align:right}.archive .single-title{text-align:right}.archive .group-title{margin-top:1.5rem;margin-bottom:1rem}.archive .categories-card{margin:0 auto;margin-top:3rem;display:flex;align-items:center;justify-content:space-between;flex-direction:row;flex-wrap:wrap;line-height:1.6rem}.archive .categories-card .card-item{font-size:.875rem;text-align:left;width:45%;display:flex;align-items:flex-start;margin-top:2rem;min-height:10rem;padding:0 2%;position:relative}.archive .categories-card .card-item .card-item-wrapper{width:100%;overflow:hidden}.archive .categories-card .card-item .card-item-wrapper .card-item-title{font-size:1.2rem;font-weight:bold;display:inline-block;margin-top:1rem;margin-bottom:.75rem}.archive .categories-card .card-item .card-item-wrapper span{float:right;padding-right:1rem}.archive .archive-item{display:flex;justify-content:space-between;align-items:center;box-sizing:border-box;margin:.25rem 0 .25rem 1.5rem}.archive .archive-item-link{min-width:10%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.archive .archive-item-link:hover{color:#2d96bd;background-color:transparent}[theme=dark] .archive .archive-item-link{color:#a9a9b3}[theme=dark] .archive .archive-item-link:hover{color:#fff}.archive .archive-item-date{width:5em;text-align:right;color:#a9a9b3}[theme=dark] .archive .archive-item-date{color:#5d5d5f}.archive .more-post{text-align:right}.archive .tag-cloud-tags{margin:10px 0}.archive .tag-cloud-tags a,.archive .tag-cloud-tags a::before,.archive .tag-cloud-tags a::after{text-decoration:none;color:#161209}[theme=dark] .archive .tag-cloud-tags a,[theme=dark] .archive .tag-cloud-tags a::before,[theme=dark] .archive .tag-cloud-tags a::after{color:#a9a9b3}.archive .tag-cloud-tags a:active,.archive .tag-cloud-tags a:hover{color:#2d96bd}[theme=dark] .archive .tag-cloud-tags a:active,[theme=dark] .archive .tag-cloud-tags a:hover{color:#fff}.archive .tag-cloud-tags a{display:inline-block;position:relative;margin:5px 10px;word-wrap:break-word;overflow-wrap:break-word;-webkit-transition:all ease-out 0.3s;-moz-transition:all ease-out 0.3s;-o-transition:all ease-out 0.3s;transition:all ease-out 0.3s}.archive .tag-cloud-tags a:active,.archive .tag-cloud-tags a:focus,.archive .tag-cloud-tags a:hover{-webkit-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}.archive .tag-cloud-tags a sup{color:#a9a9b3}[theme=dark] .archive .tag-cloud-tags a sup{color:#5d5d5f}.home{padding-bottom:5rem}.home .home-profile{-webkit-transform:translateY(16vh);-ms-transform:translateY(16vh);-o-transform:translateY(16vh);transform:translateY(16vh);padding:0 0 .5rem;text-align:center}.home .home-profile .home-avatar{padding:.5rem}.home .home-profile .home-avatar img{display:inline-block;width:8rem;height:auto;margin:0 auto;-webkit-border-radius:100%;-moz-border-radius:100%;border-radius:100%;-webkit-box-shadow:0 0 0 0.3618em rgba(0,0,0,0.05);box-shadow:0 0 0 0.3618em rgba(0,0,0,0.05);-webkit-transition:all 0.4s ease;-moz-transition:all 0.4s ease;-o-transition:all 0.4s ease;transition:all 0.4s ease}.home .home-profile .home-avatar img:hover{position:relative;-webkit-transform:translateY(-0.75rem);-ms-transform:translateY(-0.75rem);-o-transform:translateY(-0.75rem);transform:translateY(-0.75rem)}.home .home-profile .home-title{font-size:1.25rem;font-weight:bold;margin:0;padding:.5rem}.home .home-profile .home-subtitle{font-size:1rem;font-weight:normal;margin:0;padding:.5rem}.home .home-profile .links{padding:.5rem;font-size:1.5rem}.home .home-profile .links a *{vertical-align:text-bottom}.home .home-profile .links img{height:1.5rem;padding:0 .25rem}.home .home-profile .home-disclaimer{font-size:1rem;line-height:1.5rem;font-weight:normal;margin:0;padding:.5rem;color:#a9a9b3}[theme=dark] .home .home-profile .home-disclaimer{color:#5d5d5f}.home[data-home=posts] .home-profile{-webkit-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0);padding-top:2rem}.home[data-home=posts] .home-avatar img{width:6rem}.home[data-home=posts] .summary{padding-top:1rem;padding-bottom:.8rem;color:#161209;border-bottom:1px dashed #f0f0f0}[theme=dark] .home[data-home=posts] .summary{color:#a9a9b3;border-bottom:1px dashed #363636}.home[data-home=posts] .summary .featured-image-preview{width:100%;padding:30% 0 0;position:relative;margin:0.6rem auto;-webkit-transition:transform 0.4s ease;-moz-transition:transform 0.4s ease;-o-transition:transform 0.4s ease;transition:transform 0.4s ease}.home[data-home=posts] .summary .featured-image-preview img{position:absolute;width:100%;height:100%;left:0;top:0}.home[data-home=posts] .summary .featured-image-preview img.lazyloaded{-o-object-fit:cover;object-fit:cover;font-family:"object-fit: cover;"}.home[data-home=posts] .summary .featured-image-preview:hover{-webkit-transform:scale(1.01);-ms-transform:scale(1.01);-o-transform:scale(1.01);transform:scale(1.01)}.home[data-home=posts] .summary .single-title{font-size:1.25rem;line-height:140%;margin:0.4rem 0}.home[data-home=posts] .summary .content{display:-moz-box;display:-webkit-box;display:box;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-line-clamp:3;margin-top:.3rem;width:100%;overflow:hidden;text-overflow:ellipsis;word-wrap:break-word;overflow-wrap:break-word;color:#a9a9b3}[theme=dark] .home[data-home=posts] .summary .content{color:#5d5d5f}.home[data-home=posts] .summary .content h2,.home[data-home=posts] .summary .content h3,.home[data-home=posts] .summary .content h4,.home[data-home=posts] .summary .content h5,.home[data-home=posts] .summary .content h6,.home[data-home=posts] .summary .content p{font-size:1rem;line-height:1.5;display:inline}.home[data-home=posts] .summary .content h2::after,.home[data-home=posts] .summary .content h3::after,.home[data-home=posts] .summary .content h4::after,.home[data-home=posts] .summary .content h5::after,.home[data-home=posts] .summary .content h6::after,.home[data-home=posts] .summary .content p::after{content:"\A";white-space:pre}.home[data-home=posts] .summary .content h2{font-size:1.125rem}.home[data-home=posts] .summary .content a,.home[data-home=posts] .summary .content a::before,.home[data-home=posts] .summary .content a::after{text-decoration:none;color:#2d96bd}[theme=dark] .home[data-home=posts] .summary .content a,[theme=dark] .home[data-home=posts] .summary .content a::before,[theme=dark] .home[data-home=posts] .summary .content a::after{color:#a9a9b3}.home[data-home=posts] .summary .content a:active,.home[data-home=posts] .summary .content a:hover{color:#ef3982}[theme=dark] .home[data-home=posts] .summary .content a:active,[theme=dark] .home[data-home=posts] .summary .content a:hover{color:#fff}.home[data-home=posts] .summary .content b,.home[data-home=posts] .summary .content strong{color:#a9a9b3}[theme=dark] .home[data-home=posts] .summary .content b,[theme=dark] .home[data-home=posts] .summary .content strong{color:#5d5d5f}.home[data-home=posts] .summary .post-footer{margin-top:.4rem;display:flex;justify-content:space-between;align-items:center;font-size:.875rem}.home[data-home=posts] .summary .post-footer a,.home[data-home=posts] .summary .post-footer a::before,.home[data-home=posts] .summary .post-footer a::after{text-decoration:none;color:#2d96bd}[theme=dark] .home[data-home=posts] .summary .post-footer a,[theme=dark] .home[data-home=posts] .summary .post-footer a::before,[theme=dark] .home[data-home=posts] .summary .post-footer a::after{color:#55bde2}.home[data-home=posts] .summary .post-footer a:active,.home[data-home=posts] .summary .post-footer a:hover{color:#ef3982}[theme=dark] .home[data-home=posts] .summary .post-footer a:active,[theme=dark] .home[data-home=posts] .summary .post-footer a:hover{color:#bdebfc}.home[data-home=posts] .summary .post-footer .post-tags{padding:0}.home[data-home=posts] .summary .post-footer .post-tags a,.home[data-home=posts] .summary .post-footer .post-tags a::before,.home[data-home=posts] .summary .post-footer .post-tags a::after{text-decoration:none;color:#161209}[theme=dark] .home[data-home=posts] .summary .post-footer .post-tags a,[theme=dark] .home[data-home=posts] .summary .post-footer .post-tags a::before,[theme=dark] .home[data-home=posts] .summary .post-footer .post-tags a::after{color:#a9a9b3}.home[data-home=posts] .summary .post-footer .post-tags a:active,.home[data-home=posts] .summary .post-footer .post-tags a:hover{color:#2d96bd}[theme=dark] .home[data-home=posts] .summary .post-footer .post-tags a:active,[theme=dark] .home[data-home=posts] .summary .post-footer .post-tags a:hover{color:#fff}#content-404{font-size:1.8rem;line-height:3rem;-webkit-transform:translateY(30vh);-ms-transform:translateY(30vh);-o-transform:translateY(30vh);transform:translateY(30vh);text-align:center}header{width:100%;z-index:150;background-color:#f8f8f8;-webkit-transition:box-shadow 0.3s ease;-moz-transition:box-shadow 0.3s ease;-o-transition:box-shadow 0.3s ease;transition:box-shadow 0.3s ease}[theme=dark] header{background-color:#252627}header .logo{min-height:1.5em;height:1.5em;vertical-align:text-bottom}header .logo,header .header-title-pre{padding-right:.25rem}header .header-title-post{padding-left:.25rem}header:hover{-webkit-box-shadow:0 0 1.5rem 0 rgba(0,0,0,0.1);box-shadow:0 0 1.5rem 0 rgba(0,0,0,0.1)}.header-wrapper{display:flex;justify-content:space-between;align-items:center;box-sizing:border-box;width:100%}.header-title{font-family:var(--header-title-font-family);font-weight:bold;margin-right:.5rem;min-width:10%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-webkit-flex:10;flex:10}.menu .menu-item{position:relative}.language-select{position:absolute;opacity:0;left:0;top:0;width:100%;height:100%}.language-select:hover{cursor:pointer}.search{position:relative}.search input{color:transparent;box-sizing:border-box;height:2.5rem;width:2.5rem;-webkit-border-radius:.5rem;-moz-border-radius:.5rem;border-radius:.5rem;border:none;outline:none;background-color:#f8f8f8;vertical-align:baseline !important;-webkit-transition:width 0.3s ease;-moz-transition:width 0.3s ease;-o-transition:width 0.3s ease;transition:width 0.3s ease}[theme=dark] .search input{background-color:#252627}.search input::-webkit-input-placeholder{color:rgba(0,0,0,0)}.search input:-moz-placeholder{color:rgba(0,0,0,0)}.search input::-moz-placeholder{color:rgba(0,0,0,0)}.search input:-ms-input-placeholder{color:rgba(0,0,0,0)}.search input::placeholder{color:rgba(0,0,0,0)}.search .search-button{margin:0;position:absolute;left:auto;right:1rem}.search .search-toggle{left:.5rem;right:auto}.search .search-loading{display:none}.search .search-clear{display:none}.open .search input,.search.mobile input{color:#161209;background-color:#e9e9e9;padding:0 2rem 0 2rem}[theme=dark] .open .search input,[theme=dark] .search.mobile input{color:#a9a9b3;background-color:#363636}[theme=dark] .open .search input::-webkit-input-placeholder,[theme=dark] .search.mobile input::-webkit-input-placeholder{color:#5d5d5f}[theme=dark] .open .search input:-moz-placeholder,[theme=dark] .search.mobile input:-moz-placeholder{color:#5d5d5f}[theme=dark] .open .search input::-moz-placeholder,[theme=dark] .search.mobile input::-moz-placeholder{color:#5d5d5f}[theme=dark] .open .search input:-ms-input-placeholder,[theme=dark] .search.mobile input:-ms-input-placeholder{color:#5d5d5f}[theme=dark] .open .search input::placeholder,[theme=dark] .search.mobile input::placeholder{color:#5d5d5f}.open .search input::-webkit-input-placeholder,.search.mobile input::-webkit-input-placeholder{color:#a9a9b3}.open .search input:-moz-placeholder,.search.mobile input:-moz-placeholder{color:#a9a9b3}.open .search input::-moz-placeholder,.search.mobile input::-moz-placeholder{color:#a9a9b3}.open .search input:-ms-input-placeholder,.search.mobile input:-ms-input-placeholder{color:#a9a9b3}.open .search input::placeholder,.search.mobile input::placeholder{color:#a9a9b3}.open .search .search-button,.search.mobile .search-button{color:#a9a9b3}[theme=dark] .open .search .search-button,[theme=dark] .search.mobile .search-button{color:#5d5d5f}.open .search .search-clear:hover,.search.mobile .search-clear:hover{color:#ff6b6b}.open .search .search-toggle:hover,.search.mobile .search-toggle:hover{cursor:default}.theme-switch i{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);-o-transform:rotate(225deg);transform:rotate(225deg)}#header-desktop{display:block;position:fixed;height:var(--header-height);line-height:var(--header-height)}[data-header-desktop=normal] #header-desktop{position:static}#header-desktop .header-wrapper{padding:0 2rem 0 10vh}#header-desktop .header-wrapper .header-title{font-size:var(--header-title-font-size)}#header-desktop .header-wrapper .menu{overflow:hidden;white-space:nowrap}#header-desktop .header-wrapper .menu .menu-inner{float:right}#header-desktop .header-wrapper .menu .menu-item{margin:0 .5rem}#header-desktop .header-wrapper .menu .menu-item.delimiter{border-left:1.5px solid #161209}[theme=dark] #header-desktop .header-wrapper .menu .menu-item.delimiter{border-left-color:#363636}#header-desktop .header-wrapper .menu .menu-item.language{margin-right:0}#header-desktop .header-wrapper .menu .menu-item.search{margin:0 -.5rem 0 0}#header-desktop .header-wrapper .menu a.active{font-weight:900;color:#161209}[theme=dark] #header-desktop .header-wrapper .menu a.active{color:#fff}#header-desktop.open .header-wrapper .menu .menu-item.search{margin:0 .25rem 0 .5rem}#header-desktop.open .header-wrapper .menu .menu-item.search input{width:24rem}#header-mobile{display:none;position:fixed;height:var(--header-height);line-height:var(--header-height)}[data-header-mobile=normal] #header-mobile{position:static}#header-mobile .header-container{padding:0;margin:0}#header-mobile .header-container .header-wrapper{padding:0 1rem;font-size:1.125rem;-webkit-transition:margin-top 0.3s ease;-moz-transition:margin-top 0.3s ease;-o-transition:margin-top 0.3s ease;transition:margin-top 0.3s ease}#header-mobile .header-container .header-wrapper .header-title{font-size:var(--header-title-font-size);max-width:80%}#header-mobile .header-container .header-wrapper .menu-toggle{line-height:4rem;cursor:pointer;-webkit-transition:width 0.3s ease;-moz-transition:width 0.3s ease;-o-transition:width 0.3s ease;transition:width 0.3s ease}#header-mobile .header-container .header-wrapper .menu-toggle span{display:block;background:#161209;width:1.5rem;height:2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-transition:all 0.3s ease-in-out;-moz-transition:all 0.3s ease-in-out;-o-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}[theme=dark] #header-mobile .header-container .header-wrapper .menu-toggle span{background:#a9a9b3}#header-mobile .header-container .header-wrapper .menu-toggle span:nth-child(1){margin-bottom:.5rem}#header-mobile .header-container .header-wrapper .menu-toggle span:nth-child(3){margin-top:.5rem}#header-mobile .header-container .header-wrapper .menu-toggle.active span:nth-child(1){-webkit-transform:rotate(45deg) translate(0.4rem, 0.5rem);-ms-transform:rotate(45deg) translate(0.4rem, 0.5rem);-o-transform:rotate(45deg) translate(0.4rem, 0.5rem);transform:rotate(45deg) translate(0.4rem, 0.5rem)}#header-mobile .header-container .header-wrapper .menu-toggle.active span:nth-child(2){opacity:0}#header-mobile .header-container .header-wrapper .menu-toggle.active span:nth-child(3){-webkit-transform:rotate(-45deg) translate(0.4rem, -0.5rem);-ms-transform:rotate(-45deg) translate(0.4rem, -0.5rem);-o-transform:rotate(-45deg) translate(0.4rem, -0.5rem);transform:rotate(-45deg) translate(0.4rem, -0.5rem)}#header-mobile .header-container .menu{text-align:center;background:#f8f8f8;border-top:2px solid #f0f0f0;display:none;padding-top:.5rem;-webkit-box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.1);box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.1)}#header-mobile .header-container .menu .search-wrapper{display:flex;justify-content:space-between;align-items:center;box-sizing:border-box;padding:calc((var(--header-height) - 2.5rem) / 2) 1rem;line-height:2.5rem}#header-mobile .header-container .menu .search{flex-grow:10}#header-mobile .header-container .menu .search .algolia-autocomplete,#header-mobile .header-container .menu .search input{width:100%}#header-mobile .header-container .menu .search-button{top:0}#header-mobile .header-container .menu .search-cancel{display:none;margin-left:.75rem}#header-mobile .header-container .menu .menu-item{display:block;line-height:2.5rem}#header-mobile .header-container .menu.active{display:block}[theme=dark] #header-mobile .header-container .menu{background:#252627;border-top-color:#363636}#header-mobile.open .header-wrapper{margin-top:calc(0px - var(--header-height))}#header-mobile.open .menu{padding-top:0;border-top:none}#header-mobile.open .menu .menu-item{display:none}#header-mobile.open .menu .search-cancel{display:inline}.search-dropdown{position:fixed;z-index:200;top:var(--header-height);-webkit-box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.1);box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.1)}.search-dropdown.desktop{right:2rem;width:30rem}.search-dropdown.mobile{right:0;width:100%}.search-dropdown .dropdown-menu{right:0 !important;background-color:#fff}[theme=dark] .search-dropdown .dropdown-menu{background-color:#292a2d}.search-dropdown .dropdown-menu .suggestions{overflow-y:auto;max-height:calc(100vh - var(--header-height))}.search-dropdown .dropdown-menu .suggestions .suggestion{padding:.75rem 1rem}.search-dropdown .dropdown-menu .suggestions .suggestion .suggestion-title{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1rem;font-weight:bold;max-width:75%}.search-dropdown .dropdown-menu .suggestions .suggestion .suggestion-date{font-size:.875rem;float:right;text-align:right;color:#a9a9b3}[theme=dark] .search-dropdown .dropdown-menu .suggestions .suggestion .suggestion-date{color:#5d5d5f}.search-dropdown .dropdown-menu .suggestions .suggestion .suggestion-context{line-height:1.25rem;display:-moz-box;display:-webkit-box;display:box;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;word-wrap:break-word;overflow-wrap:break-word;color:#a9a9b3}[theme=dark] .search-dropdown .dropdown-menu .suggestions .suggestion .suggestion-context{color:#5d5d5f}.search-dropdown .dropdown-menu .suggestions .suggestion em{font-style:normal;background-color:rgba(53,166,247,0.25)}[theme=dark] .search-dropdown .dropdown-menu .suggestions .suggestion em{background-color:rgba(50,112,194,0.4)}.search-dropdown .dropdown-menu .suggestions .suggestion.cursor{background:#e8e8e8}[theme=dark] .search-dropdown .dropdown-menu .suggestions .suggestion.cursor{background:#323843}.search-dropdown .dropdown-menu .suggestions .suggestion:hover{cursor:pointer}.search-dropdown .dropdown-menu .search-empty{padding:1rem;text-align:center}.search-dropdown .dropdown-menu .search-empty .search-query{font-weight:bold}[theme=dark] .search-dropdown .dropdown-menu .search-empty .search-query{color:#ddd}.search-dropdown .dropdown-menu .search-footer{padding:.5rem 1rem;float:right;font-size:.8rem;color:#a9a9b3}.search-dropdown .dropdown-menu .search-footer [theme=dark]{color:#5d5d5f}.search-dropdown .dropdown-menu .search-footer a,.search-dropdown .dropdown-menu .search-footer a::before,.search-dropdown .dropdown-menu .search-footer a::after{text-decoration:none;color:#2d96bd}[theme=dark] .search-dropdown .dropdown-menu .search-footer a,[theme=dark] .search-dropdown .dropdown-menu .search-footer a::before,[theme=dark] .search-dropdown .dropdown-menu .search-footer a::after{color:#55bde2}.search-dropdown .dropdown-menu .search-footer a:active,.search-dropdown .dropdown-menu .search-footer a:hover{color:#ef3982}[theme=dark] .search-dropdown .dropdown-menu .search-footer a:active,[theme=dark] .search-dropdown .dropdown-menu .search-footer a:hover{color:#bdebfc}.search-dropdown .dropdown-menu .search-footer a{font-size:1rem}footer{height:2rem;width:100%;text-align:center;line-height:1.25rem;padding:1rem 0}footer .footer-container{font-size:.875rem}footer .footer-container .footer-line{width:100%}footer .footer-container .footer-line .icp-br{display:none}.blur footer{-webkit-filter:blur(1.5px);filter:blur(1.5px)}.pagination{display:flex;flex-direction:row;justify-content:center;list-style:none;white-space:nowrap;width:100%;padding:1rem 0 0}.pagination a{font-size:.8rem;color:#bfbfbf;letter-spacing:.1rem;font-weight:700;padding:5px 5px;text-decoration:none;-webkit-transition:0.3s;-moz-transition:0.3s;-o-transition:0.3s;transition:0.3s}.pagination li{padding-bottom:3px;margin:0 20px;box-sizing:border-box;position:relative;display:inline}.pagination li.disabled{display:none}.pagination li:hover a{color:#000}[theme=dark] .pagination li:hover a{color:#fff}.pagination li:before,.pagination li:after{position:absolute;content:"";width:0;height:3px;background:#000;-webkit-transition:0.3s;-moz-transition:0.3s;-o-transition:0.3s;transition:0.3s;bottom:0px}[theme=dark] .pagination li:before,[theme=dark] .pagination li:after{background:#fff}.pagination li:before .active,.pagination li:after .active{width:100%}.pagination li:before{left:50%}.pagination li:after{right:50%}.pagination li:hover:before,.pagination li:hover:after{width:50%}.pagination li.active a{color:#000}[theme=dark] .pagination li.active a{color:#fff}.pagination li.active:before,.pagination li.active:after{width:60%}@media only screen and (max-width: 1440px){.page{width:60%}}@media only screen and (max-width: 1440px){.page{width:56%}}@media only screen and (max-width: 1280px){.page{width:52%}#header-desktop .header-wrapper{padding-right:1rem}.search-dropdown.desktop{right:1rem}}@media only screen and (max-width: 960px){#toc-auto{display:none}#toc-static{display:block}.page{width:80%}#header-desktop .header-wrapper{padding-left:1rem}}@media only screen and (max-width: 680px){#header-desktop{display:none}#header-mobile{display:block}body.blur{overflow:hidden}.page{width:100%}[data-header-mobile] .page{padding-top:var(--header-height)}[data-header-mobile=normal] .page{padding-top:0}.page .categories-card .card-item{width:100%}.copyright .copyright-line .icp-splitter{display:none}.copyright .copyright-line .icp-br{display:block}} + +/*# sourceMappingURL=style.min.css.map */ \ No newline at end of file diff --git a/resources/_gen/assets/scss/css/style.scss_26962b449d539ee5c1301a7879e5bb0e.json b/resources/_gen/assets/css/style.scss_1a67ae4ed98f18e3ea7da02d2ccd80c9.json similarity index 100% rename from resources/_gen/assets/scss/css/style.scss_26962b449d539ee5c1301a7879e5bb0e.json rename to resources/_gen/assets/css/style.scss_1a67ae4ed98f18e3ea7da02d2ccd80c9.json diff --git a/resources/_gen/assets/scss/css/style.scss_26962b449d539ee5c1301a7879e5bb0e.content b/resources/_gen/assets/scss/css/style.scss_26962b449d539ee5c1301a7879e5bb0e.content deleted file mode 100644 index ebb44fd..0000000 --- a/resources/_gen/assets/scss/css/style.scss_26962b449d539ee5c1301a7879e5bb0e.content +++ /dev/null @@ -1,3 +0,0 @@ -html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:0.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}@font-face{font-family:Emoji;src:local("Apple Color Emoji"),local("Segoe UI Emoji"),local("Segoe UI Symbol"),local("Noto Color Emoji");unicode-range:U+1F000-1F644, U+203C-3299}:root{--global-font-family: system-ui, -apple-system, Segoe UI, Roboto, Emoji, Helvetica, Arial, sans-serif;--global-font-size: 16px;--global-font-weight: 400;--global-line-height: 1.5rem;--header-height: 3.5rem;--header-title-font-family: system-ui, -apple-system, Segoe UI, Roboto, Emoji, Helvetica, Arial, sans-serif;--header-title-font-size: 1.5rem;--toc-title-font-size: 1.2rem;--toc-content-font-size: 1rem;--code-font-family: "Source Code Pro", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--code-font-size: .875rem}html{font-family:var(--global-font-family);font-weight:var(--global-font-weight);font-display:swap;font-size:var(--global-font-size);line-height:var(--global-line-height);width:100%;scroll-behavior:smooth}html main [id]{scroll-margin-top:calc(var(--header-height) + .5rem)}html h1{line-height:125%}::-webkit-scrollbar{width:.5rem;height:.5rem}::-webkit-scrollbar-thumb{background-color:#87878d}::-webkit-scrollbar-thumb:hover{background-color:#a9a9b3}::selection{background-color:rgba(53,166,247,0.25)}[theme=dark] ::selection{background-color:rgba(50,112,194,0.4)}body{background-color:#fff;color:#161209;word-wrap:break-word;overflow-wrap:break-word;scrollbar-color:auto}body[theme=dark]{color:#a9a9b3;background-color:#292a2d}a,a::before,a::after{text-decoration:none;color:#161209}[theme=dark] a,[theme=dark] a::before,[theme=dark] a::after{color:#a9a9b3}a:active,a:hover{color:#2d96bd}[theme=dark] a:active,[theme=dark] a:hover{color:#fff}#mask{background-repeat:no-repeat;background-position:center;position:fixed;top:0;left:0;width:100%;height:100%;z-index:-1;background-color:rgba(0,0,0,0)}.blur #mask{z-index:100;background-color:rgba(0,0,0,0.25)}img.lazyload,img.lazyloading{-o-object-fit:scale-down;object-fit:scale-down;font-family:"object-fit: scale-down;"}img.lazyloaded{-o-object-fit:contain;object-fit:contain;font-family:"object-fit: contain;"}svg.icon{display:inline-block;width:1.25em;height:1em;text-align:center}svg.icon path{fill:currentColor}img.emoji{height:1em;width:1em;margin:0 .05em 0 .1em;vertical-align:-.1em}.details .details-summary:hover{cursor:pointer}.details i.details-icon{color:#a9a9b3;-webkit-transition:transform 0.2s ease;-moz-transition:transform 0.2s ease;-o-transition:transform 0.2s ease;transition:transform 0.2s ease}[theme=dark] .details i.details-icon{color:#5d5d5f}.details .details-content{max-height:0;overflow-y:hidden;-webkit-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;-moz-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;-o-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s}.details.open i.details-icon{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.details.open .details-content{max-height:10000px;-webkit-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;-moz-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;-o-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s}#fixed-buttons{display:none}.fixed-button{display:none;z-index:100;position:fixed;right:1.5rem;font-size:1rem;line-height:1.3rem;padding:.6rem .6rem;color:#a9a9b3;background:#f8f8f8;-webkit-border-radius:2rem;-moz-border-radius:2rem;border-radius:2rem;-webkit-transition:color 0.4s ease;-moz-transition:color 0.4s ease;-o-transition:color 0.4s ease;transition:color 0.4s ease}.blur .fixed-button{-webkit-filter:blur(1.5px);filter:blur(1.5px)}.fixed-button:hover,.fixed-button:active{color:#161209;cursor:pointer}.fixed-button:active,.fixed-button:focus,.fixed-button:hover{outline:none}[theme=dark] .fixed-button{color:#5d5d5f;background:#252627}[theme=dark] .fixed-button:hover,[theme=dark] .fixed-button:active{color:#a9a9b3}#back-to-top{display:block;bottom:1.5rem}#view-comments{bottom:4.5rem}.cc-window.cc-banner .cc-btn{color:#161209}.cc-window.cc-banner .cc-btn:hover,.cc-window.cc-banner .cc-btn:focus{background-color:#ccc}[theme=dark] .cc-window.cc-banner .cc-btn{color:#161209}[theme=dark] .cc-window.cc-banner .cc-btn:hover,[theme=dark] .cc-window.cc-banner .cc-btn:focus{background-color:#fff}.wrapper{display:flex;flex-direction:column;min-height:100vh;width:100%}.wrapper main{flex:1 0 auto}.wrapper main .container{padding:0 1rem}.page{position:relative;max-width:800px;width:60%;margin:0 auto}[data-header-desktop] .page{padding-top:var(--header-height)}[data-header-desktop=normal] .page{padding-top:0}.blur .page{-webkit-filter:blur(1.5px);filter:blur(1.5px)}.toc .toc-title{font-size:var(--toc-title-font-size);font-weight:bold;text-transform:uppercase}.toc .toc-content{font-size:var(--toc-content-font-size)}.toc .toc-content ul{text-indent:-0.85rem;padding-left:.8rem;list-style:none}.toc .toc-content ul a:first-child::before{content:"|";font-weight:bolder;margin-right:.5rem;color:#2d96bd}[theme=dark] .toc .toc-content ul a:first-child::before{color:#55bde2}.toc .toc-content ul ul{padding-left:1.5rem}.toc ruby{background:#f5f5f5}.toc ruby rt{color:#a9a9b3}[theme=dark] .toc ruby{background:#272C34}[theme=dark] .toc ruby rt{color:#5d5d5f}#toc-auto{display:block;position:absolute;width:10000px;max-width:0;padding:0 .8rem;border-left:4px solid #f0f0f0;word-wrap:break-word;overflow-wrap:break-word;box-sizing:border-box;top:10rem;left:0;visibility:hidden}[data-header-desktop=normal] #toc-auto{top:5rem}.blur #toc-auto{-webkit-filter:blur(1.5px);filter:blur(1.5px)}[theme=dark] #toc-auto{border-left-color:#363636}#toc-auto .toc-title{margin:.8rem 0}#toc-auto .toc-content.always-active ul{display:block}#toc-auto .toc-content>nav>ul{margin:.625rem 0}#toc-auto .toc-content ul ul{display:none}#toc-auto .toc-content ul .has-active>ul{display:block}#toc-auto .toc-content a.active{font-weight:bold;color:#2d96bd}[theme=dark] #toc-auto .toc-content a.active{color:#55bde2}#toc-auto .toc-content a.active::before{color:#ef3982}[theme=dark] #toc-auto .toc-content a.active::before{color:#bdebfc}#toc-static{display:none;margin:.8rem 0}#toc-static[data-kept=true]{display:block}#toc-static .toc-title{display:flex;justify-content:space-between;line-height:2em;padding:0 .75rem;background:#e6e6e6}[theme=dark] #toc-static .toc-title{background:#1a1d23}#toc-static .toc-content{background-color:#f5f5f5}#toc-static .toc-content>nav>ul{margin:0;padding:.4rem 1rem .4rem 1.8rem}[theme=dark] #toc-static .toc-content{background-color:#272C34}#toc-static.open .toc-title{background:#ededed}[theme=dark] #toc-static.open .toc-title{background:#20252b}.single .single-title{margin:2rem 0 .5rem;font-size:1.6rem;font-weight:bold;line-height:140%}.single .single-subtitle{margin:.5rem 0;font-size:1.2rem;font-weight:normal;line-height:100%}.single .post-meta{font-size:.875rem;color:#a9a9b3}.single .post-meta span{display:inline-block}[theme=dark] .single .post-meta{color:#5d5d5f}.single .post-meta a,.single .post-meta a::before,.single .post-meta a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .post-meta a,[theme=dark] .single .post-meta a::before,[theme=dark] .single .post-meta a::after{color:#a9a9b3}.single .post-meta a:active,.single .post-meta a:hover{color:#ef3982}[theme=dark] .single .post-meta a:active,[theme=dark] .single .post-meta a:hover{color:#fff}.single .post-meta .author{font-size:1.05rem}.single .featured-image{margin:.5rem 0 1rem 0}.single .featured-image img{display:block;max-width:100%;height:auto;margin:0 auto;overflow:hidden}.single .featured-image img.lazyloaded{width:100%}.single .content>h2{font-size:1.5rem}.single .content>h2 code{font-size:1.25rem}.single .content>h3{font-size:1.375rem}.single .content>h3 code{font-size:1.125rem}.single .content>h4{font-size:1.25rem}.single .content>h4 code{font-size:1rem}.single .content>h5{font-size:1.125rem}.single .content>h6{font-size:1rem}.single .content h2,.single .content h3,.single .content h4,.single .content h5,.single .content h6{font-weight:bold;margin:1.2rem 0}[theme=dark] .single .content h2,[theme=dark] .single .content h3,[theme=dark] .single .content h4,[theme=dark] .single .content h5,[theme=dark] .single .content h6{font-weight:bolder}.single .content>h2>.header-mark::before,.single .content>h3>.header-mark::before,.single .content>h4>.header-mark::before,.single .content>h5>.header-mark::before,.single .content>h6>.header-mark::before{content:"|";margin-right:.3125rem;color:#2d96bd}[theme=dark] .single .content>h2>.header-mark::before,[theme=dark] .single .content>h3>.header-mark::before,[theme=dark] .single .content>h4>.header-mark::before,[theme=dark] .single .content>h5>.header-mark::before,[theme=dark] .single .content>h6>.header-mark::before{color:#55bde2}.single .content>h2>.header-mark::before{content:"#"}.single .content p{margin:.5rem 0}.single .content b,.single .content strong{font-weight:bold}[theme=dark] .single .content b,[theme=dark] .single .content strong{color:#ddd}.single .content a,.single .content a::before,.single .content a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .content a,[theme=dark] .single .content a::before,[theme=dark] .single .content a::after{color:#55bde2}.single .content a:active,.single .content a:hover{color:#ef3982}[theme=dark] .single .content a:active,[theme=dark] .single .content a:hover{color:#bdebfc}.single .content a{word-wrap:break-word;overflow-wrap:break-word}[theme=dark] .single .content a b,[theme=dark] .single .content a strong{color:#55bde2}.single .content [theme=dark] a:hover b,.single .content [theme=dark] a:hover strong{color:#bdebfc}.single .content ul,.single .content ol{margin:.5rem 0;padding-left:2.5rem}.single .content ul{list-style-type:disc}.single .content ruby{background:#f5f5f5}.single .content ruby rt{color:#a9a9b3}[theme=dark] .single .content ruby{background:#272C34}[theme=dark] .single .content ruby rt{color:#5d5d5f}.single .content .table-wrapper{overflow-x:auto}.single .content .table-wrapper::-webkit-scrollbar{background-color:#fff}[theme=dark] .single .content .table-wrapper::-webkit-scrollbar{background-color:#272c34}.single .content .table-wrapper>table{width:100%;max-width:100%;margin:.625rem 0;border-spacing:0;background:#fff;border-collapse:collapse}[theme=dark] .single .content .table-wrapper>table{background:#272c34}.single .content .table-wrapper>table thead{background:#ededed}[theme=dark] .single .content .table-wrapper>table thead{background-color:#20252b}.single .content .table-wrapper>table th,.single .content .table-wrapper>table td{padding:.3rem 1rem;border:1px solid #e8e8e8}[theme=dark] .single .content .table-wrapper>table th,[theme=dark] .single .content .table-wrapper>table td{border-color:#1c2025}.single .content img{max-width:100%;min-height:1em}.single .content figure{margin:.5rem;text-align:center}.single .content figure .image-caption:not(:empty){min-width:20%;max-width:80%;display:inline-block;padding:.5rem;margin:0 auto;font-size:.875rem;color:#969696}.single .content figure img{display:block;width:100%;height:auto;margin:0 auto;overflow:hidden}.single .content blockquote{display:block;border-left:0.5rem solid #6bd6fd;background-color:rgba(107,214,253,0.2);padding:.25rem .75rem;margin:1rem 0}[theme=dark] .single .content blockquote{border-left-color:#59c5ec;background-color:rgba(89,197,236,0.2)}.single .content .footnotes{color:#a9a9b3}[theme=dark] .single .content .footnotes{color:#5d5d5f}.single .content .footnotes p{margin:.25rem 0}.single .content code{display:inline-block;max-width:100%;padding:0 .4rem;word-wrap:break-word;overflow-wrap:break-word;-webkit-line-break:anywhere;-ms-line-break:anywhere;line-break:anywhere;font-size:var(--code-font-size);font-family:var(--code-font-family);color:#E74C3C}[theme=dark] .single .content code{color:#E5BF78}.single .content pre{margin:0;padding:.25rem 0 .25rem .5rem;-moz-tab-size:4;-o-tab-size:4;tab-size:4}.single .content pre code{padding:0}.single .content pre img{min-height:1em;max-height:1.2em;vertical-align:text-bottom}.single .content code,.single .content pre,.single .content .highlight table,.single .content .highlight tr,.single .content .highlight td{background:#f5f5f5 !important}[theme=dark] .single .content code,[theme=dark] .single .content pre,[theme=dark] .single .content .highlight table,[theme=dark] .single .content .highlight tr,[theme=dark] .single .content .highlight td{background:#272C34 !important}.single .content .highlight{font-family:var(--code-font-family);font-size:var(--code-font-size);line-height:1.4em;margin:.5rem 0}.single .content .highlight .table-wrapper>table,.single .content .highlight .table-wrapper>table thead,.single .content .highlight .table-wrapper>table tr,.single .content .highlight .table-wrapper>table td{margin:0;padding:0;border:none !important}.single .content .highlight .table-wrapper>table span.c,.single .content .highlight .table-wrapper>table thead span.c,.single .content .highlight .table-wrapper>table tr span.c,.single .content .highlight .table-wrapper>table td span.c{white-space:nowrap}.single .content .highlight>.chroma{position:relative}.single .content .highlight>.chroma .code-header{display:flex;justify-content:space-between;align-items:center;box-sizing:border-box;width:100%;font-family:var(--global-font-family);font-weight:bold;color:#9c9c9c;background:#e1e1e1}[theme=dark] .single .content .highlight>.chroma .code-header{color:#b1b0b0;background:#1a1d23}.single .content .highlight>.chroma .code-header:hover{cursor:pointer}.single .content .highlight>.chroma .code-header .code-title{width:100%;padding:.4rem}.single .content .highlight>.chroma .code-header .code-title::after{padding-left:.2rem;content:"Code"}.single .content .highlight>.chroma .code-header.language-bash .code-title::after{content:"Bash"}.single .content .highlight>.chroma .code-header.language-c .code-title::after{content:"C"}.single .content .highlight>.chroma .code-header.language-cs .code-title::after{content:"C#"}.single .content .highlight>.chroma .code-header.language-cpp .code-title::after{content:"C++"}.single .content .highlight>.chroma .code-header.language-clojure .code-title::after{content:"Clojure"}.single .content .highlight>.chroma .code-header.language-coffeescript .code-title::after{content:"CoffeeScript"}.single .content .highlight>.chroma .code-header.language-css .code-title::after{content:"CSS"}.single .content .highlight>.chroma .code-header.language-dart .code-title::after{content:"Dart"}.single .content .highlight>.chroma .code-header.language-diff .code-title::after{content:"Diff"}.single .content .highlight>.chroma .code-header.language-erlang .code-title::after{content:"Erlang"}.single .content .highlight>.chroma .code-header.language-go .code-title::after{content:"Go"}.single .content .highlight>.chroma .code-header.language-go-html-template .code-title::after{content:"Go HTML Template"}.single .content .highlight>.chroma .code-header.language-groovy .code-title::after{content:"Groovy"}.single .content .highlight>.chroma .code-header.language-haskell .code-title::after{content:"Haskell"}.single .content .highlight>.chroma .code-header.language-html .code-title::after{content:"HTML"}.single .content .highlight>.chroma .code-header.language-http .code-title::after{content:"HTTP"}.single .content .highlight>.chroma .code-header.language-xml .code-title::after{content:"XML"}.single .content .highlight>.chroma .code-header.language-java .code-title::after{content:"Java"}.single .content .highlight>.chroma .code-header.language-js .code-title::after{content:"JavaScript"}.single .content .highlight>.chroma .code-header.language-javascript .code-title::after{content:"JavaScript"}.single .content .highlight>.chroma .code-header.language-json .code-title::after{content:"JSON"}.single .content .highlight>.chroma .code-header.language-kotlin .code-title::after{content:"Kotlin"}.single .content .highlight>.chroma .code-header.language-latex .code-title::after{content:"LaTeX"}.single .content .highlight>.chroma .code-header.language-less .code-title::after{content:"Less"}.single .content .highlight>.chroma .code-header.language-lisp .code-title::after{content:"Lisp"}.single .content .highlight>.chroma .code-header.language-lua .code-title::after{content:"Lua"}.single .content .highlight>.chroma .code-header.language-makefile .code-title::after{content:"Makefile"}.single .content .highlight>.chroma .code-header.language-markdown .code-title::after{content:"Markdown"}.single .content .highlight>.chroma .code-header.language-matlab .code-title::after{content:"Matlab"}.single .content .highlight>.chroma .code-header.language-objectivec .code-title::after{content:"Objective-C"}.single .content .highlight>.chroma .code-header.language-php .code-title::after{content:"PHP"}.single .content .highlight>.chroma .code-header.language-perl .code-title::after{content:"Perl"}.single .content .highlight>.chroma .code-header.language-powershell .code-title::after{content:"PowerShell"}.single .content .highlight>.chroma .code-header.language-posh .code-title::after{content:"PowerShell"}.single .content .highlight>.chroma .code-header.language-pwsh .code-title::after{content:"PowerShell"}.single .content .highlight>.chroma .code-header.language-python .code-title::after{content:"Python"}.single .content .highlight>.chroma .code-header.language-r .code-title::after{content:"R"}.single .content .highlight>.chroma .code-header.language-ruby .code-title::after{content:"Ruby"}.single .content .highlight>.chroma .code-header.language-rust .code-title::after{content:"Rust"}.single .content .highlight>.chroma .code-header.language-scala .code-title::after{content:"Scala"}.single .content .highlight>.chroma .code-header.language-scss .code-title::after{content:"Scss"}.single .content .highlight>.chroma .code-header.language-shell .code-title::after{content:"Shell"}.single .content .highlight>.chroma .code-header.language-sql .code-title::after{content:"SQL"}.single .content .highlight>.chroma .code-header.language-swift .code-title::after{content:"Swift"}.single .content .highlight>.chroma .code-header.language-tex .code-title::after{content:"TeX"}.single .content .highlight>.chroma .code-header.language-toml .code-title::after{content:"TOML"}.single .content .highlight>.chroma .code-header.language-ts .code-title::after{content:"TypeScript"}.single .content .highlight>.chroma .code-header.language-typescript .code-title::after{content:"TypeScript"}.single .content .highlight>.chroma .code-header.language-vue .code-title::after{content:"Vue"}.single .content .highlight>.chroma .code-header.language-yml .code-title::after{content:"YAML"}.single .content .highlight>.chroma .code-header.language-yaml .code-title::after{content:"YAML"}.single .content .highlight>.chroma .lntd:first-child{min-width:1.6rem;text-align:right}.single .content .highlight>.chroma .lntd:last-child{width:100%}.single .content .highlight>.chroma .lntd:last-child pre{min-width:-webkit-max-content;min-width:-moz-max-content;min-width:intrinsic;min-width:max-content}.single .content .highlight>.chroma .ln{padding-right:.75rem}.single .content .highlight>.chroma .hl{display:block;background-color:#dcdcdc}[theme=dark] .single .content .highlight>.chroma .hl{background-color:#1c2025}.single .content .highlight>.chroma .ln,.single .content .highlight>.chroma .lnt{color:#a9a9b3}[theme=dark] .single .content .highlight>.chroma .ln,[theme=dark] .single .content .highlight>.chroma .lnt{color:#5d5d5f}.single .content .highlight>.chroma .arrow{padding:0 .2rem;-webkit-transition:transform 0.2s ease;-moz-transition:transform 0.2s ease;-o-transition:transform 0.2s ease;transition:transform 0.2s ease}.single .content .highlight>.chroma .ellipses{padding:.4rem}.single .content .highlight>.chroma .copy{display:none;padding:.4rem}.single .content .highlight>.chroma .copy:hover{cursor:pointer;color:#2d96bd}[theme=dark] .single .content .highlight>.chroma .copy:hover{color:#fff}.single .content .highlight>.chroma .table-wrapper{max-height:0;overflow-y:hidden;-webkit-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;-moz-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;-o-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s}.single .content .highlight>.chroma.open .code-header{background:#ededed}[theme=dark] .single .content .highlight>.chroma.open .code-header{background:#20252b}.single .content .highlight>.chroma.open .table-wrapper{max-height:10000px;-webkit-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;-moz-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;-o-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s}.single .content .highlight>.chroma.open .arrow{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.single .content .highlight>.chroma.open .ellipses{display:none}.single .content .highlight>.chroma.open .copy{display:inline}.single .content .highlight .c,.single .content .highlight .ch,.single .content .highlight .cm,.single .content .highlight .c1,.single .content .highlight .cs,.single .content .highlight .cp,.single .content .highlight .cpf{font-style:italic}.single .content .highlight .gl{text-decoration:underline}.single .content .highlight .p{color:#a9a9b3}.single .content .highlight .k{color:#b501a9}.single .content .highlight .kc{color:#b501a9}.single .content .highlight .kd{color:#b501a9}.single .content .highlight .kn{color:#b501a9}.single .content .highlight .kp{color:#b501a9}.single .content .highlight .kr{color:#b501a9}.single .content .highlight .kt{color:#b501a9}.single .content .highlight .n{color:#333}.single .content .highlight .na{color:#2b77fa}.single .content .highlight .nb{color:#f74840}.single .content .highlight .bp{color:#f74840}.single .content .highlight .nc{color:#cb8100}.single .content .highlight .no{color:#2b77fa}.single .content .highlight .nd{color:#0086c1}.single .content .highlight .ni{color:#2b77fa}.single .content .highlight .ne{color:#2b77fa}.single .content .highlight .nf{color:#2b77fa}.single .content .highlight .fm{color:#1ccad6}.single .content .highlight .nl{color:#2b77fa}.single .content .highlight .nn{color:#2b77fa}.single .content .highlight .nx{color:#333}.single .content .highlight .py{color:#2b77fa}.single .content .highlight .nt{color:#2b77fa}.single .content .highlight .nv{color:#2b77fa}.single .content .highlight .vc{color:#2b77fa}.single .content .highlight .vg{color:#2b77fa}.single .content .highlight .vi{color:#2b77fa}.single .content .highlight .vm{color:#2b77fa}.single .content .highlight .l{color:#2aa198}.single .content .highlight .ld{color:#2aa198}.single .content .highlight .s{color:#24a443}.single .content .highlight .sa{color:#24a443}.single .content .highlight .sb{color:#24a443}.single .content .highlight .sc{color:#24a443}.single .content .highlight .dl{color:#24a443}.single .content .highlight .sd{color:#24a443}.single .content .highlight .s2{color:#24a443}.single .content .highlight .se{color:#24a443}.single .content .highlight .sh{color:#24a443}.single .content .highlight .si{color:#24a443}.single .content .highlight .sx{color:#24a443}.single .content .highlight .sr{color:#24a443}.single .content .highlight .s1{color:#24a443}.single .content .highlight .ss{color:#24a443}.single .content .highlight .m{color:#e2893c}.single .content .highlight .mb{color:#e2893c}.single .content .highlight .mf{color:#e2893c}.single .content .highlight .mh{color:#e2893c}.single .content .highlight .mi{color:#e2893c}.single .content .highlight .il{color:#e2893c}.single .content .highlight .mo{color:#e2893c}.single .content .highlight .o{color:#f19b04}.single .content .highlight .ow{color:#b501a9}.single .content .highlight .c{color:#a0a1a8}.single .content .highlight .ch{color:#a0a1a8}.single .content .highlight .cm{color:#a0a1a8}.single .content .highlight .c1{color:#a0a1a8}.single .content .highlight .cs{color:#a0a1a8}.single .content .highlight .cp{color:#a0a1a8}.single .content .highlight .cpf{color:#a0a1a8}.single .content .highlight .g{color:#e72d40}.single .content .highlight .gd{color:#e72d40}.single .content .highlight .ge{color:#e72d40}.single .content .highlight .gr{color:#e72d40}.single .content .highlight .gh{color:#e72d40}.single .content .highlight .gi{color:#e72d40}.single .content .highlight .go{color:#e72d40}.single .content .highlight .gp{color:#e72d40}.single .content .highlight .gs{color:#e72d40}.single .content .highlight .gu{color:#e72d40}.single .content .highlight .gt{color:#e72d40}.single .content .highlight .w{color:#bbb}[theme=dark] .single .content .highlight .p{color:#a9a9b3}[theme=dark] .single .content .highlight .k{color:#d371e3}[theme=dark] .single .content .highlight .kc{color:#d371e3}[theme=dark] .single .content .highlight .kd{color:#d371e3}[theme=dark] .single .content .highlight .kn{color:#d371e3}[theme=dark] .single .content .highlight .kp{color:#d371e3}[theme=dark] .single .content .highlight .kr{color:#d371e3}[theme=dark] .single .content .highlight .kt{color:#d371e3}[theme=dark] .single .content .highlight .n{color:#a9b2c0}[theme=dark] .single .content .highlight .na{color:#41b0f5}[theme=dark] .single .content .highlight .nb{color:#19b9c4}[theme=dark] .single .content .highlight .bp{color:#ecbf6f}[theme=dark] .single .content .highlight .nc{color:#ecbf6f}[theme=dark] .single .content .highlight .no{color:#41b0f5}[theme=dark] .single .content .highlight .nd{color:#ecbf6f}[theme=dark] .single .content .highlight .ni{color:#41b0f5}[theme=dark] .single .content .highlight .ne{color:#41b0f5}[theme=dark] .single .content .highlight .nf{color:#41b0f5}[theme=dark] .single .content .highlight .fm{color:#19b9c4}[theme=dark] .single .content .highlight .nl{color:#41b0f5}[theme=dark] .single .content .highlight .nn{color:#41b0f5}[theme=dark] .single .content .highlight .nx{color:#a9a9b3}[theme=dark] .single .content .highlight .py{color:#41b0f5}[theme=dark] .single .content .highlight .nt{color:#41b0f5}[theme=dark] .single .content .highlight .nv{color:#41b0f5}[theme=dark] .single .content .highlight .vc{color:#41b0f5}[theme=dark] .single .content .highlight .vg{color:#41b0f5}[theme=dark] .single .content .highlight .vi{color:#41b0f5}[theme=dark] .single .content .highlight .vm{color:#41b0f5}[theme=dark] .single .content .highlight .l{color:#2aa198}[theme=dark] .single .content .highlight .ld{color:#2aa198}[theme=dark] .single .content .highlight .s{color:#8cc570}[theme=dark] .single .content .highlight .sa{color:#8cc570}[theme=dark] .single .content .highlight .sb{color:#8cc570}[theme=dark] .single .content .highlight .sc{color:#8cc570}[theme=dark] .single .content .highlight .dl{color:#8cc570}[theme=dark] .single .content .highlight .sd{color:#8cc570}[theme=dark] .single .content .highlight .s2{color:#8cc570}[theme=dark] .single .content .highlight .se{color:#8cc570}[theme=dark] .single .content .highlight .sh{color:#8cc570}[theme=dark] .single .content .highlight .si{color:#8cc570}[theme=dark] .single .content .highlight .sx{color:#8cc570}[theme=dark] .single .content .highlight .sr{color:#8cc570}[theme=dark] .single .content .highlight .s1{color:#8cc570}[theme=dark] .single .content .highlight .ss{color:#8cc570}[theme=dark] .single .content .highlight .m{color:#db985c}[theme=dark] .single .content .highlight .mb{color:#db985c}[theme=dark] .single .content .highlight .mf{color:#db985c}[theme=dark] .single .content .highlight .mh{color:#db985c}[theme=dark] .single .content .highlight .mi{color:#db985c}[theme=dark] .single .content .highlight .il{color:#db985c}[theme=dark] .single .content .highlight .mo{color:#db985c}[theme=dark] .single .content .highlight .o{color:#ecbf6f}[theme=dark] .single .content .highlight .ow{color:#d371e3}[theme=dark] .single .content .highlight .c{color:#7e848f}[theme=dark] .single .content .highlight .ch{color:#7e848f}[theme=dark] .single .content .highlight .cm{color:#7e848f}[theme=dark] .single .content .highlight .c1{color:#7e848f}[theme=dark] .single .content .highlight .cs{color:#7e848f}[theme=dark] .single .content .highlight .cp{color:#7e848f}[theme=dark] .single .content .highlight .cpf{color:#7e848f}[theme=dark] .single .content .highlight .g{color:#f16372}[theme=dark] .single .content .highlight .gd{color:#f16372}[theme=dark] .single .content .highlight .ge{color:#f16372}[theme=dark] .single .content .highlight .gr{color:#f16372}[theme=dark] .single .content .highlight .gh{color:#f16372}[theme=dark] .single .content .highlight .gi{color:#f16372}[theme=dark] .single .content .highlight .go{color:#f16372}[theme=dark] .single .content .highlight .gp{color:#f16372}[theme=dark] .single .content .highlight .gs{color:#f16372}[theme=dark] .single .content .highlight .gu{color:#f16372}[theme=dark] .single .content .highlight .gt{color:#f16372}[theme=dark] .single .content .highlight .w{color:#bbb}.single .content .gist{font-family:var(--code-font-family);font-size:var(--code-font-size)}.single .content .gist .table-wrapper>table,.single .content .gist .table-wrapper>table thead,.single .content .gist .table-wrapper>table tr,.single .content .gist .table-wrapper>table td{margin:0;padding:0;border:none !important}.single .content .gist .gist-file,.single .content .gist .gist-data,.single .content .gist .gist-meta{border:none}.single .content .gist .gist-meta{padding:.4rem .8rem;background-color:#e8e8e8}.single .content .gist .gist-meta a,.single .content .gist .gist-meta a::before,.single .content .gist .gist-meta a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .content .gist .gist-meta a,[theme=dark] .single .content .gist .gist-meta a::before,[theme=dark] .single .content .gist .gist-meta a::after{color:#55bde2}.single .content .gist .gist-meta a:active,.single .content .gist .gist-meta a:hover{color:#ef3982}[theme=dark] .single .content .gist .gist-meta a:active,[theme=dark] .single .content .gist .gist-meta a:hover{color:#bdebfc}[theme=dark] .single .content .gist .gist-meta{background-color:#1c2025}[theme=dark] .single .content .gist .highlight{background:#141414}[theme=dark] .single .content .gist .blob-num,[theme=dark] .single .content .gist .blob-code-inner,[theme=dark] .single .content .gist .highlight,[theme=dark] .single .content .gist .pl-enm,[theme=dark] .single .content .gist .pl-ko,[theme=dark] .single .content .gist .pl-mo,[theme=dark] .single .content .gist .pl-mp1 .pl-sf,[theme=dark] .single .content .gist .pl-ms,[theme=dark] .single .content .gist .pl-pdc1,[theme=dark] .single .content .gist .pl-scp,[theme=dark] .single .content .gist .pl-smc,[theme=dark] .single .content .gist .pl-som,[theme=dark] .single .content .gist .pl-va,[theme=dark] .single .content .gist .pl-vpf,[theme=dark] .single .content .gist .pl-vpu,[theme=dark] .single .content .gist .pl-mdr{color:#aab1bf}[theme=dark] .single .content .gist .pl-mb,[theme=dark] .single .content .gist .pl-pdb{font-weight:700}[theme=dark] .single .content .gist .pl-c,[theme=dark] .single .content .gist .pl-c span,[theme=dark] .single .content .gist .pl-pdc{color:#5b6270;font-style:italic}[theme=dark] .single .content .gist .pl-sr .pl-cce{color:#56b5c2;font-weight:400}[theme=dark] .single .content .gist .pl-ef,[theme=dark] .single .content .gist .pl-en,[theme=dark] .single .content .gist .pl-enf,[theme=dark] .single .content .gist .pl-eoai,[theme=dark] .single .content .gist .pl-kos,[theme=dark] .single .content .gist .pl-mh .pl-pdh,[theme=dark] .single .content .gist .pl-mr{color:#61afef}[theme=dark] .single .content .gist .pl-ens,[theme=dark] .single .content .gist .pl-vi{color:#be5046}[theme=dark] .single .content .gist .pl-enti,[theme=dark] .single .content .gist .pl-mai .pl-sf,[theme=dark] .single .content .gist .pl-ml,[theme=dark] .single .content .gist .pl-sf,[theme=dark] .single .content .gist .pl-sr,[theme=dark] .single .content .gist .pl-sr .pl-sra,[theme=dark] .single .content .gist .pl-src,[theme=dark] .single .content .gist .pl-st,[theme=dark] .single .content .gist .pl-vo{color:#56b5c2}[theme=dark] .single .content .gist .pl-eoi,[theme=dark] .single .content .gist .pl-mri,[theme=dark] .single .content .gist .pl-pds,[theme=dark] .single .content .gist .pl-pse .pl-s1,[theme=dark] .single .content .gist .pl-s,[theme=dark] .single .content .gist .pl-s1{color:#97c279}[theme=dark] .single .content .gist .pl-k,[theme=dark] .single .content .gist .pl-kolp,[theme=dark] .single .content .gist .pl-mc,[theme=dark] .single .content .gist .pl-pde{color:#c578dd}[theme=dark] .single .content .gist .pl-mi,[theme=dark] .single .content .gist .pl-pdi{color:#c578dd;font-style:italic}[theme=dark] .single .content .gist .pl-mp,[theme=dark] .single .content .gist .pl-stp{color:#818896}[theme=dark] .single .content .gist .pl-mdh,[theme=dark] .single .content .gist .pl-mdi,[theme=dark] .single .content .gist .pl-mdr{font-weight:400}[theme=dark] .single .content .gist .pl-mdht,[theme=dark] .single .content .gist .pl-mi1{color:#97c279;background:#020}[theme=dark] .single .content .gist .pl-md,[theme=dark] .single .content .gist .pl-mdhf{color:#df6b75;background:#200}[theme=dark] .single .content .gist .pl-corl{color:#df6b75;text-decoration:underline}[theme=dark] .single .content .gist .pl-ib{background:#df6b75}[theme=dark] .single .content .gist .pl-ii{background:#e0c184;color:#fff}[theme=dark] .single .content .gist .pl-iu{background:#e05151}[theme=dark] .single .content .gist .pl-ms1{color:#aab1bf;background:#373b41}[theme=dark] .single .content .gist .pl-c1,[theme=dark] .single .content .gist .pl-cn,[theme=dark] .single .content .gist .pl-e,[theme=dark] .single .content .gist .pl-eoa,[theme=dark] .single .content .gist .pl-eoac,[theme=dark] .single .content .gist .pl-eoac .pl-pde,[theme=dark] .single .content .gist .pl-kou,[theme=dark] .single .content .gist .pl-mm,[theme=dark] .single .content .gist .pl-mp .pl-s3,[theme=dark] .single .content .gist .pl-mq,[theme=dark] .single .content .gist .pl-s3,[theme=dark] .single .content .gist .pl-sok,[theme=dark] .single .content .gist .pl-sv,[theme=dark] .single .content .gist .pl-mb{color:#d19965}[theme=dark] .single .content .gist .pl-enc,[theme=dark] .single .content .gist .pl-entc,[theme=dark] .single .content .gist .pl-pse .pl-s2,[theme=dark] .single .content .gist .pl-s2,[theme=dark] .single .content .gist .pl-sc,[theme=dark] .single .content .gist .pl-smp,[theme=dark] .single .content .gist .pl-sr .pl-sre,[theme=dark] .single .content .gist .pl-stj,[theme=dark] .single .content .gist .pl-v,[theme=dark] .single .content .gist .pl-pdb{color:#e4bf7a}[theme=dark] .single .content .gist .pl-ent,[theme=dark] .single .content .gist .pl-entl,[theme=dark] .single .content .gist .pl-entm,[theme=dark] .single .content .gist .pl-mh,[theme=dark] .single .content .gist .pl-pdv,[theme=dark] .single .content .gist .pl-smi,[theme=dark] .single .content .gist .pl-sol,[theme=dark] .single .content .gist .pl-mdh,[theme=dark] .single .content .gist .pl-mdi{color:#df6b75}[theme=dark] .single .content iframe.instagram-media{border:none !important}.single .content .admonition{position:relative;margin:1rem 0;padding:0 .75rem;border-left:.25rem solid;overflow:auto;background-color:rgba(68,138,255,0.1);border-left-color:#448aff}.single .content .admonition .admonition-title{font-weight:bold;margin:0 -0.75rem;padding:.25rem 1.8rem}.single .content .admonition .admonition-content{padding:.5rem 0}.single .content .admonition i.icon{font-size:0.85rem;position:absolute;top:.6rem;left:.4rem}.single .content .admonition i.details-icon{position:absolute;top:.6rem;right:.3rem}.single .content .admonition .admonition-title{border-bottom-color:rgba(68,138,255,0.1);background-color:rgba(68,138,255,0.25)}.single .content .admonition.open .admonition-title{background-color:rgba(68,138,255,0.1)}.single .content .admonition i.icon{color:#448aff}.single .content .admonition.abstract{background-color:rgba(0,176,255,0.1);border-left-color:#00b0ff}.single .content .admonition.abstract .admonition-title{border-bottom-color:rgba(0,176,255,0.1);background-color:rgba(0,176,255,0.25)}.single .content .admonition.abstract.open .admonition-title{background-color:rgba(0,176,255,0.1)}.single .content .admonition.abstract i.icon{color:#00b0ff}.single .content .admonition.info{background-color:rgba(83,211,230,0.1);border-left-color:#00b8d4}.single .content .admonition.info .admonition-title{border-bottom-color:rgba(83,211,230,0.1);background-color:rgba(83,211,230,0.25)}.single .content .admonition.info.open .admonition-title{background-color:rgba(83,211,230,0.1)}.single .content .admonition.info i.icon{color:#00b8d4}.single .content .admonition.tip{background-color:rgba(0,191,165,0.1);border-left-color:#00bfa5}.single .content .admonition.tip .admonition-title{border-bottom-color:rgba(0,191,165,0.1);background-color:rgba(0,191,165,0.25)}.single .content .admonition.tip.open .admonition-title{background-color:rgba(0,191,165,0.1)}.single .content .admonition.tip i.icon{color:#00bfa5}.single .content .admonition.success{background-color:rgba(0,200,83,0.1);border-left-color:#00c853}.single .content .admonition.success .admonition-title{border-bottom-color:rgba(0,200,83,0.1);background-color:rgba(0,200,83,0.25)}.single .content .admonition.success.open .admonition-title{background-color:rgba(0,200,83,0.1)}.single .content .admonition.success i.icon{color:#00c853}.single .content .admonition.question{background-color:rgba(100,221,23,0.1);border-left-color:#64dd17}.single .content .admonition.question .admonition-title{border-bottom-color:rgba(100,221,23,0.1);background-color:rgba(100,221,23,0.25)}.single .content .admonition.question.open .admonition-title{background-color:rgba(100,221,23,0.1)}.single .content .admonition.question i.icon{color:#64dd17}.single .content .admonition.warning{background-color:rgba(255,145,0,0.1);border-left-color:#ff9100}.single .content .admonition.warning .admonition-title{border-bottom-color:rgba(255,145,0,0.1);background-color:rgba(255,145,0,0.25)}.single .content .admonition.warning.open .admonition-title{background-color:rgba(255,145,0,0.1)}.single .content .admonition.warning i.icon{color:#ff9100}.single .content .admonition.failure{background-color:rgba(255,82,82,0.1);border-left-color:#ff5252}.single .content .admonition.failure .admonition-title{border-bottom-color:rgba(255,82,82,0.1);background-color:rgba(255,82,82,0.25)}.single .content .admonition.failure.open .admonition-title{background-color:rgba(255,82,82,0.1)}.single .content .admonition.failure i.icon{color:#ff5252}.single .content .admonition.danger{background-color:rgba(68,138,255,0.1);border-left-color:#ff1744}.single .content .admonition.danger .admonition-title{border-bottom-color:rgba(68,138,255,0.1);background-color:rgba(68,138,255,0.25)}.single .content .admonition.danger.open .admonition-title{background-color:rgba(68,138,255,0.1)}.single .content .admonition.danger i.icon{color:#ff1744}.single .content .admonition.bug{background-color:rgba(255,23,68,0.1);border-left-color:#f50057}.single .content .admonition.bug .admonition-title{border-bottom-color:rgba(255,23,68,0.1);background-color:rgba(255,23,68,0.25)}.single .content .admonition.bug.open .admonition-title{background-color:rgba(255,23,68,0.1)}.single .content .admonition.bug i.icon{color:#f50057}.single .content .admonition.example{background-color:rgba(101,31,255,0.1);border-left-color:#651fff}.single .content .admonition.example .admonition-title{border-bottom-color:rgba(101,31,255,0.1);background-color:rgba(101,31,255,0.25)}.single .content .admonition.example.open .admonition-title{background-color:rgba(101,31,255,0.1)}.single .content .admonition.example i.icon{color:#651fff}.single .content .admonition.quote{background-color:rgba(159,159,159,0.1);border-left-color:#9e9e9e}.single .content .admonition.quote .admonition-title{border-bottom-color:rgba(159,159,159,0.1);background-color:rgba(159,159,159,0.25)}.single .content .admonition.quote.open .admonition-title{background-color:rgba(159,159,159,0.1)}.single .content .admonition.quote i.icon{color:#9e9e9e}.single .content .admonition:last-child{margin-bottom:.75rem}.single .content .echarts{margin:.5rem 0;text-align:center}.single .content .mapbox{margin:.5rem 0;padding:.5rem 0}.single .content meting-js{margin:.5rem 0}.single .content .bilibili{position:relative;width:100%;height:0;padding-bottom:75%;margin:3% auto;text-align:center}.single .content .bilibili iframe{position:absolute;width:100%;height:100%;left:0;top:0}.single .content hr{margin:1rem 0;position:relative;border-top:1px dashed #f0f0f0;border-bottom:none}[theme=dark] .single .content hr{border-top:1px dashed #363636}.single .content kbd{display:inline-block;padding:.25rem;background-color:#fff;border:1px solid #f0f0f0;border-bottom-color:#f0f0f0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 #f0f0f0;box-shadow:inset 0 -1px 0 #f0f0f0;font-size:.8rem;font-family:var(--code-font-family);color:#E74C3C}[theme=dark] .single .content kbd{background-color:#292a2d;border:1px solid #363636;border-bottom-color:#363636;-webkit-box-shadow:inset 0 -1px 0 #363636;box-shadow:inset 0 -1px 0 #363636;color:#E5BF78}.single .content .version{height:1.25em;vertical-align:text-bottom}.single .content .person-mention.h-card{display:inline-block}.single .content .person-mention.h-card img{vertical-align:-12%;max-height:1.1em;margin-right:0ex;border-radius:50%}.single .post-footer{margin-top:3rem}.single .post-footer .post-info{border-bottom:1px solid #f0f0f0;padding:1rem 0 0.3rem}[theme=dark] .single .post-footer .post-info{border-bottom:1px solid #363636}.single .post-footer .post-info .post-info-line{display:flex;justify-content:space-between}.single .post-footer .post-info .post-info-line .post-info-mod{font-size:0.8em;color:#a9a9b3}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod{color:#5d5d5f}.single .post-footer .post-info .post-info-line .post-info-mod a,.single .post-footer .post-info .post-info-line .post-info-mod a::before,.single .post-footer .post-info .post-info-line .post-info-mod a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod a,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod a::before,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod a::after{color:#55bde2}.single .post-footer .post-info .post-info-line .post-info-mod a:active,.single .post-footer .post-info .post-info-line .post-info-mod a:hover{color:#ef3982}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod a:active,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod a:hover{color:#bdebfc}.single .post-footer .post-info .post-info-line .post-info-license{font-size:0.8em;color:#a9a9b3}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license{color:#5d5d5f}.single .post-footer .post-info .post-info-line .post-info-license a,.single .post-footer .post-info .post-info-line .post-info-license a::before,.single .post-footer .post-info .post-info-line .post-info-license a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license a,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license a::before,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license a::after{color:#55bde2}.single .post-footer .post-info .post-info-line .post-info-license a:active,.single .post-footer .post-info .post-info-line .post-info-license a:hover{color:#ef3982}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license a:active,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license a:hover{color:#bdebfc}.single .post-footer .post-info .post-info-line .post-info-md{font-size:0.8rem;width:8rem}.single .post-footer .post-info .post-info-line .post-info-md a,.single .post-footer .post-info .post-info-line .post-info-md a::before,.single .post-footer .post-info .post-info-line .post-info-md a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-md a,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-md a::before,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-md a::after{color:#55bde2}.single .post-footer .post-info .post-info-line .post-info-md a:active,.single .post-footer .post-info .post-info-line .post-info-md a:hover{color:#ef3982}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-md a:active,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-md a:hover{color:#bdebfc}.single .post-footer .post-info .post-info-line .post-info-share a *{vertical-align:text-bottom}.single .post-footer .post-info-more{padding:0.3rem 0 1rem;display:flex;justify-content:space-between;font-size:0.9rem}.single .post-footer .post-tags{max-width:65%}.single .post-footer .post-tags *{display:inline}.single .post-footer .post-nav::before,.single .post-footer .post-nav::after{content:" ";display:table}.single .post-footer .post-nav a.prev,.single .post-footer .post-nav a.next{font-size:1rem;font-weight:600;-webkit-transition:all 0.3s ease-out;-moz-transition:all 0.3s ease-out;-o-transition:all 0.3s ease-out;transition:all 0.3s ease-out}.single .post-footer .post-nav a.prev{float:left}.single .post-footer .post-nav a.prev:hover{-webkit-transform:translateX(-4px);-ms-transform:translateX(-4px);-o-transform:translateX(-4px);transform:translateX(-4px)}.single .post-footer .post-nav a.next{float:right}.single .post-footer .post-nav a.next:hover{-webkit-transform:translateX(4px);-ms-transform:translateX(4px);-o-transform:translateX(4px);transform:translateX(4px)}.single #comments{padding:8rem 0 2rem}.single #comments .vemoji{max-width:1.5em;max-height:1.5em}.typeit{--ti-cursor-font-family: var(--global-font-family);--ti-cursor-font-size: var(--global-font-size);--ti-cursor-font-weight: var(--global-font-weight);--ti-cursor-line-height: var(--global-line-height);--ti-cursor-color: $global-font-secondary-color;--ti-cursor-margin-left: 0}.typeit .highlight{padding:.375rem;font-size:.875rem;font-family:var(--code-font-family);font-weight:bold;word-break:break-all;white-space:pre-wrap}[theme=dark] .typeit{--ti-cursor-color: $global-font-secondary-color-dark}.lg-toolbar .lg-icon::after{color:#999}.special .single-title,.special .single-subtitle{text-align:right}.archive .single-title{text-align:right}.archive .group-title{margin-top:1.5rem;margin-bottom:1rem}.archive .categories-card{margin:0 auto;margin-top:3rem;display:flex;align-items:center;justify-content:space-between;flex-direction:row;flex-wrap:wrap;line-height:1.6rem}.archive .categories-card .card-item{font-size:.875rem;text-align:left;width:45%;display:flex;align-items:flex-start;margin-top:2rem;min-height:10rem;padding:0 2%;position:relative}.archive .categories-card .card-item .card-item-wrapper{width:100%;overflow:hidden}.archive .categories-card .card-item .card-item-wrapper .card-item-title{font-size:1.2rem;font-weight:bold;display:inline-block;margin-top:1rem;margin-bottom:.75rem}.archive .categories-card .card-item .card-item-wrapper span{float:right;padding-right:1rem}.archive .archive-item{display:flex;justify-content:space-between;align-items:center;box-sizing:border-box;margin:.25rem 0 .25rem 1.5rem}.archive .archive-item-link{min-width:10%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.archive .archive-item-link:hover{color:#2d96bd;background-color:transparent}[theme=dark] .archive .archive-item-link{color:#a9a9b3}[theme=dark] .archive .archive-item-link:hover{color:#fff}.archive .archive-item-date{width:5em;text-align:right;color:#a9a9b3}[theme=dark] .archive .archive-item-date{color:#5d5d5f}.archive .more-post{text-align:right}.archive .tag-cloud-tags{margin:10px 0}.archive .tag-cloud-tags a,.archive .tag-cloud-tags a::before,.archive .tag-cloud-tags a::after{text-decoration:none;color:#161209}[theme=dark] .archive .tag-cloud-tags a,[theme=dark] .archive .tag-cloud-tags a::before,[theme=dark] .archive .tag-cloud-tags a::after{color:#a9a9b3}.archive .tag-cloud-tags a:active,.archive .tag-cloud-tags a:hover{color:#2d96bd}[theme=dark] .archive .tag-cloud-tags a:active,[theme=dark] .archive .tag-cloud-tags a:hover{color:#fff}.archive .tag-cloud-tags a{display:inline-block;position:relative;margin:5px 10px;word-wrap:break-word;overflow-wrap:break-word;-webkit-transition:all ease-out 0.3s;-moz-transition:all ease-out 0.3s;-o-transition:all ease-out 0.3s;transition:all ease-out 0.3s}.archive .tag-cloud-tags a:active,.archive .tag-cloud-tags a:focus,.archive .tag-cloud-tags a:hover{-webkit-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}.archive .tag-cloud-tags a sup{color:#a9a9b3}[theme=dark] .archive .tag-cloud-tags a sup{color:#5d5d5f}.home .home-profile{-webkit-transform:translateY(16vh);-ms-transform:translateY(16vh);-o-transform:translateY(16vh);transform:translateY(16vh);padding:0 0 .5rem;text-align:center}.home .home-profile .home-avatar{padding:.5rem}.home .home-profile .home-avatar img{display:inline-block;width:8rem;height:auto;margin:0 auto;-webkit-border-radius:100%;-moz-border-radius:100%;border-radius:100%;-webkit-box-shadow:0 0 0 0.3618em rgba(0,0,0,0.05);box-shadow:0 0 0 0.3618em rgba(0,0,0,0.05);-webkit-transition:all 0.4s ease;-moz-transition:all 0.4s ease;-o-transition:all 0.4s ease;transition:all 0.4s ease}.home .home-profile .home-avatar img:hover{position:relative;-webkit-transform:translateY(-0.75rem);-ms-transform:translateY(-0.75rem);-o-transform:translateY(-0.75rem);transform:translateY(-0.75rem)}.home .home-profile .home-title{font-size:1.25rem;font-weight:bold;margin:0;padding:.5rem}.home .home-profile .home-subtitle{font-size:1rem;font-weight:normal;margin:0;padding:.5rem}.home .home-profile .links{padding:.5rem;font-size:1.5rem}.home .home-profile .links a *{vertical-align:text-bottom}.home .home-profile .links img{height:1.5rem;padding:0 .25rem}.home .home-profile .home-disclaimer{font-size:1rem;line-height:1.5rem;font-weight:normal;margin:0;padding:.5rem;color:#a9a9b3}[theme=dark] .home .home-profile .home-disclaimer{color:#5d5d5f}.home[data-home=posts] .home-profile{-webkit-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0);padding-top:2rem}.home[data-home=posts] .home-avatar img{width:6rem}.home[data-home=posts] .summary{padding-top:1rem;padding-bottom:.8rem;color:#161209;border-bottom:1px dashed #f0f0f0}[theme=dark] .home[data-home=posts] .summary{color:#a9a9b3;border-bottom:1px dashed #363636}.home[data-home=posts] .summary .featured-image-preview{width:100%;padding:30% 0 0;position:relative;margin:0.6rem auto;-webkit-transition:transform 0.4s ease;-moz-transition:transform 0.4s ease;-o-transition:transform 0.4s ease;transition:transform 0.4s ease}.home[data-home=posts] .summary .featured-image-preview img{position:absolute;width:100%;height:100%;left:0;top:0}.home[data-home=posts] .summary .featured-image-preview img.lazyloaded{-o-object-fit:cover;object-fit:cover;font-family:"object-fit: cover;"}.home[data-home=posts] .summary .featured-image-preview:hover{-webkit-transform:scale(1.01);-ms-transform:scale(1.01);-o-transform:scale(1.01);transform:scale(1.01)}.home[data-home=posts] .summary .single-title{font-size:1.25rem;line-height:140%;margin:0.4rem 0}.home[data-home=posts] .summary .content{display:-moz-box;display:-webkit-box;display:box;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-line-clamp:3;margin-top:.3rem;width:100%;overflow:hidden;text-overflow:ellipsis;word-wrap:break-word;overflow-wrap:break-word;color:#a9a9b3}[theme=dark] .home[data-home=posts] .summary .content{color:#5d5d5f}.home[data-home=posts] .summary .content h2,.home[data-home=posts] .summary .content h3,.home[data-home=posts] .summary .content h4,.home[data-home=posts] .summary .content h5,.home[data-home=posts] .summary .content h6,.home[data-home=posts] .summary .content p{font-size:1rem;line-height:1.5;display:inline}.home[data-home=posts] .summary .content h2::after,.home[data-home=posts] .summary .content h3::after,.home[data-home=posts] .summary .content h4::after,.home[data-home=posts] .summary .content h5::after,.home[data-home=posts] .summary .content h6::after,.home[data-home=posts] .summary .content p::after{content:"\A";white-space:pre}.home[data-home=posts] .summary .content h2{font-size:1.125rem}.home[data-home=posts] .summary .content a,.home[data-home=posts] .summary .content a::before,.home[data-home=posts] .summary .content a::after{text-decoration:none;color:#2d96bd}[theme=dark] .home[data-home=posts] .summary .content a,[theme=dark] .home[data-home=posts] .summary .content a::before,[theme=dark] .home[data-home=posts] .summary .content a::after{color:#a9a9b3}.home[data-home=posts] .summary .content a:active,.home[data-home=posts] .summary .content a:hover{color:#ef3982}[theme=dark] .home[data-home=posts] .summary .content a:active,[theme=dark] .home[data-home=posts] .summary .content a:hover{color:#fff}.home[data-home=posts] .summary .content b,.home[data-home=posts] .summary .content strong{color:#a9a9b3}[theme=dark] .home[data-home=posts] .summary .content b,[theme=dark] .home[data-home=posts] .summary .content strong{color:#5d5d5f}.home[data-home=posts] .summary .post-footer{margin-top:.4rem;display:flex;justify-content:space-between;align-items:center;font-size:.875rem}.home[data-home=posts] .summary .post-footer a,.home[data-home=posts] .summary .post-footer a::before,.home[data-home=posts] .summary .post-footer a::after{text-decoration:none;color:#2d96bd}[theme=dark] .home[data-home=posts] .summary .post-footer a,[theme=dark] .home[data-home=posts] .summary .post-footer a::before,[theme=dark] .home[data-home=posts] .summary .post-footer a::after{color:#55bde2}.home[data-home=posts] .summary .post-footer a:active,.home[data-home=posts] .summary .post-footer a:hover{color:#ef3982}[theme=dark] .home[data-home=posts] .summary .post-footer a:active,[theme=dark] .home[data-home=posts] .summary .post-footer a:hover{color:#bdebfc}.home[data-home=posts] .summary .post-footer .post-tags{padding:0}.home[data-home=posts] .summary .post-footer .post-tags a,.home[data-home=posts] .summary .post-footer .post-tags a::before,.home[data-home=posts] .summary .post-footer .post-tags a::after{text-decoration:none;color:#161209}[theme=dark] .home[data-home=posts] .summary .post-footer .post-tags a,[theme=dark] .home[data-home=posts] .summary .post-footer .post-tags a::before,[theme=dark] .home[data-home=posts] .summary .post-footer .post-tags a::after{color:#a9a9b3}.home[data-home=posts] .summary .post-footer .post-tags a:active,.home[data-home=posts] .summary .post-footer .post-tags a:hover{color:#2d96bd}[theme=dark] .home[data-home=posts] .summary .post-footer .post-tags a:active,[theme=dark] .home[data-home=posts] .summary .post-footer .post-tags a:hover{color:#fff}#content-404{font-size:1.8rem;line-height:3rem;-webkit-transform:translateY(30vh);-ms-transform:translateY(30vh);-o-transform:translateY(30vh);transform:translateY(30vh);text-align:center}header{width:100%;z-index:150;background-color:#f8f8f8;-webkit-transition:box-shadow 0.3s ease;-moz-transition:box-shadow 0.3s ease;-o-transition:box-shadow 0.3s ease;transition:box-shadow 0.3s ease}[theme=dark] header{background-color:#252627}header .logo{min-height:1.5em;height:1.5em;vertical-align:text-bottom}header .logo,header .header-title-pre{padding-right:.25rem}header .header-title-post{padding-left:.25rem}header:hover{-webkit-box-shadow:0 0 1.5rem 0 rgba(0,0,0,0.1);box-shadow:0 0 1.5rem 0 rgba(0,0,0,0.1)}.header-wrapper{display:flex;justify-content:space-between;align-items:center;box-sizing:border-box;width:100%}.header-title{font-family:var(--header-title-font-family);font-weight:bold;margin-right:.5rem;min-width:10%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-webkit-flex:10;flex:10}.menu .menu-item{position:relative}.language-select{position:absolute;opacity:0;left:0;top:0;width:100%;height:100%}.language-select:hover{cursor:pointer}.search{position:relative}.search input{color:transparent;box-sizing:border-box;height:2.5rem;width:2.5rem;-webkit-border-radius:.5rem;-moz-border-radius:.5rem;border-radius:.5rem;border:none;outline:none;background-color:#f8f8f8;vertical-align:baseline !important;-webkit-transition:width 0.3s ease;-moz-transition:width 0.3s ease;-o-transition:width 0.3s ease;transition:width 0.3s ease}[theme=dark] .search input{background-color:#252627}.search input::-webkit-input-placeholder{color:rgba(0,0,0,0)}.search input:-moz-placeholder{color:rgba(0,0,0,0)}.search input::-moz-placeholder{color:rgba(0,0,0,0)}.search input:-ms-input-placeholder{color:rgba(0,0,0,0)}.search input::placeholder{color:rgba(0,0,0,0)}.search .search-button{margin:0;position:absolute;left:auto;right:1rem}.search .search-toggle{left:.5rem;right:auto}.search .search-loading{display:none}.search .search-clear{display:none}.open .search input,.search.mobile input{color:#161209;background-color:#e9e9e9;padding:0 2rem 0 2rem}[theme=dark] .open .search input,[theme=dark] .search.mobile input{color:#a9a9b3;background-color:#363636}[theme=dark] .open .search input::-webkit-input-placeholder,[theme=dark] .search.mobile input::-webkit-input-placeholder{color:#5d5d5f}[theme=dark] .open .search input:-moz-placeholder,[theme=dark] .search.mobile input:-moz-placeholder{color:#5d5d5f}[theme=dark] .open .search input::-moz-placeholder,[theme=dark] .search.mobile input::-moz-placeholder{color:#5d5d5f}[theme=dark] .open .search input:-ms-input-placeholder,[theme=dark] .search.mobile input:-ms-input-placeholder{color:#5d5d5f}[theme=dark] .open .search input::placeholder,[theme=dark] .search.mobile input::placeholder{color:#5d5d5f}.open .search input::-webkit-input-placeholder,.search.mobile input::-webkit-input-placeholder{color:#a9a9b3}.open .search input:-moz-placeholder,.search.mobile input:-moz-placeholder{color:#a9a9b3}.open .search input::-moz-placeholder,.search.mobile input::-moz-placeholder{color:#a9a9b3}.open .search input:-ms-input-placeholder,.search.mobile input:-ms-input-placeholder{color:#a9a9b3}.open .search input::placeholder,.search.mobile input::placeholder{color:#a9a9b3}.open .search .search-button,.search.mobile .search-button{color:#a9a9b3}[theme=dark] .open .search .search-button,[theme=dark] .search.mobile .search-button{color:#5d5d5f}.open .search .search-clear:hover,.search.mobile .search-clear:hover{color:#ff6b6b}.open .search .search-toggle:hover,.search.mobile .search-toggle:hover{cursor:default}.theme-switch i{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);-o-transform:rotate(225deg);transform:rotate(225deg)}#header-desktop{display:block;position:fixed;height:var(--header-height);line-height:var(--header-height)}[data-header-desktop=normal] #header-desktop{position:static}#header-desktop .header-wrapper{padding:0 2rem 0 10vh}#header-desktop .header-wrapper .header-title{font-size:var(--header-title-font-size)}#header-desktop .header-wrapper .menu{overflow:hidden;white-space:nowrap}#header-desktop .header-wrapper .menu .menu-inner{float:right}#header-desktop .header-wrapper .menu .menu-item{margin:0 .5rem}#header-desktop .header-wrapper .menu .menu-item.delimiter{border-left:1.5px solid #161209}[theme=dark] #header-desktop .header-wrapper .menu .menu-item.delimiter{border-left-color:#363636}#header-desktop .header-wrapper .menu .menu-item.language{margin-right:0}#header-desktop .header-wrapper .menu .menu-item.search{margin:0 -.5rem 0 0}#header-desktop .header-wrapper .menu a.active{font-weight:900;color:#161209}[theme=dark] #header-desktop .header-wrapper .menu a.active{color:#fff}#header-desktop.open .header-wrapper .menu .menu-item.search{margin:0 .25rem 0 .5rem}#header-desktop.open .header-wrapper .menu .menu-item.search input{width:24rem}#header-mobile{display:none;position:fixed;height:var(--header-height);line-height:var(--header-height)}[data-header-mobile=normal] #header-mobile{position:static}#header-mobile .header-container{padding:0;margin:0}#header-mobile .header-container .header-wrapper{padding:0 1rem;font-size:1.125rem;-webkit-transition:margin-top 0.3s ease;-moz-transition:margin-top 0.3s ease;-o-transition:margin-top 0.3s ease;transition:margin-top 0.3s ease}#header-mobile .header-container .header-wrapper .header-title{font-size:var(--header-title-font-size);max-width:80%}#header-mobile .header-container .header-wrapper .menu-toggle{line-height:4rem;cursor:pointer;-webkit-transition:width 0.3s ease;-moz-transition:width 0.3s ease;-o-transition:width 0.3s ease;transition:width 0.3s ease}#header-mobile .header-container .header-wrapper .menu-toggle span{display:block;background:#161209;width:1.5rem;height:2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-transition:all 0.3s ease-in-out;-moz-transition:all 0.3s ease-in-out;-o-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}[theme=dark] #header-mobile .header-container .header-wrapper .menu-toggle span{background:#a9a9b3}#header-mobile .header-container .header-wrapper .menu-toggle span:nth-child(1){margin-bottom:.5rem}#header-mobile .header-container .header-wrapper .menu-toggle span:nth-child(3){margin-top:.5rem}#header-mobile .header-container .header-wrapper .menu-toggle.active span:nth-child(1){-webkit-transform:rotate(45deg) translate(0.4rem, 0.5rem);-ms-transform:rotate(45deg) translate(0.4rem, 0.5rem);-o-transform:rotate(45deg) translate(0.4rem, 0.5rem);transform:rotate(45deg) translate(0.4rem, 0.5rem)}#header-mobile .header-container .header-wrapper .menu-toggle.active span:nth-child(2){opacity:0}#header-mobile .header-container .header-wrapper .menu-toggle.active span:nth-child(3){-webkit-transform:rotate(-45deg) translate(0.4rem, -0.5rem);-ms-transform:rotate(-45deg) translate(0.4rem, -0.5rem);-o-transform:rotate(-45deg) translate(0.4rem, -0.5rem);transform:rotate(-45deg) translate(0.4rem, -0.5rem)}#header-mobile .header-container .menu{text-align:center;background:#f8f8f8;border-top:2px solid #f0f0f0;display:none;padding-top:.5rem;-webkit-box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.1);box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.1)}#header-mobile .header-container .menu .search-wrapper{display:flex;justify-content:space-between;align-items:center;box-sizing:border-box;padding:calc((var(--header-height) - 2.5rem) / 2) 1rem;line-height:2.5rem}#header-mobile .header-container .menu .search{flex-grow:10}#header-mobile .header-container .menu .search .algolia-autocomplete,#header-mobile .header-container .menu .search input{width:100%}#header-mobile .header-container .menu .search-button{top:0}#header-mobile .header-container .menu .search-cancel{display:none;margin-left:.75rem}#header-mobile .header-container .menu .menu-item{display:block;line-height:2.5rem}#header-mobile .header-container .menu.active{display:block}[theme=dark] #header-mobile .header-container .menu{background:#252627;border-top-color:#363636}#header-mobile.open .header-wrapper{margin-top:-var(--header-height)}#header-mobile.open .menu{padding-top:0;border-top:none}#header-mobile.open .menu .menu-item{display:none}#header-mobile.open .menu .search-cancel{display:inline}.search-dropdown{position:fixed;z-index:200;top:var(--header-height);-webkit-box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.1);box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.1)}.search-dropdown.desktop{right:2rem;width:30rem}.search-dropdown.mobile{right:0;width:100%}.search-dropdown .dropdown-menu{right:0 !important;background-color:#fff}[theme=dark] .search-dropdown .dropdown-menu{background-color:#292a2d}.search-dropdown .dropdown-menu .suggestions{overflow-y:auto;max-height:calc(100vh - var(--header-height))}.search-dropdown .dropdown-menu .suggestions .suggestion{padding:.75rem 1rem}.search-dropdown .dropdown-menu .suggestions .suggestion .suggestion-title{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1rem;font-weight:bold;max-width:75%}.search-dropdown .dropdown-menu .suggestions .suggestion .suggestion-date{font-size:.875rem;float:right;text-align:right;color:#a9a9b3}[theme=dark] .search-dropdown .dropdown-menu .suggestions .suggestion .suggestion-date{color:#5d5d5f}.search-dropdown .dropdown-menu .suggestions .suggestion .suggestion-context{line-height:1.25rem;display:-moz-box;display:-webkit-box;display:box;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;word-wrap:break-word;overflow-wrap:break-word;color:#a9a9b3}[theme=dark] .search-dropdown .dropdown-menu .suggestions .suggestion .suggestion-context{color:#5d5d5f}.search-dropdown .dropdown-menu .suggestions .suggestion em{font-style:normal;background-color:rgba(53,166,247,0.25)}[theme=dark] .search-dropdown .dropdown-menu .suggestions .suggestion em{background-color:rgba(50,112,194,0.4)}.search-dropdown .dropdown-menu .suggestions .suggestion.cursor{background:#e8e8e8}[theme=dark] .search-dropdown .dropdown-menu .suggestions .suggestion.cursor{background:#323843}.search-dropdown .dropdown-menu .suggestions .suggestion:hover{cursor:pointer}.search-dropdown .dropdown-menu .search-empty{padding:1rem;text-align:center}.search-dropdown .dropdown-menu .search-empty .search-query{font-weight:bold}[theme=dark] .search-dropdown .dropdown-menu .search-empty .search-query{color:#ddd}.search-dropdown .dropdown-menu .search-footer{padding:.5rem 1rem;float:right;font-size:.8rem;color:#a9a9b3}.search-dropdown .dropdown-menu .search-footer [theme=dark]{color:#5d5d5f}.search-dropdown .dropdown-menu .search-footer a,.search-dropdown .dropdown-menu .search-footer a::before,.search-dropdown .dropdown-menu .search-footer a::after{text-decoration:none;color:#2d96bd}[theme=dark] .search-dropdown .dropdown-menu .search-footer a,[theme=dark] .search-dropdown .dropdown-menu .search-footer a::before,[theme=dark] .search-dropdown .dropdown-menu .search-footer a::after{color:#55bde2}.search-dropdown .dropdown-menu .search-footer a:active,.search-dropdown .dropdown-menu .search-footer a:hover{color:#ef3982}[theme=dark] .search-dropdown .dropdown-menu .search-footer a:active,[theme=dark] .search-dropdown .dropdown-menu .search-footer a:hover{color:#bdebfc}.search-dropdown .dropdown-menu .search-footer a{font-size:1rem}footer{height:2rem;width:100%;text-align:center;line-height:1.25rem;padding:1rem 0}footer .footer-container{font-size:.875rem}footer .footer-container .footer-line{width:100%}footer .footer-container .footer-line .icp-br{display:none}.blur footer{-webkit-filter:blur(1.5px);filter:blur(1.5px)}.pagination{display:flex;flex-direction:row;justify-content:center;list-style:none;white-space:nowrap;width:100%;padding:1rem 0 0}.pagination a{font-size:.8rem;color:#bfbfbf;letter-spacing:.1rem;font-weight:700;padding:5px 5px;text-decoration:none;-webkit-transition:0.3s;-moz-transition:0.3s;-o-transition:0.3s;transition:0.3s}.pagination li{padding-bottom:3px;margin:0 20px;box-sizing:border-box;position:relative;display:inline}.pagination li.disabled{display:none}.pagination li:hover a{color:#000}[theme=dark] .pagination li:hover a{color:#fff}.pagination li:before,.pagination li:after{position:absolute;content:"";width:0;height:3px;background:#000;-webkit-transition:0.3s;-moz-transition:0.3s;-o-transition:0.3s;transition:0.3s;bottom:0px}[theme=dark] .pagination li:before,[theme=dark] .pagination li:after{background:#fff}.pagination li:before .active,.pagination li:after .active{width:100%}.pagination li:before{left:50%}.pagination li:after{right:50%}.pagination li:hover:before,.pagination li:hover:after{width:50%}.pagination li.active a{color:#000}[theme=dark] .pagination li.active a{color:#fff}.pagination li.active:before,.pagination li.active:after{width:60%}@media only screen and (max-width: 1440px){.page{width:56%}}@media only screen and (max-width: 1200px){.page{width:52%}#header-desktop .header-wrapper{padding-right:1rem}.search-dropdown.desktop{right:1rem}}@media only screen and (max-width: 960px){#toc-auto{display:none}#toc-static{display:block}.page{width:80%}#header-desktop .header-wrapper{padding-left:1rem}}@media only screen and (max-width: 680px){#header-desktop{display:none}#header-mobile{display:block}body.blur{overflow:hidden}.page{width:100%}[data-header-mobile] .page{padding-top:var(--header-height)}[data-header-mobile=normal] .page{padding-top:0}.page .categories-card .card-item{width:100%}.copyright .copyright-line .icp-splitter{display:none}.copyright .copyright-line .icp-br{display:block}} - -/*# sourceMappingURL=style.min.css.map */ \ No newline at end of file diff --git a/resources/_gen/assets/scss/css/style.scss_d75fd08668b4bae707167bbce4d8ca46.content b/resources/_gen/assets/scss/css/style.scss_d75fd08668b4bae707167bbce4d8ca46.content deleted file mode 100644 index f845f80..0000000 --- a/resources/_gen/assets/scss/css/style.scss_d75fd08668b4bae707167bbce4d8ca46.content +++ /dev/null @@ -1,3 +0,0 @@ -html{font-family:system-ui,-apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei UI,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;font-display:swap;font-size:16px;line-height:1.5rem;width:100%}::-webkit-scrollbar{width:.5rem;height:.5rem}::-webkit-scrollbar-thumb{background-color:#87878d}::-webkit-scrollbar-thumb:hover{background-color:#a9a9b3}::selection{background-color:rgba(53,166,247,0.25)}[theme=dark] ::selection{background-color:rgba(50,112,194,0.4)}body{background-color:#fff;color:#161209;word-wrap:break-word;overflow-wrap:break-word;scrollbar-color:auto}body[theme=dark]{color:#a9a9b3;background-color:#292a2d}input::-ms-clear{display:none}a,a::before,a::after{text-decoration:none;color:#161209}[theme=dark] a,[theme=dark] a::before,[theme=dark] a::after{color:#a9a9b3}a:active,a:hover{color:#2d96bd}[theme=dark] a:active,[theme=dark] a:hover{color:#fff}#mask{background-repeat:no-repeat;background-position:center;position:fixed;top:0;left:0;width:100%;height:100%;z-index:-1;background-color:rgba(0,0,0,0)}.blur #mask{z-index:100;background-color:rgba(0,0,0,0.25)}svg.icon{display:inline-block;width:1.25em;height:1em;text-align:center}svg.icon path{fill:currentColor}img.emoji{height:1em;width:1em;margin:0 .05em 0 .1em;vertical-align:-.1em}.details .details-summary:hover{cursor:pointer}.details i.details-icon{color:#a9a9b3;-webkit-transition:transform 0.2s ease;-moz-transition:transform 0.2s ease;-o-transition:transform 0.2s ease;transition:transform 0.2s ease}[theme=dark] .details i.details-icon{color:#5d5d5f}.details .details-content{max-height:0;overflow-y:hidden;-webkit-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;-moz-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;-o-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s}.details.open i.details-icon{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.details.open .details-content{max-height:12000px;-webkit-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;-moz-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;-o-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s}#fixed-buttons{display:none}.fixed-button{display:none;z-index:100;position:fixed;right:1.5rem;font-size:1rem;line-height:1.3rem;padding:.6rem .6rem;color:#a9a9b3;background:#f8f8f8;-webkit-border-radius:2rem;-moz-border-radius:2rem;border-radius:2rem;-webkit-transition:color 0.4s ease;-moz-transition:color 0.4s ease;-o-transition:color 0.4s ease;transition:color 0.4s ease}.blur .fixed-button{-webkit-filter:blur(1.5px);-moz-filter:blur(1.5px);-ms-filter:blur(1.5px);filter:blur(1.5px)}.fixed-button:hover,.fixed-button:active{color:#161209;cursor:pointer}.fixed-button:active,.fixed-button:focus,.fixed-button:hover{outline:none}[theme=dark] .fixed-button{color:#5d5d5f;background:#252627}[theme=dark] .fixed-button:hover,[theme=dark] .fixed-button:active{color:#a9a9b3}#back-to-top{display:block;bottom:1.5rem}#view-comments{bottom:4.5rem}.cc-window.cc-banner .cc-btn{color:#161209}.cc-window.cc-banner .cc-btn:hover,.cc-window.cc-banner .cc-btn:focus{background-color:#ccc}[theme=dark] .cc-window.cc-banner .cc-btn{color:#161209}[theme=dark] .cc-window.cc-banner .cc-btn:hover,[theme=dark] .cc-window.cc-banner .cc-btn:focus{background-color:#fff}img{-o-object-fit:contain;object-fit:contain;font-family:"object-fit: contain;"}.wrapper{display:flex;flex-direction:column;min-height:100vh;width:100%}.wrapper main{flex:1 0 auto}.wrapper main .container{padding:0 1rem}.page{position:relative;max-width:800px;width:60%;margin:0 auto}[header-desktop] .page{padding-top:3.5rem}[header-desktop=normal] .page{padding-top:0}.blur .page{-webkit-filter:blur(1.5px);-moz-filter:blur(1.5px);-ms-filter:blur(1.5px);filter:blur(1.5px)}.toc .toc-title{font-size:1.2rem;font-weight:bold;text-transform:uppercase}.toc .toc-content{font-size:1rem}.toc .toc-content ul{text-indent:-0.85rem;padding-left:.8rem;list-style:none}.toc .toc-content ul a:first-child::before{content:"|";font-weight:bolder;margin-right:.5rem;color:#2d96bd}[theme=dark] .toc .toc-content ul a:first-child::before{color:#55bde2}.toc .toc-content ul ul{padding-left:1.5rem}.toc ruby{background:#f5f5f5}.toc ruby rt{color:#a9a9b3}[theme=dark] .toc ruby{background:#272C34}[theme=dark] .toc ruby rt{color:#5d5d5f}#toc-auto{display:block;position:absolute;width:12000px;max-width:0;padding:0 .8rem;border-left:4px solid #f0f0f0;word-wrap:break-word;overflow-wrap:break-word;box-sizing:border-box;top:10rem;left:0;visibility:hidden}[header-desktop=normal] #toc-auto{top:5rem}.blur #toc-auto{-webkit-filter:blur(1.5px);-moz-filter:blur(1.5px);-ms-filter:blur(1.5px);filter:blur(1.5px)}[theme=dark] #toc-auto{border-left-color:#363636}#toc-auto .toc-title{margin:.8rem 0}#toc-auto .toc-content.always-active ul{display:block}#toc-auto .toc-content>nav>ul{margin:.625rem 0}#toc-auto .toc-content ul ul{display:none}#toc-auto .toc-content ul .has-active>ul{display:block}#toc-auto .toc-content a.active{font-weight:bold;color:#2d96bd}[theme=dark] #toc-auto .toc-content a.active{color:#55bde2}#toc-auto .toc-content a.active::before{color:#ef3982}[theme=dark] #toc-auto .toc-content a.active::before{color:#bdebfc}#toc-static{display:none;margin:.8rem 0}#toc-static[kept=true]{display:block}#toc-static .toc-title{display:flex;justify-content:space-between;line-height:2em;padding:0 .75rem;background:#e6e6e6}[theme=dark] #toc-static .toc-title{background:#1a1d23}#toc-static .toc-content{background-color:#f5f5f5}#toc-static .toc-content>nav>ul{margin:0;padding:.4rem 1rem .4rem 1.8rem}[theme=dark] #toc-static .toc-content{background-color:#272C34}#toc-static.open .toc-title{background:#ededed}[theme=dark] #toc-static.open .toc-title{background:#20252b}.single .single-title{margin:1rem 0 .5rem;font-size:1.6rem;font-weight:bold;line-height:140%}.single .single-subtitle{margin:.4rem 0;font-size:1.2rem;font-weight:normal;font-style:italic;line-height:100%}.single .post-meta{font-size:.875rem;color:#a9a9b3}.single .post-meta span{display:inline-block}[theme=dark] .single .post-meta{color:#5d5d5f}.single .post-meta a,.single .post-meta a::before,.single .post-meta a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .post-meta a,[theme=dark] .single .post-meta a::before,[theme=dark] .single .post-meta a::after{color:#a9a9b3}.single .post-meta a:active,.single .post-meta a:hover{color:#ef3982}[theme=dark] .single .post-meta a:active,[theme=dark] .single .post-meta a:hover{color:#fff}.single .post-meta .author{font-size:1.05rem}.single .featured-image{margin:.5rem 0 1rem 0}.single .featured-image img{display:block;max-width:100%;height:auto;margin:0 auto;overflow:hidden}.single .featured-image img.lazyloaded{width:100%}.single .content>h2{font-size:1.5rem}.single .content>h2 code{font-size:1.25rem}.single .content>h3{font-size:1.375rem}.single .content>h3 code{font-size:1.125rem}.single .content>h4{font-size:1.25rem}.single .content>h4 code{font-size:1rem}.single .content>h5{font-size:1.125rem}.single .content>h6{font-size:1rem}.single .content h2,.single .content h3,.single .content h4,.single .content h5,.single .content h6{font-weight:bold;margin:1.2rem 0}[theme=dark] .single .content h2,[theme=dark] .single .content h3,[theme=dark] .single .content h4,[theme=dark] .single .content h5,[theme=dark] .single .content h6{font-weight:bolder}.single .content>h2>.header-mark::before,.single .content>h3>.header-mark::before,.single .content>h4>.header-mark::before,.single .content>h5>.header-mark::before,.single .content>h6>.header-mark::before{content:"|";margin-right:.3125rem;color:#2d96bd}[theme=dark] .single .content>h2>.header-mark::before,[theme=dark] .single .content>h3>.header-mark::before,[theme=dark] .single .content>h4>.header-mark::before,[theme=dark] .single .content>h5>.header-mark::before,[theme=dark] .single .content>h6>.header-mark::before{color:#55bde2}.single .content>h2>.header-mark::before{content:"#"}.single .content p{margin:.5rem 0}.single .content b,.single .content strong{font-weight:bold}[theme=dark] .single .content b,[theme=dark] .single .content strong{color:#ddd}.single .content a,.single .content a::before,.single .content a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .content a,[theme=dark] .single .content a::before,[theme=dark] .single .content a::after{color:#55bde2}.single .content a:active,.single .content a:hover{color:#ef3982}[theme=dark] .single .content a:active,[theme=dark] .single .content a:hover{color:#bdebfc}.single .content a{word-wrap:break-word;overflow-wrap:break-word}[theme=dark] .single .content a b,[theme=dark] .single .content a strong{color:#55bde2}.single .content [theme=dark] a:hover b,.single .content [theme=dark] a:hover strong{color:#bdebfc}.single .content ul,.single .content ol{margin:.5rem 0;padding-left:2.5rem}.single .content ul{list-style-type:disc}.single .content ruby{background:#f5f5f5}.single .content ruby rt{color:#a9a9b3}[theme=dark] .single .content ruby{background:#272C34}[theme=dark] .single .content ruby rt{color:#5d5d5f}.single .content .table-wrapper{overflow-x:auto}.single .content .table-wrapper::-webkit-scrollbar{background-color:#fff}[theme=dark] .single .content .table-wrapper::-webkit-scrollbar{background-color:#272c34}.single .content .table-wrapper>table{width:100%;max-width:100%;margin:.625rem 0;border-spacing:0;background:#fff;border-collapse:collapse}[theme=dark] .single .content .table-wrapper>table{background:#272c34}.single .content .table-wrapper>table thead{background:#ededed}[theme=dark] .single .content .table-wrapper>table thead{background-color:#20252b}.single .content .table-wrapper>table th,.single .content .table-wrapper>table td{padding:.3rem 1rem;border:1px solid #e8e8e8}[theme=dark] .single .content .table-wrapper>table th,[theme=dark] .single .content .table-wrapper>table td{border-color:#1c2025}.single .content img{max-width:100%;min-height:1em}.single .content figure{margin:.5rem;text-align:center}.single .content figure .image-caption:not(:empty){min-width:20%;max-width:80%;display:inline-block;padding:.5rem;margin:0 auto;font-size:.875rem;color:#969696}.single .content figure img{display:block;height:auto;margin:0 auto;overflow:hidden}.single .content .lazyloading{-o-object-fit:none;object-fit:none;font-family:"object-fit: none;"}.single .content blockquote{display:block;border-left:0.5rem solid #6bd6fd;background-color:rgba(107,214,253,0.2);padding:.25rem .75rem;margin:1rem 0}[theme=dark] .single .content blockquote{border-left-color:#59c5ec;background-color:rgba(89,197,236,0.2)}.single .content .footnotes{color:#a9a9b3}[theme=dark] .single .content .footnotes{color:#5d5d5f}.single .content .footnotes p{margin:.25rem 0}.single .content code{display:inline-block;max-width:100%;padding:0 .4rem;word-wrap:break-word;overflow-wrap:break-word;-webkit-line-break:anywhere;-ms-line-break:anywhere;line-break:anywhere;font-size:.875rem;font-family:Source Code Pro,Menlo,Consolas,Monaco,monospace,system-ui,-apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei UI,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif;color:#E74C3C}[theme=dark] .single .content code{color:#E5BF78}.single .content pre{margin:0;padding:.25rem 0 .25rem .5rem;-moz-tab-size:4;-o-tab-size:4;tab-size:4}.single .content pre code{padding:0}.single .content pre img{min-height:1em;max-height:1.2em;vertical-align:text-bottom}.single .content code,.single .content pre,.single .content .highlight table,.single .content .highlight tr,.single .content .highlight td{background:#f5f5f5}[theme=dark] .single .content code,[theme=dark] .single .content pre,[theme=dark] .single .content .highlight table,[theme=dark] .single .content .highlight tr,[theme=dark] .single .content .highlight td{background:#272C34}.single .content .highlight,.single .content .gist{font-family:Source Code Pro,Menlo,Consolas,Monaco,monospace,system-ui,-apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei UI,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:.875rem}.single .content .highlight .table-wrapper>table,.single .content .highlight .table-wrapper>table thead,.single .content .highlight .table-wrapper>table tr,.single .content .highlight .table-wrapper>table td,.single .content .gist .table-wrapper>table,.single .content .gist .table-wrapper>table thead,.single .content .gist .table-wrapper>table tr,.single .content .gist .table-wrapper>table td{margin:0;padding:0;border:none !important;white-space:nowrap}.single .content .highlight{line-height:1.4em;margin:.5rem 0}.single .content .highlight>.chroma{position:relative}.single .content .highlight>.chroma .code-header{display:flex;justify-content:space-between;align-items:center;box-sizing:border-box;width:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei UI,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:bold;color:#9c9c9c;background:#e1e1e1}[theme=dark] .single .content .highlight>.chroma .code-header{color:#b1b0b0;background:#1a1d23}.single .content .highlight>.chroma .code-header:hover{cursor:pointer}.single .content .highlight>.chroma .code-header .code-title{width:100%;padding:.4rem}.single .content .highlight>.chroma .code-header .code-title::after{padding-left:.2rem;content:'Code'}.single .content .highlight>.chroma .code-header.language-bash .code-title::after{content:"Bash"}.single .content .highlight>.chroma .code-header.language-c .code-title::after{content:"C"}.single .content .highlight>.chroma .code-header.language-cs .code-title::after{content:"C#"}.single .content .highlight>.chroma .code-header.language-cpp .code-title::after{content:"C++"}.single .content .highlight>.chroma .code-header.language-clojure .code-title::after{content:"Clojure"}.single .content .highlight>.chroma .code-header.language-coffeescript .code-title::after{content:"CoffeeScript"}.single .content .highlight>.chroma .code-header.language-css .code-title::after{content:"CSS"}.single .content .highlight>.chroma .code-header.language-dart .code-title::after{content:"Dart"}.single .content .highlight>.chroma .code-header.language-diff .code-title::after{content:"Diff"}.single .content .highlight>.chroma .code-header.language-erlang .code-title::after{content:"Erlang"}.single .content .highlight>.chroma .code-header.language-go .code-title::after{content:"Go"}.single .content .highlight>.chroma .code-header.language-go-html-template .code-title::after{content:"Go HTML Template"}.single .content .highlight>.chroma .code-header.language-groovy .code-title::after{content:"Groovy"}.single .content .highlight>.chroma .code-header.language-haskell .code-title::after{content:"Haskell"}.single .content .highlight>.chroma .code-header.language-html .code-title::after{content:"HTML"}.single .content .highlight>.chroma .code-header.language-http .code-title::after{content:"HTTP"}.single .content .highlight>.chroma .code-header.language-xml .code-title::after{content:"XML"}.single .content .highlight>.chroma .code-header.language-java .code-title::after{content:"Java"}.single .content .highlight>.chroma .code-header.language-js .code-title::after{content:"JavaScript"}.single .content .highlight>.chroma .code-header.language-javascript .code-title::after{content:"JavaScript"}.single .content .highlight>.chroma .code-header.language-json .code-title::after{content:"JSON"}.single .content .highlight>.chroma .code-header.language-kotlin .code-title::after{content:"Kotlin"}.single .content .highlight>.chroma .code-header.language-latex .code-title::after{content:"LaTeX"}.single .content .highlight>.chroma .code-header.language-less .code-title::after{content:"Less"}.single .content .highlight>.chroma .code-header.language-lisp .code-title::after{content:"Lisp"}.single .content .highlight>.chroma .code-header.language-lua .code-title::after{content:"Lua"}.single .content .highlight>.chroma .code-header.language-makefile .code-title::after{content:"Makefile"}.single .content .highlight>.chroma .code-header.language-markdown .code-title::after{content:"Markdown"}.single .content .highlight>.chroma .code-header.language-matlab .code-title::after{content:"Matlab"}.single .content .highlight>.chroma .code-header.language-objectivec .code-title::after{content:"Objective-C"}.single .content .highlight>.chroma .code-header.language-php .code-title::after{content:"PHP"}.single .content .highlight>.chroma .code-header.language-perl .code-title::after{content:"Perl"}.single .content .highlight>.chroma .code-header.language-python .code-title::after{content:"Python"}.single .content .highlight>.chroma .code-header.language-r .code-title::after{content:"R"}.single .content .highlight>.chroma .code-header.language-ruby .code-title::after{content:"Ruby"}.single .content .highlight>.chroma .code-header.language-rust .code-title::after{content:"Rust"}.single .content .highlight>.chroma .code-header.language-scala .code-title::after{content:"Scala"}.single .content .highlight>.chroma .code-header.language-scss .code-title::after{content:"Scss"}.single .content .highlight>.chroma .code-header.language-shell .code-title::after{content:"Shell"}.single .content .highlight>.chroma .code-header.language-sql .code-title::after{content:"SQL"}.single .content .highlight>.chroma .code-header.language-swift .code-title::after{content:"Swift"}.single .content .highlight>.chroma .code-header.language-tex .code-title::after{content:"TeX"}.single .content .highlight>.chroma .code-header.language-toml .code-title::after{content:"TOML"}.single .content .highlight>.chroma .code-header.language-ts .code-title::after{content:"TypeScript"}.single .content .highlight>.chroma .code-header.language-typescript .code-title::after{content:"TypeScript"}.single .content .highlight>.chroma .code-header.language-vue .code-title::after{content:"Vue"}.single .content .highlight>.chroma .code-header.language-yml .code-title::after{content:"YAML"}.single .content .highlight>.chroma .code-header.language-yaml .code-title::after{content:"YAML"}.single .content .highlight>.chroma .lntd:first-child{min-width:1.6rem;text-align:right}.single .content .highlight>.chroma .lntd:last-child{width:100%}.single .content .highlight>.chroma .lntd:last-child pre{min-width:-webkit-max-content;min-width:-moz-max-content;min-width:intrinsic;min-width:max-content}.single .content .highlight>.chroma .ln{padding-right:.75rem}.single .content .highlight>.chroma .hl{display:block;background-color:#dcdcdc}[theme=dark] .single .content .highlight>.chroma .hl{background-color:#1c2025}.single .content .highlight>.chroma .ln,.single .content .highlight>.chroma .lnt{color:#a9a9b3}[theme=dark] .single .content .highlight>.chroma .ln,[theme=dark] .single .content .highlight>.chroma .lnt{color:#5d5d5f}.single .content .highlight>.chroma .arrow{padding:0 .2rem;-webkit-transition:transform 0.2s ease;-moz-transition:transform 0.2s ease;-o-transition:transform 0.2s ease;transition:transform 0.2s ease}.single .content .highlight>.chroma .ellipses{padding:.4rem}.single .content .highlight>.chroma .copy{display:none;padding:.4rem}.single .content .highlight>.chroma .copy:hover{cursor:pointer;color:#2d96bd}[theme=dark] .single .content .highlight>.chroma .copy:hover{color:#fff}.single .content .highlight>.chroma .table-wrapper{max-height:0;overflow-y:hidden;-webkit-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;-moz-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;-o-transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s;transition:max-height 0.8s cubic-bezier(0, 1, 0, 1) -0.1s}.single .content .highlight>.chroma.open .code-header{background:#ededed}[theme=dark] .single .content .highlight>.chroma.open .code-header{background:#20252b}.single .content .highlight>.chroma.open .table-wrapper{max-height:12000px;-webkit-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;-moz-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;-o-transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s;transition:max-height 0.8s cubic-bezier(0.5, 0, 1, 0) 0s}.single .content .highlight>.chroma.open .arrow{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.single .content .highlight>.chroma.open .ellipses{display:none}.single .content .highlight>.chroma.open .copy{display:inline}.single .content .highlight .c,.single .content .highlight .ch,.single .content .highlight .cm,.single .content .highlight .c1,.single .content .highlight .cs,.single .content .highlight .cp,.single .content .highlight .cpf{font-style:italic}.single .content .highlight .gl{text-decoration:underline}.single .content .highlight .p{color:#a9a9b3}.single .content .highlight .k{color:#b501a9}.single .content .highlight .kc{color:#b501a9}.single .content .highlight .kd{color:#b501a9}.single .content .highlight .kn{color:#b501a9}.single .content .highlight .kp{color:#b501a9}.single .content .highlight .kr{color:#b501a9}.single .content .highlight .kt{color:#b501a9}.single .content .highlight .n{color:#333}.single .content .highlight .na{color:#2b77fa}.single .content .highlight .nb{color:#f74840}.single .content .highlight .bp{color:#f74840}.single .content .highlight .nc{color:#cb8100}.single .content .highlight .no{color:#2b77fa}.single .content .highlight .nd{color:#0086c1}.single .content .highlight .ni{color:#2b77fa}.single .content .highlight .ne{color:#2b77fa}.single .content .highlight .nf{color:#2b77fa}.single .content .highlight .fm{color:#1ccad6}.single .content .highlight .nl{color:#2b77fa}.single .content .highlight .nn{color:#2b77fa}.single .content .highlight .nx{color:#333}.single .content .highlight .py{color:#2b77fa}.single .content .highlight .nt{color:#2b77fa}.single .content .highlight .nv{color:#2b77fa}.single .content .highlight .vc{color:#2b77fa}.single .content .highlight .vg{color:#2b77fa}.single .content .highlight .vi{color:#2b77fa}.single .content .highlight .vm{color:#2b77fa}.single .content .highlight .l{color:#2aa198}.single .content .highlight .ld{color:#2aa198}.single .content .highlight .s{color:#24a443}.single .content .highlight .sa{color:#24a443}.single .content .highlight .sb{color:#24a443}.single .content .highlight .sc{color:#24a443}.single .content .highlight .dl{color:#24a443}.single .content .highlight .sd{color:#24a443}.single .content .highlight .s2{color:#24a443}.single .content .highlight .se{color:#24a443}.single .content .highlight .sh{color:#24a443}.single .content .highlight .si{color:#24a443}.single .content .highlight .sx{color:#24a443}.single .content .highlight .sr{color:#24a443}.single .content .highlight .s1{color:#24a443}.single .content .highlight .ss{color:#24a443}.single .content .highlight .m{color:#e2893c}.single .content .highlight .mb{color:#e2893c}.single .content .highlight .mf{color:#e2893c}.single .content .highlight .mh{color:#e2893c}.single .content .highlight .mi{color:#e2893c}.single .content .highlight .il{color:#e2893c}.single .content .highlight .mo{color:#e2893c}.single .content .highlight .o{color:#f19b04}.single .content .highlight .ow{color:#b501a9}.single .content .highlight .c{color:#a0a1a8}.single .content .highlight .ch{color:#a0a1a8}.single .content .highlight .cm{color:#a0a1a8}.single .content .highlight .c1{color:#a0a1a8}.single .content .highlight .cs{color:#a0a1a8}.single .content .highlight .cp{color:#a0a1a8}.single .content .highlight .cpf{color:#a0a1a8}.single .content .highlight .g{color:#e72d40}.single .content .highlight .gd{color:#e72d40}.single .content .highlight .ge{color:#e72d40}.single .content .highlight .gr{color:#e72d40}.single .content .highlight .gh{color:#e72d40}.single .content .highlight .gi{color:#e72d40}.single .content .highlight .go{color:#e72d40}.single .content .highlight .gp{color:#e72d40}.single .content .highlight .gs{color:#e72d40}.single .content .highlight .gu{color:#e72d40}.single .content .highlight .gt{color:#e72d40}.single .content .highlight .w{color:#bbb}[theme=dark] .single .content .highlight .p{color:#a9a9b3}[theme=dark] .single .content .highlight .k{color:#d371e3}[theme=dark] .single .content .highlight .kc{color:#d371e3}[theme=dark] .single .content .highlight .kd{color:#d371e3}[theme=dark] .single .content .highlight .kn{color:#d371e3}[theme=dark] .single .content .highlight .kp{color:#d371e3}[theme=dark] .single .content .highlight .kr{color:#d371e3}[theme=dark] .single .content .highlight .kt{color:#d371e3}[theme=dark] .single .content .highlight .n{color:#a9b2c0}[theme=dark] .single .content .highlight .na{color:#41b0f5}[theme=dark] .single .content .highlight .nb{color:#19b9c4}[theme=dark] .single .content .highlight .bp{color:#ecbf6f}[theme=dark] .single .content .highlight .nc{color:#ecbf6f}[theme=dark] .single .content .highlight .no{color:#41b0f5}[theme=dark] .single .content .highlight .nd{color:#ecbf6f}[theme=dark] .single .content .highlight .ni{color:#41b0f5}[theme=dark] .single .content .highlight .ne{color:#41b0f5}[theme=dark] .single .content .highlight .nf{color:#41b0f5}[theme=dark] .single .content .highlight .fm{color:#19b9c4}[theme=dark] .single .content .highlight .nl{color:#41b0f5}[theme=dark] .single .content .highlight .nn{color:#41b0f5}[theme=dark] .single .content .highlight .nx{color:#a9a9b3}[theme=dark] .single .content .highlight .py{color:#41b0f5}[theme=dark] .single .content .highlight .nt{color:#41b0f5}[theme=dark] .single .content .highlight .nv{color:#41b0f5}[theme=dark] .single .content .highlight .vc{color:#41b0f5}[theme=dark] .single .content .highlight .vg{color:#41b0f5}[theme=dark] .single .content .highlight .vi{color:#41b0f5}[theme=dark] .single .content .highlight .vm{color:#41b0f5}[theme=dark] .single .content .highlight .l{color:#2aa198}[theme=dark] .single .content .highlight .ld{color:#2aa198}[theme=dark] .single .content .highlight .s{color:#8cc570}[theme=dark] .single .content .highlight .sa{color:#8cc570}[theme=dark] .single .content .highlight .sb{color:#8cc570}[theme=dark] .single .content .highlight .sc{color:#8cc570}[theme=dark] .single .content .highlight .dl{color:#8cc570}[theme=dark] .single .content .highlight .sd{color:#8cc570}[theme=dark] .single .content .highlight .s2{color:#8cc570}[theme=dark] .single .content .highlight .se{color:#8cc570}[theme=dark] .single .content .highlight .sh{color:#8cc570}[theme=dark] .single .content .highlight .si{color:#8cc570}[theme=dark] .single .content .highlight .sx{color:#8cc570}[theme=dark] .single .content .highlight .sr{color:#8cc570}[theme=dark] .single .content .highlight .s1{color:#8cc570}[theme=dark] .single .content .highlight .ss{color:#8cc570}[theme=dark] .single .content .highlight .m{color:#db985c}[theme=dark] .single .content .highlight .mb{color:#db985c}[theme=dark] .single .content .highlight .mf{color:#db985c}[theme=dark] .single .content .highlight .mh{color:#db985c}[theme=dark] .single .content .highlight .mi{color:#db985c}[theme=dark] .single .content .highlight .il{color:#db985c}[theme=dark] .single .content .highlight .mo{color:#db985c}[theme=dark] .single .content .highlight .o{color:#ecbf6f}[theme=dark] .single .content .highlight .ow{color:#d371e3}[theme=dark] .single .content .highlight .c{color:#7e848f}[theme=dark] .single .content .highlight .ch{color:#7e848f}[theme=dark] .single .content .highlight .cm{color:#7e848f}[theme=dark] .single .content .highlight .c1{color:#7e848f}[theme=dark] .single .content .highlight .cs{color:#7e848f}[theme=dark] .single .content .highlight .cp{color:#7e848f}[theme=dark] .single .content .highlight .cpf{color:#7e848f}[theme=dark] .single .content .highlight .g{color:#f16372}[theme=dark] .single .content .highlight .gd{color:#f16372}[theme=dark] .single .content .highlight .ge{color:#f16372}[theme=dark] .single .content .highlight .gr{color:#f16372}[theme=dark] .single .content .highlight .gh{color:#f16372}[theme=dark] .single .content .highlight .gi{color:#f16372}[theme=dark] .single .content .highlight .go{color:#f16372}[theme=dark] .single .content .highlight .gp{color:#f16372}[theme=dark] .single .content .highlight .gs{color:#f16372}[theme=dark] .single .content .highlight .gu{color:#f16372}[theme=dark] .single .content .highlight .gt{color:#f16372}[theme=dark] .single .content .highlight .w{color:#bbb}.single .content .gist .gist-file,.single .content .gist .gist-data,.single .content .gist .gist-meta{border:none}.single .content .gist .gist-meta{padding:.4rem .8rem;background-color:#e8e8e8}.single .content .gist .gist-meta a,.single .content .gist .gist-meta a::before,.single .content .gist .gist-meta a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .content .gist .gist-meta a,[theme=dark] .single .content .gist .gist-meta a::before,[theme=dark] .single .content .gist .gist-meta a::after{color:#55bde2}.single .content .gist .gist-meta a:active,.single .content .gist .gist-meta a:hover{color:#ef3982}[theme=dark] .single .content .gist .gist-meta a:active,[theme=dark] .single .content .gist .gist-meta a:hover{color:#bdebfc}[theme=dark] .single .content .gist .gist-meta{background-color:#1c2025}[theme=dark] .single .content .gist .highlight{background:#141414}[theme=dark] .single .content .gist .blob-num,[theme=dark] .single .content .gist .blob-code-inner,[theme=dark] .single .content .gist .highlight,[theme=dark] .single .content .gist .pl-enm,[theme=dark] .single .content .gist .pl-ko,[theme=dark] .single .content .gist .pl-mo,[theme=dark] .single .content .gist .pl-mp1 .pl-sf,[theme=dark] .single .content .gist .pl-ms,[theme=dark] .single .content .gist .pl-pdc1,[theme=dark] .single .content .gist .pl-scp,[theme=dark] .single .content .gist .pl-smc,[theme=dark] .single .content .gist .pl-som,[theme=dark] .single .content .gist .pl-va,[theme=dark] .single .content .gist .pl-vpf,[theme=dark] .single .content .gist .pl-vpu,[theme=dark] .single .content .gist .pl-mdr{color:#aab1bf}[theme=dark] .single .content .gist .pl-mb,[theme=dark] .single .content .gist .pl-pdb{font-weight:700}[theme=dark] .single .content .gist .pl-c,[theme=dark] .single .content .gist .pl-c span,[theme=dark] .single .content .gist .pl-pdc{color:#5b6270;font-style:italic}[theme=dark] .single .content .gist .pl-sr .pl-cce{color:#56b5c2;font-weight:400}[theme=dark] .single .content .gist .pl-ef,[theme=dark] .single .content .gist .pl-en,[theme=dark] .single .content .gist .pl-enf,[theme=dark] .single .content .gist .pl-eoai,[theme=dark] .single .content .gist .pl-kos,[theme=dark] .single .content .gist .pl-mh .pl-pdh,[theme=dark] .single .content .gist .pl-mr{color:#61afef}[theme=dark] .single .content .gist .pl-ens,[theme=dark] .single .content .gist .pl-vi{color:#be5046}[theme=dark] .single .content .gist .pl-enti,[theme=dark] .single .content .gist .pl-mai .pl-sf,[theme=dark] .single .content .gist .pl-ml,[theme=dark] .single .content .gist .pl-sf,[theme=dark] .single .content .gist .pl-sr,[theme=dark] .single .content .gist .pl-sr .pl-sra,[theme=dark] .single .content .gist .pl-src,[theme=dark] .single .content .gist .pl-st,[theme=dark] .single .content .gist .pl-vo{color:#56b5c2}[theme=dark] .single .content .gist .pl-eoi,[theme=dark] .single .content .gist .pl-mri,[theme=dark] .single .content .gist .pl-pds,[theme=dark] .single .content .gist .pl-pse .pl-s1,[theme=dark] .single .content .gist .pl-s,[theme=dark] .single .content .gist .pl-s1{color:#97c279}[theme=dark] .single .content .gist .pl-k,[theme=dark] .single .content .gist .pl-kolp,[theme=dark] .single .content .gist .pl-mc,[theme=dark] .single .content .gist .pl-pde{color:#c578dd}[theme=dark] .single .content .gist .pl-mi,[theme=dark] .single .content .gist .pl-pdi{color:#c578dd;font-style:italic}[theme=dark] .single .content .gist .pl-mp,[theme=dark] .single .content .gist .pl-stp{color:#818896}[theme=dark] .single .content .gist .pl-mdh,[theme=dark] .single .content .gist .pl-mdi,[theme=dark] .single .content .gist .pl-mdr{font-weight:400}[theme=dark] .single .content .gist .pl-mdht,[theme=dark] .single .content .gist .pl-mi1{color:#97c279;background:#020}[theme=dark] .single .content .gist .pl-md,[theme=dark] .single .content .gist .pl-mdhf{color:#df6b75;background:#200}[theme=dark] .single .content .gist .pl-corl{color:#df6b75;text-decoration:underline}[theme=dark] .single .content .gist .pl-ib{background:#df6b75}[theme=dark] .single .content .gist .pl-ii{background:#e0c184;color:#fff}[theme=dark] .single .content .gist .pl-iu{background:#e05151}[theme=dark] .single .content .gist .pl-ms1{color:#aab1bf;background:#373b41}[theme=dark] .single .content .gist .pl-c1,[theme=dark] .single .content .gist .pl-cn,[theme=dark] .single .content .gist .pl-e,[theme=dark] .single .content .gist .pl-eoa,[theme=dark] .single .content .gist .pl-eoac,[theme=dark] .single .content .gist .pl-eoac .pl-pde,[theme=dark] .single .content .gist .pl-kou,[theme=dark] .single .content .gist .pl-mm,[theme=dark] .single .content .gist .pl-mp .pl-s3,[theme=dark] .single .content .gist .pl-mq,[theme=dark] .single .content .gist .pl-s3,[theme=dark] .single .content .gist .pl-sok,[theme=dark] .single .content .gist .pl-sv,[theme=dark] .single .content .gist .pl-mb{color:#d19965}[theme=dark] .single .content .gist .pl-enc,[theme=dark] .single .content .gist .pl-entc,[theme=dark] .single .content .gist .pl-pse .pl-s2,[theme=dark] .single .content .gist .pl-s2,[theme=dark] .single .content .gist .pl-sc,[theme=dark] .single .content .gist .pl-smp,[theme=dark] .single .content .gist .pl-sr .pl-sre,[theme=dark] .single .content .gist .pl-stj,[theme=dark] .single .content .gist .pl-v,[theme=dark] .single .content .gist .pl-pdb{color:#e4bf7a}[theme=dark] .single .content .gist .pl-ent,[theme=dark] .single .content .gist .pl-entl,[theme=dark] .single .content .gist .pl-entm,[theme=dark] .single .content .gist .pl-mh,[theme=dark] .single .content .gist .pl-pdv,[theme=dark] .single .content .gist .pl-smi,[theme=dark] .single .content .gist .pl-sol,[theme=dark] .single .content .gist .pl-mdh,[theme=dark] .single .content .gist .pl-mdi{color:#df6b75}[theme=dark] .single .content iframe.instagram-media{border:none !important}.single .content .admonition{position:relative;margin:1rem 0;padding:0 .75rem;background-color:rgba(68,138,255,0.1);border-left:0.25rem solid #448aff;overflow:auto}.single .content .admonition .admonition-title{font-weight:bold;margin:0 -0.75rem;padding:.25rem 1.8rem;border-bottom:1px solid rgba(68,138,255,0.1);background-color:rgba(68,138,255,0.25)}.single .content .admonition.open .admonition-title{background-color:rgba(68,138,255,0.1)}.single .content .admonition .admonition-content{padding:.5rem 0}.single .content .admonition i.icon{font-size:0.85rem;color:#448aff;position:absolute;top:.6rem;left:.4rem}.single .content .admonition i.details-icon{position:absolute;top:.6rem;right:.3rem}.single .content .admonition.note{border-left-color:#448aff}.single .content .admonition.note i.icon{color:#448aff}.single .content .admonition.abstract{border-left-color:#00b0ff}.single .content .admonition.abstract i.icon{color:#00b0ff}.single .content .admonition.info{border-left-color:#00b8d4}.single .content .admonition.info i.icon{color:#00b8d4}.single .content .admonition.tip{border-left-color:#00bfa5}.single .content .admonition.tip i.icon{color:#00bfa5}.single .content .admonition.success{border-left-color:#00c853}.single .content .admonition.success i.icon{color:#00c853}.single .content .admonition.question{border-left-color:#64dd17}.single .content .admonition.question i.icon{color:#64dd17}.single .content .admonition.warning{border-left-color:#ff9100}.single .content .admonition.warning i.icon{color:#ff9100}.single .content .admonition.failure{border-left-color:#ff5252}.single .content .admonition.failure i.icon{color:#ff5252}.single .content .admonition.danger{border-left-color:#ff1744}.single .content .admonition.danger i.icon{color:#ff1744}.single .content .admonition.bug{border-left-color:#f50057}.single .content .admonition.bug i.icon{color:#f50057}.single .content .admonition.example{border-left-color:#651fff}.single .content .admonition.example i.icon{color:#651fff}.single .content .admonition.quote{border-left-color:#9e9e9e}.single .content .admonition.quote i.icon{color:#9e9e9e}.single .content .admonition.note{background-color:rgba(68,138,255,0.1)}.single .content .admonition.note .admonition-title{border-bottom-color:rgba(68,138,255,0.1);background-color:rgba(68,138,255,0.25)}.single .content .admonition.note.open .admonition-title{background-color:rgba(68,138,255,0.1)}.single .content .admonition.abstract{background-color:rgba(0,176,255,0.1)}.single .content .admonition.abstract .admonition-title{border-bottom-color:rgba(0,176,255,0.1);background-color:rgba(0,176,255,0.25)}.single .content .admonition.abstract.open .admonition-title{background-color:rgba(0,176,255,0.1)}.single .content .admonition.info{background-color:rgba(0,184,212,0.1)}.single .content .admonition.info .admonition-title{border-bottom-color:rgba(0,184,212,0.1);background-color:rgba(0,184,212,0.25)}.single .content .admonition.info.open .admonition-title{background-color:rgba(0,184,212,0.1)}.single .content .admonition.tip{background-color:rgba(0,191,165,0.1)}.single .content .admonition.tip .admonition-title{border-bottom-color:rgba(0,191,165,0.1);background-color:rgba(0,191,165,0.25)}.single .content .admonition.tip.open .admonition-title{background-color:rgba(0,191,165,0.1)}.single .content .admonition.success{background-color:rgba(0,200,83,0.1)}.single .content .admonition.success .admonition-title{border-bottom-color:rgba(0,200,83,0.1);background-color:rgba(0,200,83,0.25)}.single .content .admonition.success.open .admonition-title{background-color:rgba(0,200,83,0.1)}.single .content .admonition.question{background-color:rgba(100,221,23,0.1)}.single .content .admonition.question .admonition-title{border-bottom-color:rgba(100,221,23,0.1);background-color:rgba(100,221,23,0.25)}.single .content .admonition.question.open .admonition-title{background-color:rgba(100,221,23,0.1)}.single .content .admonition.warning{background-color:rgba(255,145,0,0.1)}.single .content .admonition.warning .admonition-title{border-bottom-color:rgba(255,145,0,0.1);background-color:rgba(255,145,0,0.25)}.single .content .admonition.warning.open .admonition-title{background-color:rgba(255,145,0,0.1)}.single .content .admonition.failure{background-color:rgba(255,82,82,0.1)}.single .content .admonition.failure .admonition-title{border-bottom-color:rgba(255,82,82,0.1);background-color:rgba(255,82,82,0.25)}.single .content .admonition.failure.open .admonition-title{background-color:rgba(255,82,82,0.1)}.single .content .admonition.danger{background-color:rgba(255,23,68,0.1)}.single .content .admonition.danger .admonition-title{border-bottom-color:rgba(255,23,68,0.1);background-color:rgba(255,23,68,0.25)}.single .content .admonition.danger.open .admonition-title{background-color:rgba(255,23,68,0.1)}.single .content .admonition.bug{background-color:rgba(245,0,87,0.1)}.single .content .admonition.bug .admonition-title{border-bottom-color:rgba(245,0,87,0.1);background-color:rgba(245,0,87,0.25)}.single .content .admonition.bug.open .admonition-title{background-color:rgba(245,0,87,0.1)}.single .content .admonition.example{background-color:rgba(101,31,255,0.1)}.single .content .admonition.example .admonition-title{border-bottom-color:rgba(101,31,255,0.1);background-color:rgba(101,31,255,0.25)}.single .content .admonition.example.open .admonition-title{background-color:rgba(101,31,255,0.1)}.single .content .admonition.quote{background-color:rgba(159,159,159,0.1)}.single .content .admonition.quote .admonition-title{border-bottom-color:rgba(159,159,159,0.1);background-color:rgba(159,159,159,0.25)}.single .content .admonition.quote.open .admonition-title{background-color:rgba(159,159,159,0.1)}.single .content .admonition:last-child{margin-bottom:.75rem}.single .content .echarts{margin:.5rem 0;text-align:center}.single .content .mapbox{margin:.5rem 0;padding:.5rem 0}.single .content meting-js{margin:.5rem 0}.single .content .bilibili{position:relative;width:100%;height:0;padding-bottom:75%;margin:3% auto;text-align:center}.single .content .bilibili iframe{position:absolute;width:100%;height:100%;left:0;top:0}.single .content hr{margin:1rem 0;position:relative;border-top:1px dashed #f0f0f0;border-bottom:none}[theme=dark] .single .content hr{border-top:1px dashed #363636}.single .content kbd{display:inline-block;padding:.25rem;background-color:#fff;border:1px solid #f0f0f0;border-bottom-color:#f0f0f0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 #f0f0f0;box-shadow:inset 0 -1px 0 #f0f0f0;font-size:.8rem;font-family:Source Code Pro,Menlo,Consolas,Monaco,monospace,system-ui,-apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei UI,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif;color:#E74C3C}[theme=dark] .single .content kbd{background-color:#292a2d;border:1px solid #363636;border-bottom-color:#363636;-webkit-box-shadow:inset 0 -1px 0 #363636;box-shadow:inset 0 -1px 0 #363636;color:#E5BF78}.single .content .typeit .code{padding:.375rem;font-size:.875rem;font-family:Source Code Pro,Menlo,Consolas,Monaco,monospace,system-ui,-apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei UI,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:bold;word-break:break-all}.single .content .version{height:1.25em;vertical-align:text-bottom}.single .post-footer{margin-top:3rem}.single .post-footer .post-info{border-bottom:1px solid #f0f0f0;padding:1rem 0 0.3rem}[theme=dark] .single .post-footer .post-info{border-bottom:1px solid #363636}.single .post-footer .post-info .post-info-line{display:flex;justify-content:space-between}.single .post-footer .post-info .post-info-line .post-info-mod{font-size:0.8em;color:#a9a9b3}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod{color:#5d5d5f}.single .post-footer .post-info .post-info-line .post-info-mod a,.single .post-footer .post-info .post-info-line .post-info-mod a::before,.single .post-footer .post-info .post-info-line .post-info-mod a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod a,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod a::before,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod a::after{color:#55bde2}.single .post-footer .post-info .post-info-line .post-info-mod a:active,.single .post-footer .post-info .post-info-line .post-info-mod a:hover{color:#ef3982}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod a:active,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-mod a:hover{color:#bdebfc}.single .post-footer .post-info .post-info-line .post-info-license{font-size:0.8em;color:#a9a9b3}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license{color:#5d5d5f}.single .post-footer .post-info .post-info-line .post-info-license a,.single .post-footer .post-info .post-info-line .post-info-license a::before,.single .post-footer .post-info .post-info-line .post-info-license a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license a,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license a::before,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license a::after{color:#55bde2}.single .post-footer .post-info .post-info-line .post-info-license a:active,.single .post-footer .post-info .post-info-line .post-info-license a:hover{color:#ef3982}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license a:active,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-license a:hover{color:#bdebfc}.single .post-footer .post-info .post-info-line .post-info-md{font-size:0.8rem;width:8rem}.single .post-footer .post-info .post-info-line .post-info-md a,.single .post-footer .post-info .post-info-line .post-info-md a::before,.single .post-footer .post-info .post-info-line .post-info-md a::after{text-decoration:none;color:#2d96bd}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-md a,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-md a::before,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-md a::after{color:#55bde2}.single .post-footer .post-info .post-info-line .post-info-md a:active,.single .post-footer .post-info .post-info-line .post-info-md a:hover{color:#ef3982}[theme=dark] .single .post-footer .post-info .post-info-line .post-info-md a:active,[theme=dark] .single .post-footer .post-info .post-info-line .post-info-md a:hover{color:#bdebfc}.single .post-footer .post-info .post-info-line .post-info-share a *{vertical-align:text-bottom}.single .post-footer .post-info-more{padding:0.3rem 0 1rem;display:flex;justify-content:space-between;font-size:0.9rem}.single .post-footer .post-tags{max-width:65%}.single .post-footer .post-tags *{display:inline}.single .post-footer .post-nav::before,.single .post-footer .post-nav::after{content:' ';display:table}.single .post-footer .post-nav a.prev,.single .post-footer .post-nav a.next{font-size:1rem;font-weight:600;-webkit-transition:all 0.3s ease-out;-moz-transition:all 0.3s ease-out;-o-transition:all 0.3s ease-out;transition:all 0.3s ease-out}.single .post-footer .post-nav a.prev{float:left}.single .post-footer .post-nav a.prev:hover{-webkit-transform:translateX(-4px);-moz-transform:translateX(-4px);-ms-transform:translateX(-4px);-o-transform:translateX(-4px);transform:translateX(-4px)}.single .post-footer .post-nav a.next{float:right}.single .post-footer .post-nav a.next:hover{-webkit-transform:translateX(4px);-moz-transform:translateX(4px);-ms-transform:translateX(4px);-o-transform:translateX(4px);transform:translateX(4px)}.single #comments{padding:8rem 0 2rem}.lg-toolbar .lg-icon::after{color:#999}.special .single-title,.special .single-subtitle{text-align:right}.archive .single-title{text-align:right}.archive .group-title{margin-top:1.5rem;margin-bottom:1rem}.archive .categories-card{margin:0 auto;margin-top:3rem;display:flex;align-items:center;justify-content:space-between;flex-direction:row;flex-wrap:wrap;line-height:1.6rem}.archive .categories-card .card-item{font-size:.875rem;text-align:left;width:45%;display:flex;align-items:flex-start;margin-top:2rem;min-height:10rem;padding:0 2%;position:relative}.archive .categories-card .card-item .card-item-wrapper{width:100%;overflow:hidden}.archive .categories-card .card-item .card-item-wrapper .card-item-title{font-size:1.2rem;font-weight:bold;display:inline-block;margin-top:1rem;margin-bottom:.75rem}.archive .categories-card .card-item .card-item-wrapper span{float:right;padding-right:1rem}.archive .archive-item{display:flex;justify-content:space-between;align-items:center;box-sizing:border-box;margin:.25rem 0 .25rem 1.5rem}.archive .archive-item-link{min-width:10%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.archive .archive-item-link:hover{color:#2d96bd;background-color:transparent}[theme=dark] .archive .archive-item-link{color:#a9a9b3}[theme=dark] .archive .archive-item-link:hover{color:#fff}.archive .archive-item-date{width:4em;text-align:right;color:#a9a9b3}[theme=dark] .archive .archive-item-date{color:#5d5d5f}.archive .more-post{text-align:right}.archive .tag-cloud-tags{margin:10px 0}.archive .tag-cloud-tags a,.archive .tag-cloud-tags a::before,.archive .tag-cloud-tags a::after{text-decoration:none;color:#161209}[theme=dark] .archive .tag-cloud-tags a,[theme=dark] .archive .tag-cloud-tags a::before,[theme=dark] .archive .tag-cloud-tags a::after{color:#a9a9b3}.archive .tag-cloud-tags a:active,.archive .tag-cloud-tags a:hover{color:#2d96bd}[theme=dark] .archive .tag-cloud-tags a:active,[theme=dark] .archive .tag-cloud-tags a:hover{color:#fff}.archive .tag-cloud-tags a{display:inline-block;position:relative;margin:5px 10px;word-wrap:break-word;overflow-wrap:break-word;-webkit-transition:all ease-out 0.3s;-moz-transition:all ease-out 0.3s;-o-transition:all ease-out 0.3s;transition:all ease-out 0.3s}.archive .tag-cloud-tags a:active,.archive .tag-cloud-tags a:focus,.archive .tag-cloud-tags a:hover{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}.archive .tag-cloud-tags a sup{color:#a9a9b3}[theme=dark] .archive .tag-cloud-tags a sup{color:#5d5d5f}.home .home-profile{-webkit-transform:translateY(16vh);-moz-transform:translateY(16vh);-ms-transform:translateY(16vh);-o-transform:translateY(16vh);transform:translateY(16vh);padding:0 0 .5rem;text-align:center}.home .home-profile .home-avatar{padding:.5rem}.home .home-profile .home-avatar img{display:inline-block;width:8rem;height:auto;margin:0 auto;-webkit-border-radius:100%;-moz-border-radius:100%;border-radius:100%;-webkit-box-shadow:0 0 0 0.3618em rgba(0,0,0,0.05);box-shadow:0 0 0 0.3618em rgba(0,0,0,0.05);-webkit-transition:all 0.4s ease;-moz-transition:all 0.4s ease;-o-transition:all 0.4s ease;transition:all 0.4s ease}.home .home-profile .home-avatar img:hover{position:relative;-webkit-transform:translateY(-0.75rem);-moz-transform:translateY(-0.75rem);-ms-transform:translateY(-0.75rem);-o-transform:translateY(-0.75rem);transform:translateY(-0.75rem)}.home .home-profile .home-title{font-size:1.25rem;font-weight:bold;margin:0;padding:.5rem}.home .home-profile .home-subtitle{font-size:1rem;font-weight:normal;margin:0;padding:.5rem}.home .home-profile .links{padding:.5rem;font-size:1.5rem}.home .home-profile .links a *{vertical-align:text-bottom}.home .home-profile .links img{height:1.5rem;padding:0 .25rem}.home .home-profile .home-disclaimer{font-size:1rem;line-height:1.5rem;font-weight:normal;margin:0;padding:.5rem;color:#a9a9b3}[theme=dark] .home .home-profile .home-disclaimer{color:#5d5d5f}.home[posts] .home-profile{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0);padding-top:2rem}.home[posts] .home-avatar img{width:6rem}.home[posts] .summary{padding-top:1rem;padding-bottom:.8rem;color:#161209;border-bottom:1px dashed #f0f0f0}[theme=dark] .home[posts] .summary{color:#a9a9b3;border-bottom:1px dashed #363636}.home[posts] .summary .featured-image-preview{width:100%;padding:30% 0 0;position:relative;margin:0.6rem auto;-webkit-transition:transform 0.4s ease;-moz-transition:transform 0.4s ease;-o-transition:transform 0.4s ease;transition:transform 0.4s ease}.home[posts] .summary .featured-image-preview img{position:absolute;width:100%;height:100%;left:0;top:0;-o-object-fit:none;object-fit:none;font-family:"object-fit: none;"}.home[posts] .summary .featured-image-preview img.lazyloaded{-o-object-fit:cover;object-fit:cover;font-family:"object-fit: cover;"}.home[posts] .summary .featured-image-preview:hover{-webkit-transform:scale(1.01);-moz-transform:scale(1.01);-ms-transform:scale(1.01);-o-transform:scale(1.01);transform:scale(1.01)}.home[posts] .summary .single-title{font-size:1.25rem;line-height:140%;margin:0.4rem 0}.home[posts] .summary .content{display:-moz-box;display:-webkit-box;display:box;-webkit-box-orient:vertical;-moz-box-orient:vertical;box-orient:vertical;-webkit-line-clamp:3;margin-top:.3rem;width:100%;overflow:hidden;text-overflow:ellipsis;word-wrap:break-word;overflow-wrap:break-word;color:#a9a9b3}[theme=dark] .home[posts] .summary .content{color:#5d5d5f}.home[posts] .summary .content h2,.home[posts] .summary .content h3,.home[posts] .summary .content h4,.home[posts] .summary .content h5,.home[posts] .summary .content h6,.home[posts] .summary .content p{font-size:1rem;line-height:1.5;display:inline}.home[posts] .summary .content h2::after,.home[posts] .summary .content h3::after,.home[posts] .summary .content h4::after,.home[posts] .summary .content h5::after,.home[posts] .summary .content h6::after,.home[posts] .summary .content p::after{content:"\A";white-space:pre}.home[posts] .summary .content h2{font-size:1.125rem}.home[posts] .summary .content a,.home[posts] .summary .content a::before,.home[posts] .summary .content a::after{text-decoration:none;color:#2d96bd}[theme=dark] .home[posts] .summary .content a,[theme=dark] .home[posts] .summary .content a::before,[theme=dark] .home[posts] .summary .content a::after{color:#a9a9b3}.home[posts] .summary .content a:active,.home[posts] .summary .content a:hover{color:#ef3982}[theme=dark] .home[posts] .summary .content a:active,[theme=dark] .home[posts] .summary .content a:hover{color:#fff}.home[posts] .summary .content b,.home[posts] .summary .content strong{color:#a9a9b3}[theme=dark] .home[posts] .summary .content b,[theme=dark] .home[posts] .summary .content strong{color:#5d5d5f}.home[posts] .summary .post-footer{margin-top:.4rem;display:flex;justify-content:space-between;align-items:center;font-size:.875rem}.home[posts] .summary .post-footer a,.home[posts] .summary .post-footer a::before,.home[posts] .summary .post-footer a::after{text-decoration:none;color:#2d96bd}[theme=dark] .home[posts] .summary .post-footer a,[theme=dark] .home[posts] .summary .post-footer a::before,[theme=dark] .home[posts] .summary .post-footer a::after{color:#55bde2}.home[posts] .summary .post-footer a:active,.home[posts] .summary .post-footer a:hover{color:#ef3982}[theme=dark] .home[posts] .summary .post-footer a:active,[theme=dark] .home[posts] .summary .post-footer a:hover{color:#bdebfc}.home[posts] .summary .post-footer .post-tags{padding:0}.home[posts] .summary .post-footer .post-tags a,.home[posts] .summary .post-footer .post-tags a::before,.home[posts] .summary .post-footer .post-tags a::after{text-decoration:none;color:#161209}[theme=dark] .home[posts] .summary .post-footer .post-tags a,[theme=dark] .home[posts] .summary .post-footer .post-tags a::before,[theme=dark] .home[posts] .summary .post-footer .post-tags a::after{color:#a9a9b3}.home[posts] .summary .post-footer .post-tags a:active,.home[posts] .summary .post-footer .post-tags a:hover{color:#2d96bd}[theme=dark] .home[posts] .summary .post-footer .post-tags a:active,[theme=dark] .home[posts] .summary .post-footer .post-tags a:hover{color:#fff}#content-404{font-size:1.8rem;line-height:3rem;-webkit-transform:translateY(30vh);-moz-transform:translateY(30vh);-ms-transform:translateY(30vh);-o-transform:translateY(30vh);transform:translateY(30vh);text-align:center}header{width:100%;z-index:150;background-color:#f8f8f8;-webkit-transition:box-shadow 0.3s ease;-moz-transition:box-shadow 0.3s ease;-o-transition:box-shadow 0.3s ease;transition:box-shadow 0.3s ease}[theme=dark] header{background-color:#252627}header .logo{min-height:1.5em;height:1.5em;vertical-align:text-bottom}header .logo,header .header-title-pre{padding-right:.25rem}header .header-title-post{padding-left:.25rem}header:hover{-webkit-box-shadow:0 0 1.5rem 0 rgba(0,0,0,0.1);box-shadow:0 0 1.5rem 0 rgba(0,0,0,0.1)}.header-wrapper{display:flex;justify-content:space-between;align-items:center;box-sizing:border-box;width:100%}.header-title{font-family:system-ui,-apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei UI,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:bold;margin-right:.5rem;min-width:10%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-webkit-flex:10;flex:10}.menu .menu-item{position:relative}.language-select{position:absolute;opacity:0;left:0;top:0;width:100%;height:100%}.language-select:hover{cursor:pointer}.search{position:relative}.search input{color:transparent;box-sizing:border-box;height:2.5rem;width:2.5rem;-webkit-border-radius:.5rem;-moz-border-radius:.5rem;border-radius:.5rem;border:none;outline:none;background-color:#f8f8f8;vertical-align:baseline !important;-webkit-transition:width 0.3s ease;-moz-transition:width 0.3s ease;-o-transition:width 0.3s ease;transition:width 0.3s ease}[theme=dark] .search input{background-color:#252627}.search input::-webkit-input-placeholder{color:rgba(0,0,0,0)}.search input:-moz-placeholder{color:rgba(0,0,0,0)}.search input::-moz-placeholder{color:rgba(0,0,0,0)}.search input:-ms-input-placeholder{color:rgba(0,0,0,0)}.search input::placeholder{color:rgba(0,0,0,0)}.search .search-button{margin:0;position:absolute;left:auto;right:1rem}.search .search-toggle{left:.5rem;right:auto}.search .search-loading{display:none}.search .search-clear{display:none}.open .search input,.search.mobile input{color:#161209;background-color:#e9e9e9;padding:0 2rem 0 2rem}[theme=dark] .open .search input,[theme=dark] .search.mobile input{color:#a9a9b3;background-color:#363636}[theme=dark] .open .search input::-webkit-input-placeholder,[theme=dark] .search.mobile input::-webkit-input-placeholder{color:#5d5d5f}[theme=dark] .open .search input:-moz-placeholder,[theme=dark] .search.mobile input:-moz-placeholder{color:#5d5d5f}[theme=dark] .open .search input::-moz-placeholder,[theme=dark] .search.mobile input::-moz-placeholder{color:#5d5d5f}[theme=dark] .open .search input:-ms-input-placeholder,[theme=dark] .search.mobile input:-ms-input-placeholder{color:#5d5d5f}[theme=dark] .open .search input::placeholder,[theme=dark] .search.mobile input::placeholder{color:#5d5d5f}.open .search input::-webkit-input-placeholder,.search.mobile input::-webkit-input-placeholder{color:#a9a9b3}.open .search input:-moz-placeholder,.search.mobile input:-moz-placeholder{color:#a9a9b3}.open .search input::-moz-placeholder,.search.mobile input::-moz-placeholder{color:#a9a9b3}.open .search input:-ms-input-placeholder,.search.mobile input:-ms-input-placeholder{color:#a9a9b3}.open .search input::placeholder,.search.mobile input::placeholder{color:#a9a9b3}.open .search .search-button,.search.mobile .search-button{color:#a9a9b3}[theme=dark] .open .search .search-button,[theme=dark] .search.mobile .search-button{color:#5d5d5f}.open .search .search-clear:hover,.search.mobile .search-clear:hover{color:#ff6b6b}.open .search .search-toggle:hover,.search.mobile .search-toggle:hover{cursor:default}.theme-switch i{-webkit-transform:rotate(225deg);-moz-transform:rotate(225deg);-ms-transform:rotate(225deg);-o-transform:rotate(225deg);transform:rotate(225deg)}#header-desktop{display:block;position:fixed;height:3.5rem;line-height:3.5rem}[header-desktop=normal] #header-desktop{position:static}#header-desktop .header-wrapper{padding:0 2rem 0 10vh}#header-desktop .header-wrapper .header-title{font-size:1.5rem}#header-desktop .header-wrapper .menu{overflow:hidden;white-space:nowrap}#header-desktop .header-wrapper .menu .menu-inner{float:right}#header-desktop .header-wrapper .menu .menu-item{margin:0 .5rem}#header-desktop .header-wrapper .menu .menu-item.delimiter{border-left:1.5px solid #161209}[theme=dark] #header-desktop .header-wrapper .menu .menu-item.delimiter{border-left-color:#363636}#header-desktop .header-wrapper .menu .menu-item.language{margin-right:0}#header-desktop .header-wrapper .menu .menu-item.search{margin:0 -.5rem 0 0}#header-desktop .header-wrapper .menu a.active{font-weight:900;color:#161209}[theme=dark] #header-desktop .header-wrapper .menu a.active{color:#fff}#header-desktop.open .header-wrapper .menu .menu-item.search{margin:0 .25rem 0 .5rem}#header-desktop.open .header-wrapper .menu .menu-item.search input{width:24rem}#header-mobile{display:none;position:fixed;height:3.5rem;line-height:3.5rem}[header-mobile=normal] #header-mobile{position:static}#header-mobile .header-container{padding:0;margin:0}#header-mobile .header-container .header-wrapper{padding:0 1rem;font-size:1.125rem;-webkit-transition:margin-top 0.3s ease;-moz-transition:margin-top 0.3s ease;-o-transition:margin-top 0.3s ease;transition:margin-top 0.3s ease}#header-mobile .header-container .header-wrapper .header-title{font-size:1.5rem;max-width:80%}#header-mobile .header-container .header-wrapper .menu-toggle{line-height:4rem;cursor:pointer;-webkit-transition:width 0.3s ease;-moz-transition:width 0.3s ease;-o-transition:width 0.3s ease;transition:width 0.3s ease}#header-mobile .header-container .header-wrapper .menu-toggle span{display:block;background:#161209;width:1.5rem;height:2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-transition:all 0.3s ease-in-out;-moz-transition:all 0.3s ease-in-out;-o-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}[theme=dark] #header-mobile .header-container .header-wrapper .menu-toggle span{background:#a9a9b3}#header-mobile .header-container .header-wrapper .menu-toggle span:nth-child(1){margin-bottom:.5rem}#header-mobile .header-container .header-wrapper .menu-toggle span:nth-child(3){margin-top:.5rem}#header-mobile .header-container .header-wrapper .menu-toggle.active span:nth-child(1){-webkit-transform:rotate(45deg) translate(0.4rem, 0.5rem);-moz-transform:rotate(45deg) translate(0.4rem, 0.5rem);-ms-transform:rotate(45deg) translate(0.4rem, 0.5rem);-o-transform:rotate(45deg) translate(0.4rem, 0.5rem);transform:rotate(45deg) translate(0.4rem, 0.5rem)}#header-mobile .header-container .header-wrapper .menu-toggle.active span:nth-child(2){opacity:0}#header-mobile .header-container .header-wrapper .menu-toggle.active span:nth-child(3){-webkit-transform:rotate(-45deg) translate(0.4rem, -0.5rem);-moz-transform:rotate(-45deg) translate(0.4rem, -0.5rem);-ms-transform:rotate(-45deg) translate(0.4rem, -0.5rem);-o-transform:rotate(-45deg) translate(0.4rem, -0.5rem);transform:rotate(-45deg) translate(0.4rem, -0.5rem)}#header-mobile .header-container .menu{text-align:center;background:#f8f8f8;border-top:2px solid #f0f0f0;display:none;padding-top:.5rem;-webkit-box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.1);box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.1)}#header-mobile .header-container .menu .search-wrapper{display:flex;justify-content:space-between;align-items:center;box-sizing:border-box;padding:.5rem 1rem;line-height:2.5rem}#header-mobile .header-container .menu .search{flex-grow:10}#header-mobile .header-container .menu .search .algolia-autocomplete,#header-mobile .header-container .menu .search input{width:100%}#header-mobile .header-container .menu .search-button{top:0}#header-mobile .header-container .menu .search-cancel{display:none;margin-left:.75rem}#header-mobile .header-container .menu .menu-item{display:block;line-height:2.5rem}#header-mobile .header-container .menu.active{display:block}[theme=dark] #header-mobile .header-container .menu{background:#252627;border-top-color:#363636}#header-mobile.open .header-wrapper{margin-top:-3.5rem}#header-mobile.open .menu{padding-top:0;border-top:none}#header-mobile.open .menu .menu-item{display:none}#header-mobile.open .menu .search-cancel{display:inline}.search-dropdown{position:fixed;z-index:200;top:3.5rem;-webkit-box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.1);box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.1)}.search-dropdown.desktop{right:2rem;width:30rem}.search-dropdown.mobile{right:0;width:100%}.search-dropdown .dropdown-menu{right:0 !important;background-color:#fff}[theme=dark] .search-dropdown .dropdown-menu{background-color:#292a2d}.search-dropdown .dropdown-menu .suggestions{overflow-y:auto;max-height:calc(100vh - 3.5rem)}.search-dropdown .dropdown-menu .suggestions .suggestion{padding:.75rem 1rem}.search-dropdown .dropdown-menu .suggestions .suggestion .suggestion-title{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1rem;font-weight:bold;max-width:75%}.search-dropdown .dropdown-menu .suggestions .suggestion .suggestion-date{font-size:.875rem;float:right;text-align:right;color:#a9a9b3}[theme=dark] .search-dropdown .dropdown-menu .suggestions .suggestion .suggestion-date{color:#5d5d5f}.search-dropdown .dropdown-menu .suggestions .suggestion .suggestion-context{line-height:1.25rem;display:-moz-box;display:-webkit-box;display:box;-webkit-box-orient:vertical;-moz-box-orient:vertical;box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;word-wrap:break-word;overflow-wrap:break-word;color:#a9a9b3}[theme=dark] .search-dropdown .dropdown-menu .suggestions .suggestion .suggestion-context{color:#5d5d5f}.search-dropdown .dropdown-menu .suggestions .suggestion em{font-style:normal;background-color:rgba(53,166,247,0.25)}[theme=dark] .search-dropdown .dropdown-menu .suggestions .suggestion em{background-color:rgba(50,112,194,0.4)}.search-dropdown .dropdown-menu .suggestions .suggestion.cursor{background:#e8e8e8}[theme=dark] .search-dropdown .dropdown-menu .suggestions .suggestion.cursor{background:#323843}.search-dropdown .dropdown-menu .suggestions .suggestion:hover{cursor:pointer}.search-dropdown .dropdown-menu .search-empty{padding:1rem;text-align:center}.search-dropdown .dropdown-menu .search-empty .search-query{font-weight:bold}[theme=dark] .search-dropdown .dropdown-menu .search-empty .search-query{color:#ddd}.search-dropdown .dropdown-menu .search-footer{padding:.5rem 1rem;float:right;font-size:.8rem;color:#a9a9b3}.search-dropdown .dropdown-menu .search-footer [theme=dark]{color:#5d5d5f}.search-dropdown .dropdown-menu .search-footer a,.search-dropdown .dropdown-menu .search-footer a::before,.search-dropdown .dropdown-menu .search-footer a::after{text-decoration:none;color:#2d96bd}[theme=dark] .search-dropdown .dropdown-menu .search-footer a,[theme=dark] .search-dropdown .dropdown-menu .search-footer a::before,[theme=dark] .search-dropdown .dropdown-menu .search-footer a::after{color:#55bde2}.search-dropdown .dropdown-menu .search-footer a:active,.search-dropdown .dropdown-menu .search-footer a:hover{color:#ef3982}[theme=dark] .search-dropdown .dropdown-menu .search-footer a:active,[theme=dark] .search-dropdown .dropdown-menu .search-footer a:hover{color:#bdebfc}.search-dropdown .dropdown-menu .search-footer a{font-size:1rem}footer{height:2rem;width:100%;text-align:center;line-height:1.25rem;padding:1rem 0}footer .footer-container{font-size:.875rem}footer .footer-container .footer-line{width:100%}footer .footer-container .footer-line .icp-br{display:none}.blur footer{-webkit-filter:blur(1.5px);-moz-filter:blur(1.5px);-ms-filter:blur(1.5px);filter:blur(1.5px)}.pagination{display:flex;flex-direction:row;justify-content:center;list-style:none;white-space:nowrap;width:100%;padding:1rem 0 0}.pagination a{font-size:.8rem;color:#bfbfbf;letter-spacing:.1rem;font-weight:700;padding:5px 5px;text-decoration:none;-webkit-transition:0.3s;-moz-transition:0.3s;-o-transition:0.3s;transition:0.3s}.pagination li{padding-bottom:3px;margin:0 20px;box-sizing:border-box;position:relative;display:inline}.pagination li.disabled{display:none}.pagination li:hover a{color:#000}[theme=dark] .pagination li:hover a{color:#fff}.pagination li:before,.pagination li:after{position:absolute;content:"";width:0;height:3px;background:#000;-webkit-transition:0.3s;-moz-transition:0.3s;-o-transition:0.3s;transition:0.3s;bottom:0px}[theme=dark] .pagination li:before,[theme=dark] .pagination li:after{background:#fff}.pagination li:before .active,.pagination li:after .active{width:100%}.pagination li:before{left:50%}.pagination li:after{right:50%}.pagination li:hover:before,.pagination li:hover:after{width:50%}.pagination li.active a{color:#000}[theme=dark] .pagination li.active a{color:#fff}.pagination li.active:before,.pagination li.active:after{width:60%}@media only screen and (max-width: 1440px){.page{width:56%}}@media only screen and (max-width: 1200px){.page{width:52%}#header-desktop .header-wrapper{padding-right:1rem}.search-dropdown.desktop{right:1rem}}@media only screen and (max-width: 960px){#toc-auto{display:none}#toc-static{display:block}.page{width:80%}#header-desktop .header-wrapper{padding-left:1rem}}@media only screen and (max-width: 680px){#header-desktop{display:none}#header-mobile{display:block}body.blur{overflow:hidden}.page{width:100%}[header-mobile] .page{padding-top:3.5rem}[header-mobile=normal] .page{padding-top:0}.page .categories-card .card-item{width:100%}.copyright .copyright-line .icp-splitter{display:none}.copyright .copyright-line .icp-br{display:block}} - -/*# sourceMappingURL=style.min.css.map */ \ No newline at end of file diff --git a/resources/_gen/assets/scss/css/style.scss_d75fd08668b4bae707167bbce4d8ca46.json b/resources/_gen/assets/scss/css/style.scss_d75fd08668b4bae707167bbce4d8ca46.json deleted file mode 100644 index 0095485..0000000 --- a/resources/_gen/assets/scss/css/style.scss_d75fd08668b4bae707167bbce4d8ca46.json +++ /dev/null @@ -1 +0,0 @@ -{"Target":"css/style.min.css","MediaType":"text/css","Data":{}} \ No newline at end of file diff --git a/themes/LoveIt b/themes/LoveIt index e9e89a4..c8b6512 160000 --- a/themes/LoveIt +++ b/themes/LoveIt @@ -1 +1 @@ -Subproject commit e9e89a4613baee823596822b7d246f5931263491 +Subproject commit c8b6512799a773d67744d74511ec3a5e64a209a3